实例
<?php /** * 匿名类,php7.0+支持 * 类似匿名函数,即没有名称的类 * 匿名类适用于一次性的创建与使用 * 匿名类总是与:new关键字配套使用 */ class Test_Susu{ private $name = '涂山苏苏'; public function story($position,$color) { return $this->name.'成为了 : <span style="color:'.$color.'">'.$position.'</span>'; } } //访问类方法的三种方式: //1.对象 $susu = new Test_Susu(); echo $susu -> story('实习小红娘','pink'),'<p>'; //2.匿名对象 echo (new Test_Susu()) -> story('初级小红娘','lightblue'),'<p>'; //3.匿名类 echo (new class ('涂山雅雅'){ private $name; public function __construct($name) { $this ->name = $name; } public function story($position,$color) { return $this->name.'成为了 : <span style="color:'.$color.'">'.$position.'</span>'; } })->story('涂山苏苏','purple'),'<p><hr>'; //匿名类的三种应用场景 //1.匿名类中可以使用构造函数 echo '匿名类的三种应用场景:1<p>'; echo (new class ('涂山苏苏'){ private $name; public function __construct($name) { $this ->name = $name; } public function story($position,$color) { return $this->name.'成为了 : <span style="color:'.$color.'">'.$position.'</span>'; } })->story('正式小红娘','green'); //2.在匿名类中可以继承其他类中的成员 echo '<p>匿名类的三种应用场景:2<p>'; /** * test_poetry */ class poetry { protected $poetry; //诗 //构造方法初始化 public function __construct($ci) { $this ->poetry = $ci; } public function show($color) { return $this->poetry ? :'<span style="color:'.$color.'">一夜风呜花飘雨,两指竹哀箫弄魂</span>'; } } //匿名类继承 echo (new class('涂山苏苏','呐,牵手吧,幸福') extends poetry{ private $name; //匿名类的构造初始化 public function __construct($name,$ci='') { parent::__construct($ci); $this ->name = $name; } public function story($position,$color) { return $this->name.'成为了 : <span style="color:'.$color.'">'.$position.'</span>'; } public function show($color) { return $this->name . '的个性签名是 : <span style="color:'.$color.'">'.parent::show($color).'</span>'; } })->show('purple'); echo '<p>匿名类的三种应用场景:2<p>'; //3.可以在匿名类中声明嵌套一个匿名类 class Animal { private $name = '狗子'; private $color = '奶白'; private $type = '金毛'; protected function info() { return '市 场售价1500元'; } public function nesting() { //宿主类的私有成员不可以在匿名类中直接使用 //可以在匿名方法中创建一个构造方法将宿主类的私有成员注入 //将宿主类中的私有属性作为匿名类中的构造方法的参数传入即可 return (new class($this->type,$this->name,$this->color) extends Animal{ //在匿名类中穿件一个私有属性来接收宿主类传来的值 private $type; private $name; private $color; //构造初始化(接收传值) public function __construct($type,$name,$color) { $this->type = $type; $this->name = $name; $this->color = $color; } public function nesting_Meth() { return '我是嵌套匿名类中的方法 : ' . __METHOD__; } public function show() { return '动物的名称是 : ' . $this->name.'<br>'. '动物的品 种是 : ' . $this->type.'<br>'. '动物的颜色是 : ' . $this->color.'<br>'; } }); } } //访问匿名类中的方法 echo (new Animal())->nesting()->nesting_Meth().'<br><hr>'; echo (new Animal())->nesting()->show();
运行实例 »
点击 "运行实例" 按钮查看在线实例
实际上也就是去掉类关键字以及类的声明,直接new一个新的类的对象出现,虽然看起会有点绕,但是实际上会省很多力气,不用专门去定义一个类来做某件临时性的逻辑处理:
实例
<?php /** * Trait,打破了PHP本身只能单继承的限制 * 是代码复用机制的体现 * 使用类的语法,但是不是类,无法实例化 * 总体理解为一个方法集 */ //语法规范 if(!class_exists('Person')) { /** * Person * 测试Trait */ class Person { protected $name; //构造初始化 public function __construct($name = '涂山苏苏') { $this->name = $name; } public function study($course='PHP') { return $this->name . '在练习 : ' . $course; } } } //创建一个trait 特性类 trait course { public $friend = '绿谷出久'; public function study($act='踢足球') { return $this->friend.'在学习'.$act; } } trait recreation { // public $friend = '蛙吹梅雨'; public function study($do='练习绝招') { return $this->name.'和'.$this->friend.$do; } } class Student extends Person { //导入trait类 use course,recreation{ course::study insteadof recreation; recreation::study as mysport; } } $stu = new Student(); echo $stu->study(),'<br>'; echo $stu->mysport();
运行实例 »
点击 "运行实例" 按钮查看在线实例
Trait类就是打破了其他类智能单继承的限制,它位于父类与子类之间,可以改用别用来调用其他类的同名方法
include和require确实方便,但是对于类多了之后,尤其是命名空间之后,就会显得异常繁琐.所以出现了有类的自动加载.两行代码.轻松解决
实例
spl_autoload_register(function($class_name){ require $class_name . '.php'; }); echo PHP_Task10_chain_sel::CLASS_NAME;
运行实例 »
点击 "运行实例" 按钮查看在线实例
spl_autoload_register函数是自动将函数注册到该脚本的队列中,通过匿名函数来加载类名
在PHP中,序列化用于存储或传递 PHP 的值的过程中,同时不丢失其类型和结构。但是在序列化对象时,并不会的常量
实例
<?php /** *对象序列化 */ class dbconn { //连接参数与返回值 public $db = null; public $host; public $user; public $pwd; //构造初始化 public function __construct($host = '127.0.0.1',$user = 'root',$pwd = 'root') { $this->host = $host; $this->user = $user; $this->pwd = $pwd; //确保实例化对象的能自动连上数据库 $this->connect(); } //数据库连接 public function connect() { $this->db=mysqli_connect($this->host,$this->user,$this->pwd); } //对象序列化的时候自动调用 public function __sleep() { return ['host','user','pwd']; } //反序列化 public function __wakeup() { $this->connect(); } } $obj = new dbconn(); /** * 对象序列化: * 1.只保存属性,不保存方法 * 2.只保存类名,不保存对象名 */ echo serialize($obj),'<hr>'; $tmp = serialize($obj); var_dump($tmp);
运行实例 »
点击 "运行实例" 按钮查看在线实例
在PHP应用中,序列化和反序列化一般用做缓存,比如session缓存,cookie等。__sleep()和__wakeup()方法分别是对应着序列化和反序列化的操作.