欢迎光临
感谢一路有你

OOP面向对象基础-多态/魔术方法

如果你对该文章中的内容有疑问/不解,可以点击此处链接提问
要注明问题和此文章链接地址 点击此处跳转
 

__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 应用接口

  1. 接口不能被实例化
  2. 接口中只 允许有抽象方法和常量
  3. 接口中的方法不能有方法体 抽象方法的abstract 必须省略
  4. 接口可以被继承 但是不能使用extends 必须使用implements
  5. 可以多继承
  6. 继承接口的子类必须重写方法

接口和抽象类的区别

  1. 抽象类里面的方法可以有普通方法,但是接口里面的方法必须都是抽象方法
  2. 抽象类中 可以有属性, 但是接口不能有
  3. 接口可以多继承, 抽象类不能
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);
赞(0) 打赏
未经允许不得转载:王明昌博客 » OOP面向对象基础-多态/魔术方法
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏