我是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()魔术方法的注释中有什么意义呢?
答案 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为什么要谨慎。
的答案此外,请看一下这个主题(魔术方法)http://culttt.com/2014/04/16/php-magic-methods/