trait 功能与语法
<?php
//trait 功能与语法
//Trait 和一个类相似,但仅仅旨在用细粒度和一致的方式来组合功能。Trait 不能通过它自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用类的成员不需要继承。
trait Demo
{
protected $name="张冠李戴";
static $age;
abstract function Test();
}
class Demo1
{
//引入关键字 use
use Demo;
function Test()
{
echo Demo::$age;
}
}
$demo1=new Demo1;
//给静态变量赋值
Demo::$age=33;
$demo1->Test();
trait:代码复用
<?php
//trait:代码复用
//get_class_vars — 返回由类的默认属性组成的数组
trait tDemo
{
function con()
{
$cl=get_class_vars(__CLASS__);
printf('<pre>%s</pre>',print_r($cl,true));
}
}
class Demo
{
use tDemo;
protected $Title='百度';
public $Http='https://baidu.com';
public function baidu()
{
echo $this->Title,"--的网址是:".$this->Http,"<br>";
}
}
$demo=new Demo;
$demo->baidu();
$demo->con();
class Demo1
{
use tDemo;
protected $Title='百度';
public $Http='https://baidu.com';
public $arr=[1,2,3,[4,5,6,[7,8,9]]];
public function baidu()
{
echo $this->Title,"--的网址是:".$this->Http,"<br>来个数组:",printf('<pre>%s<pre>',print_r(($this->arr),true));
}
}
$demo1=new Demo1;
$demo1->con();
$demo1->baidu();
trait: 在继承上下文环境
<?php
// trait2: 在继承上下文环境中, 具有优先级, 通过优先的设置, 降低单继承的影响
//这个优先级可以替换同名函数
trait tDemo
{
function test()
{
//输出trait的方法
echo 'son访问到了trait方法是:',__METHOD__;
}
}
class Dad
{
function test()
{
echo 'son访问到了class方法是:',__METHOD__;
}
}
class Son extends Dad
{
use tDemo;
}
$son=new Son;
$son->test();
trait扩展
<?php
//trait组合实现功能扩展
//功能扩展:
trait tDemo1
{
function class_name()
{
//格式化打印类中属性
$class_name=get_class_vars(__CLASS__);
printf('<pre>%s</pre>',print_r($class_name,true));
}
}
trait tDemo2
{
function method_name()
{
//格式化打印类中方法
$method_name=get_class_methods(__CLASS__);
printf('<pre>%s</pre>',print_r($method_name,true));
}
}
//或更多trait
class Test
{
use tDemo1,tDemo2;//同时引入
public $name="手机";
public $price=2000;
}
$test=new Test;
$test->class_name();//调用函数,打印出当前类中的属性
$test->method_name();
//或者:
trait tDemo3
{
use tDemo1,tDemo2;
function mar()
{
}
public static function test()
{
}
abstract public function abtest();
public $address='地球';
public $type='外星人';
}
class Test1
{
use tDemo3;
public $age=3000;
public function abtest(){
}
}
$test1=new Test1;
$test1->class_name();
$test1->method_name();
总结:记性不太好,还是很多记不住,有时候靠猜或者靠测试。trait不难理解。