PHP OOP,$ this-> var-> method()?

时间:2012-02-15 09:21:29

标签: php oop

典型的使用方式:

<?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();

为什么这有用?

2 个答案:

答案 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();

  }
 }