Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php是uuu get()和uuu set()魔术的关键_Php_Oop - Fatal编程技术网

php是uuu get()和uuu set()魔术的关键

php是uuu get()和uuu set()魔术的关键,php,oop,Php,Oop,PHP5引入了神奇的方法_get()和_set()。根据我的理解,这是一条捷径,必须写下每个成员的getter和setter <?php class Person { private $firstname; private $lastname; function __set($var, $name) { $this->$var = $name; } function __get($var) { return

PHP5引入了神奇的方法_get()和_set()。根据我的理解,这是一条捷径,必须写下每个成员的getter和setter

 <?php
class Person {
    private $firstname;
    private $lastname;

    function __set($var, $name) {
        $this->$var = $name;
    }

    function __get($var) {
        return $this->$var;
    }
}

$person = new Person();
$person->firstname = "Tom";
$person->lastname = "Brady";


echo $person->firstname . " " . $person->lastname;

// print: Tom Brady
?>

这不违背面向对象的原则吗?那么重点是什么呢?

首先,您的示例不应该起作用,因为您正在访问
$this->var

第二:是的,添加魔术二传手和接球手就像添加二传手和接球手一样。只是魔术


_uuuset和uuu get有很多用途:如果您正在构建一个库,比如ORM,它可能会派上用场。此外,它还可以用作穷人的财产:如果您最初公开了一个字段,现在可以在uu set和u get中添加行为,就像它总是在那里一样(例如验证)。

在您的示例中,这与公开字段是一样的。但是,您的_集和_get函数不必处理所有变量。(可能使用switch语句来决定要处理的对象。)此外,还可以对_集的参数执行数据验证,或者为根本不存在的_get计算返回值


刚刚注意到您在代码中使用了$this->var而不是$this->$var(我认为这是您希望代码正常工作的目的)

需要理解的是,“OOP原则”并不是一成不变的。 它们更像是经验法则

例如,在python中,所有成员变量都是公共的。没有真正的私有变量

<?php
class Person {
    private $_firstname;
    private $_lastname;

    function __set($name, $value) {
        if (!strpos('_', $name) === 0) {
            $this->$name = $value;
        } else {
            throw new Exception ("trying to assign a private variable");
        }
    }

    function __get($name) {
        if (!strpos('_', $name) === 0) {
            retrun $this->$name;
        } else {
            throw new Exception ("trying to read a private variable");
        }
    }
}

?>
在Smalltalk中,所有变量都是私有的,如果要提供对需要getter的变量的访问,则不存在公共变量。事实上,这里正是能手和二传手练习的发源地

因此,php中神奇的getter和setter在许多情况下都很有用。 例如:

  • 奥马普斯
  • 构建要发送到外部API的对象时
  • 当您想要识别访问变量的人时
  • 等等
现在,如果您想保留私有变量,并且仍然使用神奇的getter和setter 同样,对于应用程序的特定情况,您可以修改代码 要对私有变量使用“u”下划线约定,请执行以下操作

<?php
class Person {
    private $_firstname;
    private $_lastname;

    function __set($name, $value) {
        if (!strpos('_', $name) === 0) {
            $this->$name = $value;
        } else {
            throw new Exception ("trying to assign a private variable");
        }
    }

    function __get($name) {
        if (!strpos('_', $name) === 0) {
            retrun $this->$name;
        } else {
            throw new Exception ("trying to read a private variable");
        }
    }
}

?>


本页提供了一些有用的示例:thx。。我将代码更改为$this->$var。这可能是很难调试的代码。