批改状态:合格
老师批语:
<?php// 1、静态成员 (属性和方法)class Shop{public static $title='苹果13PRO';public $price;public $num1=1;public static $num2=1;//构造 给与静态成员默认值会报错//使用静态成员没有经过构造方法public function __construct($title,$price){$this->title =$title;$this->price =$price;// 普通成员变量,每次从头开始计算$this->num1++;// 静态变量成员调用一次,就会增加1// 静态成员为本类调用,为所有实例共享// 存在内存中,只要使用了改变了它的值,它会在内存中保存改变后的数据self::$num2++;}public static function vedio($tit){// 静态成员用self 代表本类 Shop, 普通方法用$thisreturn '看视频手机:'. self::$title . $tit;}}class Son extends Shop{// 静态也能被继承}/** 静态化成员的优缺点* 1、存在多个实例,静态成员在内存中,只占一份* 2、静态成员 执行效率比 实例化高** 缺点* 静态成员不能自动销毁 实例化会自动销毁*/echo Son::vedio('!厉害了!'); //看视频手机:苹果13PRO!厉害了!
/* 2、抽象类* (多态的一种,静态也是多态的一种)* 抽象类 用于描述一些十五所具有的特性和行为 但是没有具体实现* 抽象有类 也有方法 abstract* */abstract class Person{abstract public function say();abstract public function eat();//抽象方法}//new Person(); Cannot instantiate abstract class Person//抽象类不能被实例化的,不能生产出来对象//抽象类继承抽象类abstract class Chinese extends Person{protected $name;//构造方法也可以在抽象类里使用public function __construct($name){$this->name =$name;}// 抽象类里是可以有普通方法的public function say(){return $this->name . '我是中国人,我说汉语';}}//架构师 把项目架起来,在做很多抽象类,你写的代码必须继承抽象类//有多少个抽象方法就继承多少个抽象方法// 如果继承了抽象类,不能把所有的方法重写,只能自己也是抽象类class Anhui extends Chinese{public function eat(){return $this->name . '我是中国人,我吃中国菜';}}$obj =new Anhui('小明');echo $obj->say();//小明我是中国人,我说汉语echo '<hr />';echo $obj->eat(); //小明我是中国人,我吃中国菜// 抽象类 设计类和实现类是分离的 可以为子类提供 公用的方法 作为子类重写模板来使用
class App{// const 常量关键词const APP_NAME='PHP';public function get_name(){return self::APP_NAME;//调用常量}}///常量不能实例化访问echo App::APP_NAME; //静态访问方式$obj = new App();echo $obj->get_name();//常量会当成静态成员进行访问
//也是多态的一种,不管是普通还是抽象,都是单继承,就是一个子类只能继承一个父类// interface 关键词 创建 替换classinterface File{//接口只能声明两种成员 常量 抽象方法const APP_NAME='中小学教育部';//接口的方法本身就是抽象的不能放abstractpublic function no_ke($o,$t);public function no_ye(...$param);}interface Guojia{//接口里可以用静态方法public static function no_tifa($param);}// 接口不能继承// 实现接口implementsclass Teacher implements File,Guojia{public function no_ke($o,$t){return $o . $t;}public function no_ye(...$param){return print_r($param);}// 接口有静态成员,重写也要用静态public static function no_tifa($param){return $param;}}$obj = new Teacher();echo $obj->no_ke('补课?','不补课!'); //补课?不补课!echo '<hr />';echo $obj->no_ye('作业?','没有作业!','不能留作业!');//Array ( [0] => 作业? [1] => 没有作业! [2] => 不能留作业! ) 1echo '<hr />';//echo $obj->no_tifa('不能体罚!'); //不能体罚!//静态成员不要实例化echo Teacher::no_tifa('不能体罚!');//不能体罚!
abstract class Computer{const APP_NAME="Win11 电脑";abstract public function install($param);}interface Plugo{public function install_o($param);}interface Plugt{public function install_t($param);}class VScode extends Computer implements Plugo,Plugt{public function install($param){return '安装成功:'.$param;}public function install_o($param){return '安装成功:'.$param;}public function install_t($param){return '安装成功:'.$param;}}$obj = new VScode();echo $obj->install("vscode");echo '<br />';echo $obj->install_o("插件1");echo '<br />';echo $obj->install_t("插件2");
//后期静态绑定 延迟静态绑定 静态::访问类 就是后期// 关键词 staticclass A{public static function test(){return 'A';}public function show(){//return $this->test();return static::test();}}class B extends A{public static function test(){return 'B';}}$a =new A();//实例化A 用a请求$this 先找Aecho $a->show();echo '<hr />';$b =new B();//实例化B 找Becho $b->show();
class A{public $name;public function __construct($name){$this->name=$name;}public function __destruct(){echo '执行完成';//可以执行很多代码 比如unset}}$a= new A('明明');echo $a->name;$name=$a->name;echo '<hr />';unset($a);echo '<hr />';//$name=$a->name;echo $name;

class People{//私有的 受保护的都可以使用private $name;protected $age;protected $height;public function __construct($name,$age,$height){$this->name=$name;$this->age=$age;$this->height=$height;}public function __get($n){//__get 参数是 我们要找的成员名字,外面找name 返回name// return $this->name;//要找name $n就是name $this->$n 相当于 $this->nameif($n=='name'||$n=='age'){return $this->$n;}//empty 没有值也会当成真if(empty($this->$n)){return $n.',你访问的成员不存在!';}return $n.',你访问的成员不能访问!';}}$obj = new People('明明',18,180);echo $obj->name;echo '<hr />';echo $obj->age;echo '<hr />';echo $obj->height; //height,你访问的成员不能访问!
class People{//私有的 受保护的都可以使用private $name;protected $age;protected $height;public function __construct($name,$age,$height){$this->name=$name;$this->age=$age;$this->height=$height;}public function __get($n){//__get 参数是 我们要找的成员名字,外面找name 返回name// return $this->name;//要找name $n就是name $this->$n 相当于 $this->nameif($n=='name'||$n=='age'){return $this->$n;}//empty 没有值也会当成真if(empty($this->$n)){return $n.',你访问的成员不存在!';}return $n.',你访问的成员不能访问!';}//设置需要两个参数public function __set($key,$value){// print_r($key.'----'.$value);//通过返回$this 的key =要修改的值return $this->$key=$value;}}$obj = new People('花花',25,160);echo $obj->age;echo '<hr />';$obj ->age =26;echo '<hr />';echo $obj->age;
//方法重载 __call 访问未定义的方法时,触发class People{//call 有两个参数public function __call($key,$value){// $key 第一个参数是访问的方法//$value 第二个参数是方法的传值// print_r($key); //add// print_r($value);//Array ( [0] => 10 [1] => 20 [2] => 30 [3] => 40 )// return 1;//方法重载是为了提醒和处理错误信息// if($key=='add')// {// $num=0;// foreach ($value as $v){// $num +=$v;// }// return $num;// }return '方法名:'.$key.'<br> 方法参数:<pre>'.print_r($value,true).'</pre>';}}$obj = new People();echo $obj->add(10,20,30,40);
class People{//callStatic 静态触发 要用静态方法public static function __callStatic($key,$value){return '方法名:'.$key.'<br> 方法参数:<pre>'.print_r($value,true).'</pre>';//}}//静态处理不能用普通方式来执行//$obj = new People();//echo $obj->add(10,20,30,40);//没有静态方法就会执行模式方法__callStaticecho People::add(100,200,300);
| 关键词 | 类外声明 | 声明类 | 声明属性 | 声明方法 | 解释 |
|---|---|---|---|---|---|
| const | √ | √ | 定义类常量 | ||
| extends | √ | 扩展类,用一个类去扩展它的父类 | |||
| public | √ | √ | 公用属性或方法 | ||
| protected | √ | √ | 私有属性或方法 | ||
| private | √ | √ | 受保护的属性或方法 | ||
| static | 备注1 | √ | √ | 静态成员 | |
| abstract | √ | 备注2 | √ | 抽象类或方法 | |
| interface | √ | 创建接口 | |||
| implements | √ | 实现接口 | |||
| final | √ | √ | 类不能被继承 | ||
| parent:: | 访问父类 | ||||
| $this-> | 访问本类 | ||||
| self:: | 访访问本类静态 | ||||
| static:: | 后期静态绑定 | ||||
| namespace | √ | 创建命名空间 |
备注1:老师课件显示static可以声明类,我试了下发现不能用,先去掉
备注2:老师课件中abstract 可以声明属性,应该是可以声明抽象方法
| 方法 | 描述 |
|---|---|
__construct |
构造方法,实例类的时候,自动调用 |
__destruct |
析构方法,类执行完后,自动调用 |
__call |
在对象中调用一个不可访问方法时调用 |
__callStatic |
用静态方式中调用一个不可访问方法时调用 |
__get |
获得一个类的成员变量时调用 |
__set |
设置一个类的成员变量时调用 |
__isset |
当对不可访问属性调用 isset()或 empty()时调用 |
__unset |
当对不可访问属性调用 unset()时被调用 |
__sleep |
执行 serialize()时,先会调用这个函数 |
__wakeup |
执行 unserialize()时,先会调用这个函数 |
__toString |
类被当成字符串时的回应方法 |
__invoke |
调用函数的方式调用一个对象时的回应方法 |
__set_state |
调用 var_export()导出类时,此静态方法会被调用 |
__clone |
当对象复制完成时调用 |
__autoload |
尝试加载未定义的类 |
__debugInfo |
打印所需调试信息 |
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号