【问题标题】:What can the third section be in -> chaining sequence?第三部分可以在 -> 链接顺序中是什么?
【发布时间】:2017-09-19 16:03:28
【问题描述】:

我见过两个这样的:

$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 是什么?这些是嵌套方法吗?它的代码是什么样子的?

【问题讨论】:

  • “什么是 CI(一种方法?)?” - 很可能是 CodeIgniter,如果这就是您要问的。您需要阅读文档。
  • 它们不是方法。没有括号的任何东西都只是一个属性,并且该属性很可能是此示例中的一个对象,因为您可以使用另一个 -> 调用该对象的属性/方法。只有对 set_message 的调用是方法调用。它是相当基本的 PHP 语法,类似于您可以在其他语言中找到的 OO 语法。在 C# 中,它可能看起来像 this.CI.form_validation.setMessage(

标签: php function class oop methods


【解决方案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();

【讨论】:

    【解决方案2】:

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

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

    甚至

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

    而且这个链条可能会继续更多的关卡。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-11
      • 1970-01-01
      相关资源
      最近更新 更多