一种PHP实现代码重用的方法,这是一种新的特性
当阅读yii2源代码,接触的特点,学一点,写博客记录。由于PHP 5.4.0,PHP实现了代码重用的方法,称为特征。
性状是一个丹继成语言类似于PHP代码复用机制。为了减少单继承语言的局限性,特质使开发者自由复用方法在单独的类在不同的层次。性状和类组合的语义定义作为一种方法来降低复杂性和避免的典型问题,与传统的多继承和mixin类(mixin)。
特性类似于类,但它只设计以细粒度和一致性的方式组合功能。特性不能自己实例化。它增加了横向特征与传统继承的结合,也就是说,应用程序类的成员不需要继承。
性状的例子
复制代码代码如下所示:
< PHP
性状ezcreflectionreturninfo {
功能getreturntype(){ / * 1 * / }
功能getreturndescription(){ / * 2 * / }
}
类ezcreflectionmethod延伸反射{
使用ezcreflectionreturninfo;
**…
}
类ezcreflectionfunction延伸reflectionfunction {
使用ezcreflectionreturninfo;
**…
}
>
优先
从基类继承的成员由由特性插入的成员覆盖。优先级是覆盖当前类成员的特性的方法,而特征覆盖继承的方法。
优先的例子
复制代码代码如下所示:
< PHP
阶级基础{
公共函数sayHello(){
echo'hello;
}
}
特质表示世界{
公共函数sayHello(){
家长::sayHello();
echo'world!;
}
}
类myhelloWorld延伸基地{
使用表示世界;
}
$ O =新myhelloWorld();
$ O -> sayHello();
>
以上例程将导出:Hello World!
成员继承自基类是覆盖在表示世界特质插入基类sayHello方法。在行为myhelloWorld类定义的方法是一致的,重要的是在当前类的方法重写方法的特点和性状的方法,覆盖基类中的方法。
另一个优先顺序的例子
复制代码代码如下所示:
< PHP
特质的HelloWorld {
公共函数sayHello(){
echo'hello世界!;
}
}
类theworldisnotenough {
使用HelloWorld;
公共函数sayHello(){
echo'hello宇宙!;
}
}
$ O =新theworldisnotenough();
$ O -> sayHello();
>
以上例程将导出:Hello宇宙!
多性状
用逗号分隔,许多特性列在使用声明中,并可以插入类中。
多性状使用举例
复制代码代码如下所示:
< PHP
特质你好{
公共函数sayHello(){
echo'hello;
}
}
特点世界{
公共函数表示世界(){
echo'world;
}
}
类myhelloWorld {
你好,世界;
公共功能sayexclamationmark(){
回声'!;
}
}
$ O =新myhelloWorld();
$ O -> sayHello();
$ O ->表示世界();
$ O -> sayexclamationmark();
>
以上例程将导出:Hello World!
冲突的解决
如果两个属性都插入同一名称的方法中,如果冲突没有明确的解决方案,将产生致命错误。
为了解决命名冲突的多个性状在同一个班,有必要使用代替操作员指定哪一个在冲突的方法是使用指定的。
上面的方法只允许排除其他方法,而AS操作符可以用另一个名称引入一个相互冲突的方法。
冲突解决的一个例子
复制代码代码如下所示:
< PHP
特质{
公共职能Smalltalk(){
echo'a;
}
公共功能bigtalk(){
echo'a;
}
}
性状B {
公共职能Smalltalk(){
echo'b;
}
公共功能bigtalk(){
echo'b;
}
}
类人{
使用A,B,{
B::Smalltalk来代替;
答::bigtalk代替B;
}
}
类aliased_talker {
使用A,B,{
B::Smalltalk来代替;
答::bigtalk代替B;
B::bigtalk谈话;
}
}
>
在这种情况下,说话者用特征A和B,因为A和B的冲突的方法,他们定义的特质B和bigtalk特质的Smalltalk
aliased_talker使用as操作符定义说B.的bigtalk别名
修改方法的访问控制
使用AS语法也可以用来调整该方法的访问控制。
修改方法的访问控制示例
复制代码代码如下所示:
< PHP
特质的HelloWorld {
公共函数sayHello(){
echo'hello世界!;
}
}
修改sayHello / /访问控制
类myclass1 {
使用HelloWorld {sayHello保护;}
}
对已更改的访问控制别名的方法
原来打招呼 / /访问控制是不可改变的
类myclass2 {
使用HelloWorld {sayHello私人myprivatehello;}
}
>
从性状中形成性状
正如类可以使用特性一样,其他特性也可以使用特性。
特质的一个例子
复制代码代码如下所示:
< PHP
特质你好{
公共函数sayHello(){
echo'hello;
}
}
特点世界{
公共函数表示世界(){
echo'world!;
}
}
特质的HelloWorld {
你好,世界;
}
类myhelloWorld {
使用HelloWorld;
}
$ O =新myhelloWorld();
$ O -> sayHello();
$ O ->表示世界();
>
以上例程将导出:Hello World!
特质抽象成员
为了对所使用的类强制要求,特性支持抽象方法的使用。
抽象方法强制要求的一个例子
复制代码代码如下所示:
< PHP
特质你好{
公共功能sayhelloworld(){
echo'hello。美元-> getworld();
}
摘要公共功能getworld();
}
类myhelloWorld {
私人世界;
使用你好;
公共功能getworld(){
返回这个世界;
}
公共功能setworld($ Val){
这个$ =;
}
}
>
性状静态成员
可以通过静态成员静态方法定义特性。
静态变量的一个例子
复制代码代码如下所示:
< PHP
特质反{
公共功能公司(){
静态$ = 0;
$ = $ 1;
;
}
}
C1类{
使用计数器;
}
C2类{
使用计数器;
}
$ =新(C1);$ <公司(1);
$ =新(C2);$ - >公司(1);
>
静态方法的一个例子
复制代码代码如下所示:
< PHP
性状staticexample {
公共静态函数doSomething(){
return'doing东西';
}
}
类的例子{
Use StaticExample;
}
例如:doSomething();
>
静态和静态方法的例子
复制代码代码如下所示:
< PHP
特质反{
公共静态$ = 0;
公共静态功能公司(){
自我::$ =自我::$ 1;
:;
}
}
C1类{
使用计数器;
}
C2类{
使用计数器;
}
公司:(1);
C2:(1);
>
属性
属性还可以定义属性。
定义属性的一个示例
复制代码代码如下所示:
< PHP
性状propertiestrait {
公共$ x = 1;
}
类propertiesexample {
使用propertiestrait;
}
例=新propertiesexample美元;
$示例> x;
>
如果特质定义一个属性,类不会定义相同的名字,否则会产生一个错误。如果该属性的定义与特质的定义兼容(同等知名度和初始值),错误是e_strict,否则这是一个致命的错误。
冲突的一个例子
复制代码代码如下所示:
< PHP
性状propertiestrait {
公共$ =真;
公共$ = false;
}
类propertiesexample {
使用propertiestrait;
公共$ = true;
公共$不同= TRUE
}
>
不同的使用
不同用途的例子
复制代码代码如下所示:
< PHP
命名空间;
使用测试方法测试初始值;是可选的。
>
< PHP
命名空间;
类someclass {
使用测试;
}
>
第一种用法是使用名称空间的测试,并发现了测试,第二种用法使用了一个特性来查找。
__class__和__trait__
__class__返回使用特征类的名称,并__trait__返回特质的名字
示例如下
复制代码代码如下所示:
< PHP
性状testtrait {
公共功能测试(){
回声类:。__class__。php_eol;
回声特征:。__trait__。php_eol;
}
}
类的基类{
使用testtrait;
}
class TestClass {扩展基类
}
$ T =新TestClass();
$ T ->测试();
/ /班:BaseClass
/ /特点:testtrait
单一性状
例子如下
复制代码代码如下所示:
< PHP
性状单{
*一般使用类定义的私有结构
* /
/ /私有函数(__construct){ }
公共静态函数getInstance(){
静态_instance美元= null;
美元类= __class__;
返回:_instance =新_instance美元美元美元类;
}
公共功能__clone(){
trigger_error('cloning'。__class__。是不允许的。e_user_error);
}
公共功能__wakeup(){
trigger_error('unserializing'。__class__。是不允许的。e_user_error);
}
}
*使用示例
* /
类Foo {
使用单;
私有函数__construct(){
美元->名称= 'foo;
}
}
类酒吧{
使用单;
私有函数__construct(){
美元->名称= 'bar;
}
}
Foo Foo美元=::getInstance();
回声名称;
酒吧:酒吧=美元:getInstance();
回声名称;
调用特征方法
虽然它不明显,但如果将特征方法定义为普通类的静态方法,就可以称之为普通类的静态方法。
例子如下
复制代码代码如下所示:
< PHP
特质foo {
函数条(){
return'baz;
}
}
:条(),;
>
朋友们很熟悉这些特性的新特性,我希望这篇文章能对你有所帮助。