第三部分可以是什么 - >链接序列?

时间:2017-09-19 16:03:28

标签: php function class oop methods

我见过两个这样的人:

$this->propertyName;
$this->methodName();

我知道代码应该是这样的:

class myClass{

    public $propertyName;

    public function methodName(){
       // statements
    }
}

最近我看到了这样的代码:

$this->CI->form_validation->set_message('investigate', '{field} ' . lang('wrong'));

什么是CI (方法?)?什么是form_validation?什么是set_message?这些嵌套方法?它的代码如何?

3 个答案:

答案 0 :(得分:1)

方法可以返回一个对象。您可以将此对象分配给变量,然后在其上调用方法:

$objB = $objA->getObjectB();
$objB->someMethod();

或者您可以跳过作业并将其内联;

$objA->getObjectB()->someMethod();

只要您的方法返回对象,您就可以继续堆叠它们:

$objA->getObjectB()->getObjectC()->getObjectD()->getObjectE();

对象属性也是如此。公共财产可以容纳另一个对象:

$objA->objB = new objectB();
$objA->objB->someMethodOnObjectB();

因此,返回包含对象的对象和公共属性的方法可以像这样堆叠。你也可以混合它们:

$objA->getObjectB()->somePropertyOnObjectB->someMethod();

另见Fluent Interface。对象通常为mutator方法返回自己的实例。这允许你转过来:

$obj = new Object();
$obj->setFoo('foo');
$obj->setBar('bar');
$obj->setBaz('baz');
$obj->doSomething();

进入这个:

$obj = new Object();
$obj->setFoo('foo')->setBar('bar')->setBaz('baz')->doSomething();

在PHP 5.6+中,您甚至不必将对象分配给变量,您可以直接取消引用new调用:

(new Object())->setFoo('foo')->setBar('bar')->setBaz('baz')->doSomething();

答案 1 :(得分:0)

CIobject。在这个确切的上下文中,它是一个类属性,对象类型。从理论上讲,您可能还有一个返回对象的方法/函数。类似的东西:

$ClassInstance->MethodThatReturnAnObject()->ObjectProperty = 'bla';

甚至

$ClassInstance->MethodThatReturnAnObject()->ObjectMethod();

链条可能会继续更多层次。

答案 2 :(得分:0)

CI $ this 对象中的属性, form_validation CI 内的另一个对象 > set_message form_validation

内的方法
<?php
class FormValidation
{
    public function set_message($message)
    {
        echo $message;
    }
}

class CI
{
    public $form_validation;

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

class MyClass
{
    public $CI;

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

    public function doSomeStuff()
    {
        $this->CI->form_validation->set_message('my custom message');
    }
}

$object = new MyClass();
$object->doSomeStuff();