第七节:PHP魔术方法

PHP面向对象编程基础

PHP魔术方法,你可能会认为魔术方法就是我们目前所学到的方法,这并不完全正确,实际上,每个类都充满了“魔法”,等待着他们释放魔法的力量,这节课我将会给你们介绍其中一些。首先让我们看user类,现在魔术方法被无形地调用,导致我们经常忘记它们存在,没有错,但他们确实存在于那里。魔术方法顾名思义,魔法一样强大,每次使用都会令人困惑,明年你回来看你的代码时,你会恨自己,所以,注释下它们的使用情况。

记住:能力越大,责任就越大。现在你可能已经使用了一些魔术方法,你以前可能碰到过这个public function __construct(){//},它被称为构造函数,每次运行一个对象都会从这个类创建,和任何魔术方法一样,你就像从头开始创建构造函数一样,而在你的现实中,你只是迷上这个魔术方法。和其他魔术方法一样,构造函数有两个下划线,如果你在一个类中设置了一个构造函数,你可以用它来配置这个类,因为这就是它的用途。

PHP魔术方法-实例讲解

PHP魔术方法-实例讲解

PHP魔术方法-实例讲解

让我们来看看到底是什么意思?例如,我们可以在构造函数中传递用户的电子邮件地址和密码。我们在User.php让构造函数接受一个数组,这将是一个数组的可能值,我们只是称它们为$params,

现在我想我们应该让数组成为可选的,因为每当我实例化一个新用户时,我都不愿意强迫自己提供任何配置信息,但是我们会要求它是一个数组,绑在这里引脚(Array)将会处理这件事情,现在我们要做的下一件事是遍历该数组,但只有在数组实际包含项目的情况下,在User.php中添加下面代码:

在index.php中添加下面代码:

回到index.php我们看是否工作:

刷新浏览器的确输出正是我们想要的信息。所以,一个构造函数被用来在实例化配置一个对象,现在不要试图让它做任何实际的工作,因为这不是它的目的,它会使你的对象无法测试。现在这只是一种魔术方法,但是还有很多很多。他们每个人都被自动调用,你可以链接到它们。

现在让我们重新看看我们的邮箱地址和密码属性,这意味着你不能从index.php外面操作到它们:

回到浏览器,我们看到:

然而,使用魔术方法,我们觉得我们可以这样做,符合魔术方法设定,我们会在User.php这里挂上这个魔术方法__set

刷新index.php浏览器显示:

好了,如果我尝试设置一个不存在的属性叫nonexistent,看看index.php会发生什么:

浏览器访问index.php返回结果:

我们发现nonexistent实际上是被设置的,怎么去修复呢?回到User.php在__set函数创建一个if语句:

返回浏览器,nonexistent不存在了,你会注意到这也适用于通过构造函数传递的参数,让我们回到index.php添加一些数组:

现在请记住,当我们创建一个新的用户时$peter = new User($data),我们传递了整个数据数组,所以这里我们同样也传递foo,但是如果我们检查浏览器,foo是无处可寻,那是因为即使在类的内部,如果你尝试设置一个不存在的属性,PHP将使用set方法。

现在我们在User.php可以让用户觉得他有实际的访问权限,但是,如果我想只启用一些属性设置像这样?那么在这种情况下,我可以在我的类的顶部定义一个数组我希望用户能够设置的名称,如下所示:

现在,假设我们只想通过set方法设置email属性?在设置方法,让我们写另外一个条件:

回到index.php把$peter->nonexistent= ‘aaa’;修改为$peter->password= ‘asdfsadfsd’;我们在$data= array(’email’ => ‘peter@linyongmin.com’,’password’=>’123456789′,’foo’=>’bar’);设置password是整数,现在我们正试图用字符串来覆盖它。回到User.php在fillable数组里面添加password:

访问index.php:

读取不可访问属性的值时,__get() 会被调用:

我们在index.php输出$peter->email:

因为我再次尝试访问私有属性,但是在user类,在get的方法编码,看错误是否消失:

现在让我们创建一个与fillable 数组相似的解决方案,回到头部创建一个accessible属性private $accessible = array(’email’),让我们从set方法复制代码到get方法:

回到index.php:

我们把password也var_dump出来:

password返回是NULL正是我们想要看到的结果。

最后讨论的是__toSting魔术方法,现在当一个对象被转换成一个字符串的时候,这个被调用,比如说我要做一些像echo $peter的东西:

看看是否工作,我们需要做的就是检查echo $peter,注释index.php的var_dump,添加echo $peter代码:

所看到的:

我们得到一个电子邮件键名,但没有电子邮件的值,这意味着我在这里做错了什么,检查toString方法,我们把foreach ($this->accessible as $key => $value)写错了,应该改为foreach ($this->accessible as $key):

现在让我们重新加载index.php,返回json对象,包含邮箱:

我们也可以把password添加到accessible,输出结果:

这节课,我们学了几个魔术方法,有关魔术方法的完整列表,请参阅手册页魔术方法

下载本节课完整源码

接近10年的互联网从业经验,精通Scrum敏捷软件开发的方法,从事互联网产品设计,开发,测试,运营,案例不少于20个,发现自己最喜欢的工作是做外贸营销,外贸SEO,特别喜欢谷歌优化。从2017年3月开始坚持在群161510483直播谷歌SEO和WEB前端开发技术,只要加进来坚持学习零基础也能够学会。

Last modified: 2019年1月19日

Previous Story

PHP面向对象编程基础

第六节:php面向对象编程单一功能原则

单一功能原则:面向对象编程领域规定每个类都应该有一个单一功能,并且该功能应该由这个类完全封装起来.所有它的(这个类的)服务都应该严密的和该功能平行(功能平行意味着没有依赖).

...

Next Story

PHP面向对象编程基础

第八节:php自动加载机制

php自动加载机制:spl_autoload_register() 函数自动加载使用类变得容易,对于小项目来说,手动管理文件和类是没有问题的,但一开始做更大的项目.

...