如果你对该文章中的内容有疑问/不解,可以点击此处链接提问
要注明问题和此文章链接地址 点击此处跳转
__toString()
把对象当做字符串输出的时候自动调用
要求该对象必须返回一个子符串
作用: 用来调试
__invoke()
把对象当做函数去调用时 自动触发
__call __callStatic
__call($funName, $params)
当调用一个不存在的方法的时候自动调用
参1: 方法名称
参2: 参数 以数组形式
__callStatic($funName, $params)
当调用一个不存在的静态方法的时候自动调用
参1 : 不存在的静态方法名称
参2 : 属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
class Car { public function A(){ echo "我是方法a"; } public function __call($name, $arguments) { print_r($name); // print_r($arguments); echo "没有此方法"; } } //$a = new Car(); //$a ->A1(99,3); // A1 Array ( [0] => 99 [1] => 3 ) echo "<br>"; class Person { public function A(){ echo "我是方法a"; } public static function __callStatic($name, $arguments) { print_r($name);//show print_r($arguments);//Array ( [0] => 11111 [1] => 2222 ) echo "自动调用魔术方法__callStatic"; } } //静态类型的方法用 类名::方法名 调用 Person::show(11111,2222);//show Array ( [0] => 11111 [1] => 2222 ) |
自动加载类
__autoload(他不是一个魔术方法 他是一个函数)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
//自动加载传来的类 function __autoload($className){ echo "自动加载"; // echo $className;//User if(file_exists('./com/'.$className.'.class.php')){ require './com/'.$className.'.class.php'; }else{ die(404); } } $a = empty($_GET['act'])? 'User': $_GET['act']; echo $a ; $p = new $a; |
串行化与反串行化
serialize();串行化
unserialize();反串行化
__sleep() 串行化的时候自动调用 必须返回一个数组
__wakeup() 反串行化的时候自动调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
$arr = array('xx','zz','cc'); $a = serialize($arr); echo $a; //a:3:{i:0;s:2:"xx"; i:1;s:2:"zz"; i:2;s:2:"cc";} $b = unserialize($a); print_r($b); //Array ( [0] => xx [1] => zz [2] => cc ) echo "<br>"; class A { public $name; public $age; public function __construct($name,$age) { $this->name = $name; $this->age = $age; } public function __sleep() { echo "串行化时调用"; return array('name','age');//相当于传进来的变量名去$ } public function __wakeup() { echo "反串行化时调用"; } } $z = new A('小小',18); //echo serialize($z); //串行化时调用O:1:"A":2:{s:4:"name";s:6:"小小";s:3:"age";i:18;} echo "<br>"; $zz = serialize($z); $b = unserialize($zz); print_r($b); //串行化时调用反串行化时调用A Object ( [name] => 小小 [age] => 18 ) |
文件的写入与取出
1 2 3 4 5 |
//字符串写入文件及取出 file_put_contents('./1.log',$zz);//写入文件 $aa = file_get_contents('./1.log'); print_r($aa); |
php 的类型约束
只能用来约束参数的类型, 且只能约束为 <<数组>>或<<对象>>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//数组 function A(array $a){ var_dump($a); } $a = A(array('zz','xx','cc')); print_r($a); //array(3) { [0]=> string(2) "zz" [1]=> string(2) "xx" [2]=> string(2) "cc" } //资源 class A{} class B{} class C extends A{} //实例化 $a = new A(); $b = new B(); $c = new C(); //书写方式(类名 此类的实例化名) function B( A $name ){ var_dump($name); } B($c); |
多态
1 2 |
抽象类 和抽象方法 abstract |
抽象类 :
1. 抽象类中有抽象方法和普通方法
1. 抽象类不能被实例化
3. 抽象方法: 抽象方法 没有方法体
3. 抽象类里面的抽象方法必须在子类中实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
abstract class A { public function aa(){//普通方法 echo "1111"; } abstract public function bb();//没有方法体 } class B extends A { //必须含有抽象类中的方法 public function bb(){ echo '哈哈哈'; } // abstract public function cc();普通类中不能含有抽象方法 } $a = new B; $a -> bb(); //$b = new A; 抽象类不能被实例化 |
接口
类中的接口 inferface 不是 api 应用接口
- 接口不能被实例化
- 接口中只 允许有抽象方法和常量
- 接口中的方法不能有方法体 抽象方法的abstract 必须省略
- 接口可以被继承 但是不能使用extends 必须使用implements
- 可以多继承
- 继承接口的子类必须重写方法
接口和抽象类的区别
- 抽象类里面的方法可以有普通方法,但是接口里面的方法必须都是抽象方法
- 抽象类中 可以有属性, 但是接口不能有
- 接口可以多继承, 抽象类不能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
interface A { const NAME = 'xx'; public function aa();//不能含有方法体 // public function bb();//不能含有方法体 } interface AA { public function aaa();//不能含有方法体 } class B implements A,AA//接口可以多继承 { public function aa(){ echo '哈哈哈'; } public function aaa(){} } //$a = new A;接口不能被实例化 $a = new B(); $a ->aa(); |
多种状态
子类可以继承父类, 可以重写父类的属性和方法
一类可以有多个子类,不同的子类之间,有不同的状态属性
这就是多态
不同的对象 做相同的事情, 得到不同的结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<br />class Meizi { public function meet(Hanzi $obj){ $obj->kiss(); } } interface Hanzi { public function kiss(); } class GFS implements Hanzi { public function kiss(){ echo "我的高富帅,我亲了妹子"; } } $mm = new Meizi; $mm->meet(new GFS); |