我在一个方法中创建了一个对象,我想在同一个类的另一个方法中进一步处理它。
我试过这样,但$ obj没有传递给方法二():
class SomeClass {
public static function one($id)
{
$obj = new self();
$obj->id = $id;
//...
return $obj;
}
public function two()
{
$obj->id = 2;
return $obj;
}
}
$obj = SomeClass::one($id)->two();
有没有办法实现这个目标?
我找到了这个帖子How to chain method on a newly created object?,但目前还不是很清楚这是否可行。
答案 0 :(得分:2)
two
是一种静态方法。您试图在实例上调用它,并且根据定义静态方法不适用于特定实例。
使方法不静态,并操纵$this
而不是$obj
。
答案 1 :(得分:1)
如果我没有误解你正在尝试做什么,如果你没有使第二个方法静态,你可以返回一个对象,它将在链接的调用中以$ this传入;
class SomeClass {
public $id = 0;
public static function one($id)
{
$obj = new self(); // Create and return new object
$obj->id = $id;
return $obj;
}
public function two()
{
$this->id = 3; // The new object is $this here
return $this;
}
}
$obj = SomeClass::one(5)->two();
答案 2 :(得分:0)
方法链接只在使用setter时才有意义。 结合PHPDoc,大多数IDE(如NetBeans)将再次支持代码完成/自动完成功能。
ps请注意,方法链接可以让您更多机会出现错误,例如PHP致命错误:调用成员函数....在非对象中...当混合更多类时返回< /强>
class Example {
protected $var = null;
public function __construct() {
}
public function __destruct() {
unset($this->var); // explicit memory clearing
}
/**
* @return \Example
*/
public static function create() {
return new self();
}
/**
* @return \Example
*/
public static function getInstance() {
return self::create();
}
/**
* @return \Example
*/
public static function newInstance() {
return self::create();
}
/**
*
* @param mixed $var
* @return \Example
*/
public function setThing1($var) {
$this->var = $var;
return $this;
}
/**
*
* @param mixed $var
* @return \Example
*/
public function setThing2($var) {
$this->var = $var;
return $this;
}
}
Example::create()->setThing1(1)->setThing2('2');