如果你对该文章中的内容有疑问/不解,可以点击此处链接提问
要注明问题和此文章链接地址 点击此处跳转
__toString()
把对象当做字符串输出的时候自动调用
要求该对象必须返回一个子符串
作用: 用来调试
__invoke()
把对象当做函数去调用时 自动触发
__call __callStatic
__call($funName, $params)
当调用一个不存在的方法的时候自动调用
参1: 方法名称
参2: 参数 以数组形式
__callStatic($funName, $params)
当调用一个不存在的静态方法的时候自动调用
参1 : 不存在的静态方法名称
参2 : 属性
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(他不是一个魔术方法 他是一个函数)
//自动加载传来的类
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() 反串行化的时候自动调用
$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 )
文件的写入与取出
//字符串写入文件及取出
file_put_contents('./1.log',$zz);//写入文件
$aa = file_get_contents('./1.log');
print_r($aa);
php 的类型约束
只能用来约束参数的类型, 且只能约束为 <<数组>>或<<对象>>
//数组
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);
多态
抽象类 和抽象方法 abstract
抽象类 :
1. 抽象类中有抽象方法和普通方法
1. 抽象类不能被实例化
3. 抽象方法: 抽象方法 没有方法体
3. 抽象类里面的抽象方法必须在子类中实现
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
- 可以多继承
- 继承接口的子类必须重写方法
接口和抽象类的区别
- 抽象类里面的方法可以有普通方法,但是接口里面的方法必须都是抽象方法
- 抽象类中 可以有属性, 但是接口不能有
- 接口可以多继承, 抽象类不能
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();
多种状态
子类可以继承父类, 可以重写父类的属性和方法
一类可以有多个子类,不同的子类之间,有不同的状态属性
这就是多态
不同的对象 做相同的事情, 得到不同的结果
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);