#文件地址:/my/cats.php
namespace my;
trait cats{
public $name = 'TOM';
public static function color(){
echo "白色";
}
public function scratch(){
echo "你被挠伤了!<br />";
}
}
#文件地址:/my/dogs.php
namespace my;
class dogs{
#性状的使用方法,直接写下面语句就可以直接用了,非常方便(需要加载类文件)
use cats;
//public $name = 'JHON';
#注意这块有个坑,如果用构造函数定义一个用public方法相同的属性会报如下错误。
# Fatal error: my\dogs and my\cats define the same property ($name) in the composition of my\dogs.
function __construct($name='JHON'){
if(!empty($name)){
$this->name = $name;
}
echo $this->name.'热情的跑过来<br />';
}
public static function color(){
echo '灰色<br />';
}
public function bite(){
echo '你被咬伤了!<br />';
}
public function catScratch()
{
$this->scratch();
}
function __destruct(){
echo $this->name."逃跑了<br />";
}
}
#命名空间:如果有下列语句,代码中可声明类可直接用 new 类名() 实例化,如果没有,就需要使用 new 命名空间\类名声明
use my\dogs;
#自动加载注册函数
function loadDo($className){
$path = str_replace('\\', '/', __DIR__ . '\\'. $className).'.php';
if(is_file($path)) {
require $path;
}else{
echo '文件不存在!';
}
}
#系统默认自动加载函数
function __autoload($className){
loadDo($className);
}
#自动加载函数
spl_autoload_register(loadDo);
#实例化类
#当前类以及使用trait语法糖加载cats类
$dog = new dogs();
#这个方法是cats类中定义的,可以直接调用
$dog->scratch();
#这是原始类中自定义的方法,原始类中调用trait类,跟自有函数的调用方法一样,属性也一样。
$dog->catScratch();
#如果原始类和trait类中的有相同属性或方法会优先使用原始类中的属性或方法
echo $dog->name.'<br />';
#静态方法也是
my\dogs::color();
#文件地址:/my/cats.phpnamespace my;trait cats{ public $name = 'TOM'; public static function color(){ echo "白色"; } public function scratch(){ echo "你被挠伤了!<br />"; ...