函数__get()在PHP中没有任何效果

时间:2016-10-18 14:28:57

标签: php oop

所以我正在关注PHP中的OOP教程,并且不了解__get()函数的工作原理。这是代码:

<?php

class Animal{

    protected $name;
    protected $favorite_food;
    protected $sound;
    protected $id;

    public static $number_of_animals = 0;
    const PI = "3.14159";

    //function to return the name
    //encapsulation
    function getName(){

        //when you want to refer attribute in a class
        return $this->name;

    }

    //initialize things
    function __construct(){

        //generate random 100-10 
        $this->id = rand(1,10);
        echo $this->id ." has been assigned<br/>";

        //akses static attribute in a class
        Animal::$number_of_animals++;

    }

    //destruct the object
    function __destruct(){

        echo $this->name ." is being destroyed :(";

    }

    //getter : to get protected attribute of a function
    function __get($name){
        echo "Asked for " . $name . "<br/>";
        return $this->$name;
    }

    //setter : set the attribute to 
    function __set($name, $value){

        switch($name){

            case "name" :
                $this->name = $value;
                break;
            case "favorite_food" :
                $this->favorite_food = $value;
                break;
            case "sound" :
                $this->sound = $value;
                break;

            default :
                echo $name ."Name not found";
        }

        echo "Set " .$name. " to " .$value. "<br/>";
    }

    function run(){
        echo $this->name. " runs<br/>";
    }
}

class Dog extends Animal{

    function run(){
        echo $this->name. " runs like crazy<br/>";
    }   

}

$animal_one = new Animal();

$animal_one->name = " SPOT";
$animal_one->favorite_food = " MEAT";
$animal_one->sound = " RUFF";

echo $animal_one->name ." says". $animal_one->sound. " give me some " .$animal_one->favorite_food. " my id is " .$animal_one->id. " total animal is " .Animal::$number_of_animals. "<br/><br/>";

?>

输出将如下:

5 has been assigned
Set name to SPOT
Set favorite_food to MEAT
Set sound to RUFF
Asked for name
Asked for sound
Asked for favorite_food
Asked for id
SPOT says RUFF give me some MEAT my id is 5 total animal is 1

SPOT is being destroyed :(

当我尝试将__get()函数中的参数和值更改为$sound$favorite_food等其他属性时,它不会对输出进行任何更改。输出仍然相同。我不明白为什么我们应该只将它设置为$name

1 个答案:

答案 0 :(得分:2)

任何函数内部参数的名称仅为该函数的scoped,并且在其他任何地方都没有任何引用。

您可能会感到困惑,因为您的本地函数参数$name与其中一个类属性$this->name具有相同的名称

请注意,在__get方法中,$name是可以作为任何受保护/私有属性的替代变量,它在运行时动态评估:

$this->$name

与硬编码属性相反

$this->name

考虑这个例子:

class MyClass {
    protected $one  = 'first';
    protected $name = 'fred';

    public function __get(String $property){
        return $this->$property;
    }

    public function getOne(){
        return $this->one;
    }

    public function foo(String $variable_could_be_named_anything){
        return $variable_could_be_named_anything;
    }
}

$object = new MyClass;

echo $object->one; // first (using __get)
echo $object->getOne(); // first

$object->two = 'second'; // because this property isn't declared protected, accessed normally
echo $object->two; // second

$name = 'jon';
echo $object->name; // fred
echo $object->foo($name); // jon

echo $object->three; // PHP Notice:  Undefined property: MyClass::$three
$object->one = 'something'; // Fatal error:  Cannot access protected property