第十六节:php traits

PHP面向对象编程基础

php traits,是为类似 PHP 的单继承语言而准备的一种代码复用机制,Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method,我们已经介绍了很多种方法分离和封装你的代码从应用程序,我们也学了创建一个非常小简洁的类,一个类负责单一功能是非常有必要的。

比如我们创建一个curl类,发起一个curl请求,将在几个地方用到,基础类的setters和getters的魔术方法,我也可以在几个地方使用它。但如果你有这些小类,这是非常好的,我们可以扩展多个类在同一时间,如果我们能够让类用户扩展curl和magic,那将是非常棒的:

非常遗憾,不能够这样做,但是5.4以后,有另外一个方法包含多个可重用的类到其它类,像traits,一个小类,意味着被纳入其他类。

php traits-实例演示

php traits-实例演示

php traits-实例演示

在App下面创建traits文件夹,创建新文件叫Curlable.php,负责运行一个curl请求并返回结果。

这是一个非常简单的特征,但它的确有用。现在我们有一段简洁代码,除了调用一个curl请求外别无其他。让我们看看我们是否可以把这个特点融入另一个类,我们把这个特质用到user类,现在有一些抽象类,但如果我在这里纳入特质,它也将被包含在这个用户类的所有子类中。

在user的里面,我们首先包含curlable特征,我们只需要使用关键字use,然后跟着curlable的trait的名字:

User.php

现在看看我们是否可以在index.php中实例化一个用户子类,并在浏览器中运行它,我们用Administrator类扩展用户,让我们实例化:

刷新index.php显示路径报错jiexi\app\jiexi\app\traits\curlable.php,回到User.php把use Jiexi\App\Traits\Curlable修改为use \Jiexi\App\Traits\Curlable后,在访问index.php正是我们想要的空白。

在User.php接着创建一个articalid信息的属性,把articalid添加到fillable数组,添加到accessible数组,代码如下:

记住,我们有getter和setter魔术方法,让我们替换如果这个设置魔术方法有其它的东西,让我们用property exists,我们作为类传递并且我们传递name作为这个name的属性,User.php代码如下:

回到index.php,设置自己的articalid,传递一个数组到这个构造函数,它将有一个article的id:

现在让我们看看Administrator.php的构造函数是否已经在我们的子类中定义了,有了,但是没有采取任何参数。所以我们只需要确保接受一个数组,让我们调用参数和,如果没有任何东西被传递,它将等于一个空数组:

在使用curalble traits,我们先检查一下是否有报错,在index.php输出var_dump($administrator):

返回正确,现在让我们用curl trait检索一些Jiexi的数据,最好在我们的抽象父类,在User.php创建一个getFacebookData的方法:

回到index.php添加代码:

加果我们的curlable特征在我们的用户类中包含成功,那么这里的curl方法应该被用户类继承,这反过来应该由我们的administrator类继承,好吗?现在我告诉你,类可以从多重特质继承。记住,在user类里面,我们有这个setter方法和getter方法,使他们可以为每一个实际使用这种特质的类提供服务,复制都新一个新文件叫Accessible.php:

让我们检查魔术方法,我们首先检查它的名字是否在可填充数组中,我们在Accessible.php头部哪里定义fillable数组:

回到index.php把代码修改为:

回到User.php添加代码use \Jiexi\App\Traits\Accessible,回到Accessible.php在accessible trait我申明了一个proctected变量叫fillable,代码如下:

回到User.php删除$fillable和$accessible属性,把他们设置在构造函数:

我们不能定义这些属性并不意味着我们不能使用这些属性,回到index.php:

非常棒刷新index.php工作正常,让我们删除User.php的构造函数的$this->fillable[]=’articalid’;看看我们不能够设置我们的articalid,所以就不现实具体博客的内容,而是显示博客的聚合页面。

快速回顾-php traits

快速回顾-php traits

快速回顾-php traits

他们提供了一个准备使用的行为,这是一组方法的形式,你可以很容易地插入任何你想要的类:

  1. 一个trait只是为了继承;
  2. 一个trait不能被自己实例化。

它是一个包含类来实现特定方法的trait,这最后一个例子:

Accessible.php

在我们的特质里面定义这个抽象的方法,迫使我们的竞争类也定义这个方法,有点像interface:

报错,因为Administrator类没有定义我们的抽象方法,回到User.php定义这个公共方法:

taits非常强大,但是不要过度使用它,如果在一个类用太多trait,导致一个非常复杂的编码思路。

Last modified: 2019年1月28日

Previous Story

PHP面向对象编程基础

第十五节:PHP静态属性和方法

php静态:声明类属性或方法为静态可以不实例化类而直接访问,静态属性不能通过一个类已实例化的对象来访问(但静态方法可以).

...

Next Story

PHP面向对象编程基础

第十七节:PHP依赖注入

PHP依赖注入,将会用到很多魔术方法,这只是一个聪明的方法来解耦(去耦合)你的代码。依赖注入是种实现控制反转用 …

...