php对象中的嵌套方法

php对象中的嵌套方法,php,Php,我怎样才能创造出这样的东西 MyObject->property->method() 在PHP中 我只知道如何为类创建方法: class MyObject { public function MyMethod() { // do something } } 在Javascript中,我可以轻松地执行以下操作 var MyObject = { property : { method : function () {

我怎样才能创造出这样的东西

MyObject->property->method()

在PHP中

我只知道如何为类创建方法:

class MyObject
{
    public function MyMethod()
    {
       // do something
    }
}
在Javascript中,我可以轻松地执行以下操作

var MyObject = {
   property : {
     method : function ()
              {
                 // do something
              }
   }
}

如何做到这一点?

在Javascript中,您可以内联创建对象和方法,在PHP中,您需要有一个
并实例化它:

class Foo {

    public function method() {}

}

class MyObject {

    public $property;

    public function __construct() {
        $this->property = new Foo;
    }

}

$o = new MyObject;
$o->property->method();

在Javascript中,您可以内联创建对象和方法,而在PHP中,您需要有一个
,并对其进行实例化:

class Foo {

    public function method() {}

}

class MyObject {

    public $property;

    public function __construct() {
        $this->property = new Foo;
    }

}

$o = new MyObject;
$o->property->method();

可以将对象设置为特性的值。大概是这样的:

class Foo {
   public $Bar;

   public function __construct() {
       $this->Bar = new Bar(); 
   }
} 

class Bar {

   public function ShowBar() {
       echo 'Bar';
   }   

}

$Foo = new Foo();
$Foor->Bar->ShowBar();

可以将对象设置为特性的值。大概是这样的:

class Foo {
   public $Bar;

   public function __construct() {
       $this->Bar = new Bar(); 
   }
} 

class Bar {

   public function ShowBar() {
       echo 'Bar';
   }   

}

$Foo = new Foo();
$Foor->Bar->ShowBar();

正如其他人正确回答的那样,这在PHP和Javascript中的工作方式不同。这些差异也是为什么在PHP中需要在运行类方法之前定义它们的原因。将来它可能会变得更具动态性,但我肯定不是在Javascript级别

但是,您可以在PHP中对此稍加伪装,因为您可以动态地将函数分配给属性:

$myObject = new PropCall;
$myObject->property->method = function() {
    echo "hello world\n";
};    

$myObject->property->method();
此示例输出:

hello world
这确实有效,因为在实例化对象中添加了一些小魔术:

class PropCall
{
    public function __call($name, $args) {
        if (!isset($this->$name)) {
            return null; // or error handle
        }
        return call_user_func_array($this->$name, $args);
    }

    public function __get($name) {
        $this->$name = new PropCall;
        return $this->$name;
    }
}

这个类代码检查是否添加了一个带有被调用方法名称的动态属性,然后将该属性作为函数调用。

正如其他人正确回答的那样,这在PHP和Javascript中的工作方式不同。这些差异也是为什么在PHP中需要在运行类方法之前定义它们的原因。将来它可能会变得更具动态性,但我肯定不是在Javascript级别

但是,您可以在PHP中对此稍加伪装,因为您可以动态地将函数分配给属性:

$myObject = new PropCall;
$myObject->property->method = function() {
    echo "hello world\n";
};    

$myObject->property->method();
此示例输出:

hello world
这确实有效,因为在实例化对象中添加了一些小魔术:

class PropCall
{
    public function __call($name, $args) {
        if (!isset($this->$name)) {
            return null; // or error handle
        }
        return call_user_func_array($this->$name, $args);
    }

    public function __get($name) {
        $this->$name = new PropCall;
        return $this->$name;
    }
}

此类代码检查是否添加了具有所调用方法名称的动态属性,然后仅将该属性作为函数调用。

不能对属性调用方法。您可以使用
$this->property
访问它,但不能对属性调用方法。您可以使用
$this->property
访问它,非常整洁,即:)非常整洁,即:)