典型的使用方式:
<?php
class A {
public $var;
public function __construct($var){
$this->var = $var;
}
public function do_print(){
print $this->var;
}
}
?>
$obj = new A('Test');
$obj->do_print(); // Test
我如何实现以下内容:
$obj->var->method();
为什么这有用?
答案 0 :(得分:5)
通过使var
成为另一个类的对象,您可以将方法调用链接到另一个类。
<?php
class Foo {
public $bar;
public function __construct(Bar $bar) {
$this->bar= $bar;
}
}
class Bar {
private $name;
public function __construct($name) {
$this->name = $name;
}
public function printName() {
echo $this->name;
}
}
$bar = new Bar('Bar');
$bar2 = new Bar('Bar2');
$foo = new Foo($bar);
$foo->bar->printName(); // Will print 'Bar';
$bar2->printName(); // Will print 'Bar2'
您可以将此用于Dependency Injection
等整洁的事情此外,可能使您的代码更易于阅读和理解,因为您在调用其方法之前不必使用缓冲区变量,并且可以在之后调用一个方法另一个。
看看这个例子:
$obj = new MyObject();
$db = $obj->getDb();
$con = $db->getCon();
$stat = $con->getStat();
使用方法链接可以这样写:
$obj = new Object();
$stat = $obj->getDB()->getCon()->getStat();
但是,这也很难调试,因为如果这些方法中的任何一个抛出异常,你只需得到链所在的行号,这可能是一个很大的问题。
所以,总有两面。这只是另一种编程风格。
请确保不在一行中链接太长时间,因为肯定会丢失概述。
<强> BAD 强>
$obj->meth('1', $arg2, array('arg2'))->method2($whaterver, array('text' => $bla_text))->andSoOn();
不可强>
$obj->meth('1', $arg2, array('arg2'))
->method2($whaterver, array('text' => $bla_text))
->andSoOn();
答案 1 :(得分:2)
你的课程可能很复杂,就像一个有地址的人(就像另一个班级公司可以拥有一个)。 Adress本身就是一个类,所以你想打电话
$person->adress->makeLabel();
或
$company->adress->makeLabel():
您可以通过在个人(或公司)类中创建对象来实现此目的,就像var:
一样Class Person{
public $address;
public function __construct(){
$this->address = new address();
}
}