Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何访问没有括号的php闭包_Php - Fatal编程技术网

如何访问没有括号的php闭包

如何访问没有括号的php闭包,php,Php,我有一个班级应用程序 <?php namespace App; class App { private $data = array(); public function __set($name, $value) { $this->data[$name] = $value; } public function __get($name) { if (array_key_exists($name, $thi

我有一个班级应用程序

<?php
namespace App;
class App
{
    private $data = array();

    public function __set($name, $value)
    {
        $this->data[$name] = $value;
    }

    public function __get($name)
    {
        if (array_key_exists($name, $this->data)) {
            return $this->data[$name];
        }
    }


}
?>

还有一个页面index.php

<?php
require 'vendor/autoload.php';
require 'app/app.php';
use App\App;
use Illuminate\Database\Capsule\Manager as Capsule;
$App = new App;
var_dump($App->db);
$App->db=function (){
return new Capsule;
};
var_dump($App->db);
$App->db->addConnection([
    'driver'    => 'mysql',
    'host'      => 'localhost',
    'database'  => 'ides_new',
    'username'  => 'root',
    'password'  => '',
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
]);

?>

现在我想访问胶囊对象,如“$App->db”
我怎样才能做到这一点。

我创建了一个简单的示例,适用于您的情况:

<?php
class App
{
    private $data = array();
    public $otherClass;                 // <-- Create a public variable
}
class OtherClass {
    public function foo() {
        return "bar";
    }
}


$App = new App();
$App->otherClass = new OtherClass();

var_dump($App->otherClass->foo());

?>

然而,这种方式的整个构造有些不正确(可能不方便)。您很可能应该使用“”,而不是直接将其设置为变量。类似的东西在语义上更为正确:

<?php
class App
{
    private $data = array();
    public $otherClass;

    function __construct(OtherClass $otherClass) {
        $this->otherClass = $otherClass;
    }
}
class OtherClass {
    public function foo() {
        return "bar";
    }
}

$otherClass = new OtherClass();

$App = new App($otherClass);

var_dump($App->otherClass->foo());

?>

如果您想访问通过调用闭包创建的新对象,您需要这样做:

$App->db->__invoke()->addConnection(...);
注意每次调用它时,它都将是一个新对象。 我宁愿直接将对象分配给变量

学分:
编辑我不明白原来的问题。这里有一个更新

我在您的类中添加了一个“invokationData”数组。现在,所有正常数据都从数据返回,但如果对应的条目是闭包,则首先调用它,结果存储在invokationData数组中,然后返回该数组

<?php
namespace App;
class App
{
    private $data = array();
    private $invokationData = array();

    public function __set($name, $value)
    {
        $this->data[$name] = $value;
       if (is_callable($this->data[$name]) && array_key_exists($name, $this->invokationData) {
            unset($this->invokationData[$name]); //Clear result of old function
       }
    }

    public function __get($name)
    {
        if (array_key_exists($name, $this->data) && is_callable($this->data[$name]) && !array_key_exists($name, $this->invokationData)) {
            $this->invokationData[$name] = call_user_func($this->data[$name];
        }
        if (array_key_exists($name, $this->invokationData)) {
            return $this->invokationData[$name];
        } elseif (array_key_exists($name, $this->data)) {
            return $this->data[$name];
        } 

    }


}

我看到两个可以调用的函数。我没有看到db函数?db应该从哪里来?$App->db属性是使用php神奇的方法uuu get()和uuu set()创建的,为什么不直接执行
$App->db=new Capsule()?此外,我想你忘了在
新胶囊后加括号了
@AlessandroNiciforo括号是不需要的,因为我想创建像Eyes这样的功能,你是对的,但我知道这个概念,但我想解决像使“一个类的动态属性作为另一个类的对象”这样的问题,$db=function(){return new db;}然后我想像这样访问$db->something();不像$db()->什么的
use App\App;
use Illuminate\Database\Capsule\Manager as Capsule;
$App = new App;
var_dump($App->db);
$App->db = function () { return new Capsule; }
var_dump($App->db);
$App->db->addConnection([
    'driver'    => 'mysql',
    'host'      => 'localhost',
    'database'  => 'ides_new',
    'username'  => 'root',
    'password'  => '',
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
]);