【发布时间】:2017-11-05 05:08:00
【问题描述】:
我一直在阅读PHP magic methods 并试图更好地理解它们。从 PHP 手册中它指出:
重载方法在与尚未声明或在当前范围内不可见的属性或方法交互时被调用。
我已经阅读了“不是visible”的含义:
属性、方法或(自 PHP 7.1.0 起)常量的可见性可以通过在声明前加上关键字 public、protected 或 private 来定义。
所以考虑下面的类:
<?php
class MyClass{
private $x = 1;
protected $y = 2;
public $z = 3;
public __construct(){}
function __get($name){
switch(true){
case ($name == 'x'):
return 4;
case ($name == 'y'):
return 5;
case ($name == 'z'):
return 6;
case ($name == 'w'):
return 0;
}
}
function sum(){
return $this->x + $this->y + $this->z;
}
}
?>
那么考虑到上面关于“可见”和“范围”的 sn-ps,__get 魔术方法会在什么情况下被调用,什么时候不会?
如果我实例化一个新对象:$myclass = new MyClass(),$myclass->sum() 会返回 6 或 15 还是别的什么?
如果我调用$myclass->x、$myclass->y、$myclass->z,结果会是4、5 和3,因为x 和y 在技术上不“可见”?
我假设调用$myclass->w 将返回0 而不管范围如何,因为它一开始就没有被定义为类的属性,对吗?
【问题讨论】:
-
“公共函数 __construct(){}”。缺少
switch语句的结束}。而且用switch ($name) { case 'x': return 4; case 'y': return 5; }更清楚 -
这里有一个免费提示:不要使用魔法吸气剂和二传手。
标签: php oop scope magic-methods