面向对象-----魔术方法和静态属性

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/enjoy_sun_moon/article/details/80972283

魔术方法:

__autoload在类外  一旦实例化不存在的类时  就会调用此函数

__call  调用不存在的方法是调用此方法  在类内部。

__toString   当$a = new a(); 直接echo或者print对象时调用toString();

sleep()    当串行化:serialize()一个对象时会出发sleep魔术方法,要返回一个数组这个数组是你要序列化的数据

wakeup() 当反串行化:unserilze()一个对象的时候回出发啊wakeup魔术方法

sleep返回一个数组,然后过滤属性没有则都返回,结果是:只能用于属性串行和反串行

<?php
header('Content-type:text/html;charset=utf-8');
class A{
    public $name;
    public function test(){
        $b_object = new B();
        $b_object->echo_info();
    }
    public function __toString(){
        echo __FILE__;
    }
    public function __sleep(){
        echo "wp zai sleep"."<br>";
        return array('sa','dd','qq');
    }
    public function __wakeup(){
        echo "wo zai wakeup"."<br>";
        $this->name = "lly";
    }
}
function __autoload($classname){
    require $classname.'.php';//include 'b.php';
}
$a_object = new A();
$a_object->name = "nieweibo";
// $a_object->test();//1.调用autoload()
// echo "<br>";
// echo $a_object."<br>";//2.调用toString
// $handle = fopen('demo.txt',w);//写入本地文件
// fwrite($handle,$arr);
// fclose($handle);
// var_dump($arr)."<br>";
$arr = serialize($a_object);//3.调用sleep()魔术方法  只作用于属性
var_dump($arr);
$arr1 = unserialize($arr);//4.调用wakeup方法   只作用于属性
var_dump($arr1);
var_dump($arr1->test());
?>

静态属性

类内:

self::$name      self指向的是类       跟类有关

$this->name;  $this指向的是实例化的对象     跟对象有关

class Child{
     public $name;
     public static $age = 1;
     public function walk(){
        echo "wo zai walk";
    }
    public static function say(){
        
    }
 }
$a = new Child();
$a -> name = 'lly';
//类外对象调用普通方法
$a->walk();//可以
$a::walk();//可以
//类外对象调用普通属性
echo $a->name;//可以
//类外对象调用静态方法
Child::$age;
$a->say();
$a::say();
//在普通方法里调用静态属性或方法
self::walk()或Child::walk()
self::$age或Child::$age;
//在静态方法里调用普通方法或属性
在静态属性里无法调用普通属性
self::walk()

静态属性:该类的所有对象共享的变量,任何一个该类的对象去访问它时都取到的是相同的值,同样任何一个该类的对象去修改时也都是访问的是同一个变量。

静态方法:就是与类有关的方法。

静态方法注意:在静态方法里无法访问普通属性(没有static的属性),在普通方法里能访问静态属性

下面的类时上面类的具体实现方式

<?php
header("Content-type:text/html;charset=utf-8");
class Child{
    public $name;
    public $arr = array();//定义一个数组
    public static $cont = 100;
    //被静态属性调用的方法
    public function walk(){
        echo __METHOD__;
    }
    public static function funk(){
        echo __LINE__;
    }
    //调用静态方法
    public function say(){
        echo __METHOD__;
        self::eat();
        Child::eat();
    }
    //调用静态属性
    public function sing(){
        echo __METHOD__;
        echo self::$cont;
        echo Child::$cont;
    }
    //被普通方法调用的静态方法
    public static function eat(){
        echo __METHOD__;

    }

    public static function run(){
        self::walk();
    }
    public function drink(){
        $this->arr[]='aa';//用此种方法 给数组赋值
        $this->arr[]='bb';
        $this->arr[]='cc';
        return $this->arr;
    }
}
$a = new Child();
$a->name="lly";

echo '<br>$a->say()模式调用普通方法再调用静态方法====>';
$a->say(); //调用静态方法
echo '<br>$a::say()模式调用普通方法再调用静态方法====>';
$a::say();
echo '<br>$a::sing()模式调用静态属性====>';
$a->sing();//调用静态属性
echo '<br>使用Child::run()模式调用普通方法和属性====>';
Child::run();
echo '<br>使用$a->run()模式调用普通方法和属性====>';
$a->run();
echo '<br>使用$a::run()模式调用普通方法和属性====>';
$a::run();
echo '<br>访问类的属性是数组类型的====>';
var_dump($a->drink());
?>

猜你喜欢

转载自blog.csdn.net/enjoy_sun_moon/article/details/80972283