返回值__set()是忽略&是什么意思在链接赋值中从不调用__get()?

时间:2017-09-16 01:29:55

标签: php oop overloading

我是OOP PHP的新手并从php.net学习它。该页面上有一个注意http://php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.members),其中包含:

  

由于PHP处理赋值运算符的方式,忽略__set()的返回值。类似地,在将分配链接在一起时,永远不会调用__get():    $ a = $ obj-> b = 8;

让我很困惑。谁能说明__set()和__get()魔术方法的注释中有什么意义呢?

2 个答案:

答案 0 :(得分:1)

声明

$a = $obj->b = 8;

如果使用 __ set 为$ obj-> b分配值,或使用 __ get 检索,则不会返回分配的值以用于$ a。

但是,如果$ obj-> b是 public 属性并且是直接分配的,则该语句将按预期运行,$ a将被赋予与属性$ b相同的值。

很多时候,如果要将几个变量初始化为相同的值,您可以选择像这样编码:

$i = $j = 0;

如果你使用的是 __ set __ get ,那么请注意,你不能这样做。

__ set __ get 会产生开销。大多数时间属性都是使用显式set和get函数设置和检索的,例如:

public function setB($b) {
   $this->b = $b;
   return $this;
}

public function getB() {
   return $this->b;
}

比较几种方法的代码:

<?php

// Magic methods to access private properties
Class A {
    private $properties = [];
    public function __set($key,$value) {
        $this->properties[$key] = $value;
    }
    public function __get($key) {
        return isset($this->properties[$key]) ? $this->properties[$key] : null;
    }
}

// Direct access to a public property
Class B {
    public $b;
}

// Set/get access to a private property
// This is the most common approach
Class C {
    private $b;
    public function setB($b) {
        $this->b = $b;
    }
    public function getB() {
        return $this->b;
    }
}

$a = new A();
$c = $a->b = 8;
var_dump($a,$c);

$b = new B();
$c = $b->b = 8;
var_dump($b,$c);

$c = new C();
$c->setB(8);
$d = $c->getB();
var_dump($c,$d);

答案 1 :(得分:0)

  

属性重载仅适用于对象上下文。这些魔术方法不会在静态上下文中触发。因此,不应将这些方法声明为静态。从PHP 5.3.0开始,如果其中一个魔术重载方法被声明为静态,则会发出警告   http://php.net/manual/en/language.oop5.overloading.php#object.set

     

静态方法http://de2.php.net/manual/en/language.oop5.static.php   因为静态方法可以在没有创建对象实例的情况下调用,所以伪变量$ this在声明为static的方法中不可用。   警告:在PHP 5中,静态调用非静态方法会生成E_STRICT级别警告。   警告:在PHP 7中,不推荐静态调用非静态方法,并将生成E_DEPRECATED警告。将来可能会删除对静态调用非静态方法的支持。

http://de2.php.net/manual/en/language.oop5.static.php

你可以理解Object&amp;来自链接的静态上下文以及php为什么要谨慎。

此链接将为您提供相同问题https://softwareengineering.stackexchange.com/questions/140679/why-is-there-no-facility-to-overload-static-properties-in-php

的答案

此外,请看一下这个主题(魔术方法)http://culttt.com/2014/04/16/php-magic-methods/