作者:手机用户2502904377 | 来源:互联网 | 2023-08-18 17:12
本文目录一览:
1、php5.4中引入的trait能解决什么问题
2、php中trait 多继承 成员属性一样怎么代替
3、php中的类是单继承,那要有多个类继承怎么办?
4、php中应用trait为什么报错
5、php 5.4 的 trait 怎么用在3.2.2中
php5.4中引入的trait能解决什么问题
Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。所以说Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。 无法通过 trait 自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个 Class 之间不需要继承。
php中trait 多继承 成员属性一样怎么代替
class myClass{
use myTrait;
}
$obj = new myClass();
$obj-traitMethod1();
$obj-traitMethod2();
// ↓↓ 只能调用public的属性和方法; protected以及private只供在traits内部自己调用;
echo $obj-traitPublic;
优先级问题
Trait会覆盖继承的方法,当前类会覆盖Trait方法。即 继承的方法 Traits方法 当前类方法,
trait A{
public $var1 = 'test';
public function test()
{
echo 'A::test()';
}
public function test1()
{
php中的类是单继承,那要有多个类继承怎么办?
PHP没有多继承的特性。即使是一门支持多继承的编程语言,我们也很少会使用这个特性。在大多数人看来,多继承不是一种好的设计方法。想要给某个类添加额外的特性,不一定要使用继承。这里我提供一种模拟多继承的方法以供参考。
PHP有一个魔术方法,叫做__call。当你调用一个不存在的方法时,这个方法会被自动调用。这时,我们就有机会将调用重定向到一个存在的方法。继承多个父类的子类,寻找方法的过程一般是这样的:
本身的方法 - 父类1的方法 - 父类2的方法...
模拟过程大致是这样:将各个父类实例化,然后作为子类的属性。这些父类提供一些公有的方法。当子类拥有某方法时,__call()函数不会被调用。这相当于“覆盖”了父类的方法。当调用了不存在的方法时,通过__call()方法依次从父类中寻找可以调用的方法。虽然这不是完备的多继承,但可以帮助我们解决问题。
?php
class Parent1 {
function method1() {}
function method2() {}
}
class Parent2 {
function method3() {}
function method4() {}
}
class Child {
protected $_parents = array();
public function Child(array $parents=array()) {
$_parents = $parents;
}
public function __call($method, $args) {
// 从“父类"中查找方法
foreach ($this-_parents as $p) {
if (is_callable(array($p, $method))) {
return call_user_func_array(array($p, $method), $args);
}
}
// 恢复默认的行为,会引发一个方法不存在的致命错误
return call_user_func_array(array($this, $method), $args);
}
}
$obj = new Child(array(new Parent1(), new Parent2()));
$obj-method1();
$obj-method3();
这里没有涉及属性的继承,但实现起来并不困难。可以通过__set()和__get()魔术方法来模拟属性的继承。请你动手实践。
php中应用trait为什么报错
trait:
类似小插件,可以用use放在类中间,让trait里面定义的方法作为class的一部分,本身不能直接实例化。
interface:
里面的方法都是虚拟的,需要在继承的时候对这些方法进行重定义,也就是说,方法是说明性质的,并没有实际操作,而你在继承的时候,需要对方法进行function,不然就会出错,而且不能缺失。
用法:
trait:你当成床上的小件套,比如抱枕,你可以在床上使用,也可以拿到椅子上使用,很方便的。
interface经常作为架构的时候,对一个实例的所拥有的属性和方法进行抽象定义,简单来讲类似一个协议,老板下达的任务。你要继承的话,必须满足这个协议,也就是完成老板下达的任务,老板只是说要做什么。
点击文档链接,可查看更多信息
php 5.4 的 trait 怎么用在3.2.2中
感觉 php 5.4 的 trait 和 java 的 interface 非常像!很好的代码复用机制。但是不知道怎么在 ThinkPHP 3.2.2 或者 OneThink 中使用。。。应该要加命名空间吧,那如何加载呢?放Common模块下?