批改状态:合格
老师批语:如果想用接口中的一个功能, 但这里只用一次, 匿名类就派上用场了, 还有, 如果限定函数的参数是对象类型,但处于测试环境中, 也可以用到匿名类, 所以, 匿名类可以理解为一个小时工, 干完活就可以滚蛋了
sleep(),wakeup()__sleep()
__sleep()不能返回父类的私有成员的名字。这样做会产生一个 E_NOTICE 级别的错误。可以用 Serializable 接口来替代。
__wakeup()
<?phpclass Nicola{private $name;private $age;private $sex;private $info;//构造函数public function __construct($name, $age, $sex){$this->name = $name;$this->age = $age;$this->sex = $sex;$this->info = sprintf("基本信息,昵称: %s age: %d sex: %s",$this->name,$this->age,$this->sex);}public function getInfo(){echo $this->info;}/*** serialize前调用 用于删选需要被序列化存储的成员变量* @return array [description]*/public function __sleep(){echo __METHOD__ . '<br>';//序列化时只会存储 name age sex, info 不会被序列化return ['name', 'age', 'sex'];}/*** unserialize前调用 用于预先准备对象资源*/public function __wakeup(){echo __METHOD__ . '<br>';$this->info = sprintf("基本信息, 昵称: %s age: %d sex: %s",$this->name = '尼古拉',$this->age = '18',$this->sex = '保密');}}$nicola = new Nicola('朱老师', 40, '男');//构造函数组装的 $info$nicola->getInfo();//序列化时并不会存储 $info 属性echo '<hr>';$temp = serialize($nicola);echo $temp;echo '<hr>';//反序列化时会调用 __wakeup() 函数$nicola = unserialize($temp);//__wakeup() 组装的 $info$nicola->getInfo();
<?phpclass Exception {protected $message; // 异常信息protected $code; // 用户自定义异常代码protected $file; // 发生异常的文件名protected $line; // 发生异常的代码行号final private function __clone() { }public function __construct($message = "", $code = 0, Throwable $previous = null) { }final public function getMessage() { } //返回异常信息final public function getCode() { } // 返回异常代码final public function getFile() { } // 返回发生异常的文件名final public function getLine() { } // 返回发生异常的代码行号final public function getTrace() { } // backtrace() 数组final public function getPrevious() { } // 返回异常链中的前一个异常final public function getTraceAsString() { } // 已格成化成字符串的 getTrace() 信息/* 可重载的方法 */public function __toString() { } // 可输出的字符串
<?php//我们知道系统有预定义的父类Exception//因此,自定义的必须是这个预定义的子类class MyException extends Exception{//重定义构造器使第一个参数 message code变为必须被指定的属性public function __construct($message, $code){//parent::construct()来检查所有的变量是否已被赋值parent::__construct($message, $code);}//使用魔术方法,把实例对象输出为字符串//重写父类方法,自定义字符串输出的样式public function __toString(){//HERDOC的后面不能有空格return <<< "NICOLA"<table><tr><th>代码</th><th>内容</th><th>脚本</th><th>行</th></tr><tr><td>{$this->getCode()}</td><td>{$this->getMessage()}</td><td>{$this->getFile()}</td><td>{$this->getLine()}</td></tr></table>NICOLA;}}
<?php//匿名类// 直接定义$objA = new class{public function getName(){echo "I'm objA";}};$objA->getName();// 方法中返回function testA(){return new class{public function getName(){echo "I'm testA's obj";}};}$objB = testA();$objB->getName();// 作为参数function testB($testBobj){echo $testBobj->getName();}testB(new class{public function getName(){echo "I'm testB's obj";}});
本节课最大的亮点就是匿名类的使用,可惜只能用于 7.0+以后的版本,通过 new class 来实例化一个匿名类,这可以用来替代一些”用后即焚”的完整类定义
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号