批改状态:合格
老师批语:
<?php// 类与对象namespace _0815;use _0815\Query as _0815Query;/*** 1. 属性重载: __get(),__set()* 2. 方法重载:__call($name,$args), __callStatic($name,$args)*/// 封装, 重载, 继承class User {// 私有 封装private int $salary =10000;// 私有 封装private int $age=100;// 查询接口public function getAge(){return $this ->age;}}// 实例化$user = new User ();echo $user ->getAge() ;echo '<hr>';//--------------------------------------------class User2 {// 私有 封装private int $salary =10000;// 私有 封装private int $age=100;// 查询接口 属性拦截器 魔术方法 属性重载// 注意两个下划线public function __get($name){return $this ->$name;}}// 实例化$user2 = new User2 ();echo $user2 ->age ;echo '<hr>';//--------------------------------------------class User3 {// private 私有 封装 常用// $data 数据容器 用数组表示private array $data = ['age' => 20,];// 查询接口 属性拦截器 魔术方法 属性重载// 注意两个下划线// 商业代码public function __get($name){if (array_key_exists($name,$this ->data) ){return $this -> data[$name];}else {return "$name 不存在" ;}}}// 实例化$user3 = new User3 ();echo $user3 ->age ;echo '<hr>';echo $user3 ->dog ;echo '<hr>';//--------------------------------------------class User4 {// private 私有 封装 常用// $data 数据容器 用数组表示private array $data = ['age' => 20,];// 查询接口 属性拦截器 魔术方法 属性重载// 注意两个下划线// 商业代码public function __get($name){// 借助中间变量 result 实现单 return 返回$result =null ;if (array_key_exists($name,$this ->data) ){$result = $this -> data[$name];}else {$result = "$name 不存在" ;}return $result;}}// 实例化$user4 = new User4 ();echo $user4 ->age ;echo '<hr>';echo $user4 ->dog ;echo '<hr>';//--------------------------------------------class User5 {// private 私有 封装 常用// $data 数据容器 用数组表示private array $data = ['age' => 20,];// 查询接口 属性拦截器 魔术方法 属性重载// 注意两个下划线// 商业代码public function __get($name){// return array_key_exists($name ,$this ->data)? $this ->data[$name]:"$name 属性不存在";// 判断属性是否存在$condition = array_key_exists($name ,$this ->data);return $condition ? $this ->data[$name]:"$name 属性不存在";}// __set($name,$value): 见 812代码}// 实例化$user5 = new User5 ();echo $user5 ->age ;echo '<hr>';echo $user5 ->dog ;echo '<hr>';//--------------------------------------------class User6 {// private 私有 封装 常用// $data 数据容器 用数组表示private array $data = ['age' => 20,];// 查询接口 属性拦截器 魔术方法 属性重载// 注意两个下划线// 商业代码public function __get($name){// return array_key_exists($name ,$this ->data)? $this ->data[$name]:"$name 属性不存在";$condition = array_key_exists($name ,$this ->data);return $condition ? $this ->data[$name]:"$name 属性不存在";}// __set($name,$value): 见 812代码// 可以自动拦截对于方法的非法访问// 第一个参数是方法名称// 第二个参数是以数组表示的参数列表public function __call($name, $arguments){// return '方法不存在';printf('方法名:%s<br>参数列表:<pre>%s</pre><br>',$name ,print_r($arguments,true));}public static function __callStatic($name, $arguments){// 第一个参数是方法名称// 第二个参数是以数组表示的参数列表printf('方法名: %s<br>参数列表: <pre>%s</pre>', $name, print_r($arguments, true));}}// 实例化$user6= new User6 ();echo $user6->age ;echo '<hr>';echo $user6 -> cat;echo '<hr>';// echo $user6 -> hello();// echo '<hr>';// 非静态方法 类的实例访问echo $user6 -> hello('小狗','123@qq.om');echo '<hr>';// 静态方法 类访问 ::方法名User6 ::word (100,200);echo '<hr>';// tinkphp 查询构造器 数据库操作// Query 固定语法class Query {// 当这个查询类 实例化时,自动连接数据库 实例化的时候 自动连接数据库// public function __construct()// {// self::connect();// }public function table(){return $this;}public function where(){return $this;}public function find(){echo '完成';}}// 查询入口类class Db{public static function __callStatic($name, $arguments){// echo $name ,',', $arguments [0];// 所有查询操作再次完成, 单入口查询,惰性查询return call_user_func_array( [ new Query,$name],$arguments );}}Db ::table( 'think_user' )->where('id', 1)->find();// 表名// Db::table('think_user')->where('id', 1)->find();
<?phpnamespace _0815;use _0815\Demo1 as _0815Demo1;/*** 类的扩展/抽象/最终* 1. 可继承成员: protected* 2. extends: 类成员的来源* 3. parent: 父类引用*/class Person{// 属性// 默认 public 公告成员,当前类 类外部// public $email = '123@qq.com';// private 私有成员 类外部不可见private int $id =18;// protected 受保护的protected string $name;// public > protected > private// 类中,类外,子类: public// 类中,子类: protected// 类中: private// 方法public function __construct($name){$this ->name =$name;}// 自定义方法protected function getInfo(): string{return $this->name;}}// 继承 /扩展class Stu extends Person{// 只需要 扩展父类的属性和方法// 1、 属性扩展 扩展之前需要创建一个构造方法 继承扩展 相当于把父类除了 私有属性,其他都拿到了// extends: 相当于把父类代码复制到当前类中(除Private成员外)// protected string $name;// public function __construct($name)// {// $this->name = $name;// }// protected function getInfo(): string// {// return $this->name;// }// 属性扩展// 之前的// protected string $name;// 扩展的private string $lesson;private int $score;// 2、方法扩展// 构造方法public function __construct($name, $lesson, $score){// $this ->nam = $name;// $this ->lesson = $lesson;// $this ->score = $score;// 简化 parent :引用父类 相当于执行了 父类的构造方法 获取所有能获取到的(除了私有parent::__construct($name);// $this ->name = $name;$this->lesson = $lesson;$this->score = $score;}// 自定义方法 拓展 注意 protected 要跟父类一样或者高于父 类 publicpublic function getInfo(): string{return parent::getInfo() . '同学, (' . $this->lesson . ' ) , 成绩: ' . $this->score .'<br>';}}$stu = new Stu('小张', 'php', 90);echo $stu->getInfo() ;echo '<hr>';// 2. 禁用父类, 仅允许通过它的子类来访问父类成员// 把当前类,声明为"抽象类": abstract// 如果类中有抽象方法,则这个类必须声明为抽象类abstract class Demo1 {public string $name = 'admin';// 没有具体实现 叫抽象方法 前面必须加 abstract// 如果某个方法没有具体实现,应该声明成抽象方法abstract public static function getInfo($name);}class Demo2 extends Demo1 {// 在子类中, 必须将父类中的抽象方法实现了// public function getInfo($name)// {// return 'Hello, ' .$name;// }public static function getInfo($name){return 'Hello, ' .$name;}}// new Demo2();echo Demo2::getInfo('朱老师');echo '<hr>';// 抽象类: 强制要求必须继承才能用// 最终类: 禁止继承,直接用// final: 不能扩展了// final class Demo3// {// }// class Demo4 extends Demo3// {// }
<?phpnamespace _0815;use _0815\Demo2 as _0815Demo2;// 接口 升级版的抽象类// abstract class = interface 接口// 接口类interface iUser{// public string $name;// // 如果 某个方法 没有具体实现,应该声明为抽象方法// abstract public static function getInfo ($name);// abstract public static function getInfo1 ($score);// abstract public static function getInfo2 ($age);// 接口里面两类成员 常量、方法// 常量public const NATION = 'CHINA';// 方法 publicpublic function m1();public function m2();}//工作类 实现了 接口的类 将接口类方法实现// class Demo1 implements iUser{// // 接口的抽象方法,必须在工作类中全部实现// public function m1(){// }// public function m2(){// }// }// 如果实现类 仅实现了接口 一部分抽象方法 应该为抽象类// iUser 接口类固定写法abstract class Demo2 implements iUser{// 部分实现时,需要将类变为抽象类public function m1(){}}class Demo3 extends Demo2{public function m2(){}}// php是单继承 ,但是可以 使用接口多继承interface A {}interface B {}interface C {}// Test类,同时从三个接口中获取成员,间接实现了"多继承"// 用途:对于增删改查class Test implements A,B,C {}interface iDb {// 插入public static function insert (array $data);// 更新public static function updata (array $data ,string $where );// 删除public static function delete (string $where );// 查询public static function select (array $option );}abstract class aDb {// 插入public static function insert (array $data){}// 更新public static function updata (array $data ,string $where ){}// 删除public static function delete (string $where ){}// 查询public static function select (array $option ){}}// 实现class Db extends aDb {}
<?phpnamespace _0815;// 全局成员:函数 常量、类、接口、全局有效,禁止重复声明function hello(){}const A =1 ;class B {}// 将第二个 hello 声明在另外一个空间中,不会重名了namespace _0815_1;function hello (){}const A =2;class B {}
<?php// 命名空间解决了:全局成员的命名冲突,借鉴了同名文件可存入在不同的目录下面namespace one;class Demo1 {public static string $name = '小猫';}// 当存在 命名空间时,全局成员应该使用完整的名称// 类名 = 空间名称\类名// ::class 获取 类的完整名称echo Demo1::class.'<br>';echo '<hr>';namespace two;class Demo1 {public static string $name = '小狗';}echo Demo1::class.'<br>';echo '<hr>';// 跨空间访问// 在two 里面访问 one// 报错的 实际访问路径变成了 two\one\Demo1// echo one\Demo1::$name;// 跨空间访问 正确写法 从根空间/全局空间写起 开始查询 用反斜线 \echo \one\Demo1::$name;echo '<hr>';echo \two\Demo1::$name;
<?php// 命名空间类型、// 1. 当前路径: 非限定名称, Index Index::show();// 2. 相对路径: 限定名称, two\Index// 3. 绝对路径: 完全限定名称, \one\two\Indexnamespace _0815;namespace one;class Index {public static function show(){return __METHOD__;}}// Index::show(); 非限定名称// one\Index::showecho Index::show();echo '<hr>';// 如果我在one空间中, 访问 one\two中的成员// 方式一 绝对路径 完全限定名称echo \one\two\Index::show(). '<br>';// 方式二 限定名称echo two\Index::show(). '<br>';// 空间可以分层/分级管理namespace one\two;class Index {public static function show(){return __METHOD__;}}// one\two\Index::showecho Index::show();echo '<hr>';
<?phpnamespace _0815;namespace one;class Index {public static function show(){return __METHOD__;}}echo two\three\Index::show();echo '<hr>';// use 默认使用完全限定名称的类名/绝对路径// echo \one\two\three\Index::show();// use 进行简化use \one\two\three\Index as UserIndex;echo UserIndex::show();echo '<hr>';namespace one\two\three;class Index {public static function show(){return __METHOD__;}}//---------------------------------------------namespace four;// 如果当前空间中的没有Index类,可以进一步的简化// use one\two\three\Index as Index;// 如果当前类别名与原始类名相同,可以不写// 如果当前空间中有Index类, 就不能省去asuse one\two\three\Index;echo Index::show() ;echo '<hr>';namespace five;class Index {public static function show(){return __METHOD__;}}
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号