面向對象

【類和對象的基本使用】
類的聲明
調用 屬性、方法php

    //聲明類

    class Cat
    {
        //定義屬性
        public $name = '咪咪';
        public $sex = null;
        //定義方法
        public function jiao()
        {
            echo '喵喵~';
        }
    }

    //實例化
    $c1 = new Cat();
    var_dump($c1);

    //調用 屬性、方法
    echo $c1->name;
    $c1->jiao();

    $c1->sex = '母';
    echo $c1->sex;

傳遞賦值和引用賦值數組

    $a = 'abc';

    $b = $a;//傳遞賦值
    $c = &$a;//引用賦值

    var_dump($a);//abc
    var_dump($b);//abc
    var_dump($c);//abc

    $a = 'qq';

    var_dump($a);//qq
    var_dump($b);//abc
    var_dump($c);//qq

對象的傳遞賦值函數

    class MyClass
    {
        public $str = 'abc';
    }

    $a = new MyClass(); //$a 存的是對象的標識符

    $b = $a;//傳遞賦值 把標識符 賦值給 $b


    var_dump($a);//$str = 'abc'
    var_dump($b);//$str = 'abc'

    $a->str = '456';//對象的屬性改變了
    //$a $b 存的 還是 對象標識符
    var_dump($a);//str = '456'
    var_dump($b);//str = '456'


    $a = 123;
    var_dump($a);//int 123
    var_dump($b);//對象標識符str = '456'

對象的引用賦值this

    class MyClass
    {
        public $str = 'abc';
    }

    $a = new MyClass(); //$a 存的是對象的標識符

    $b = &$a;//引用賦值 把$a的引用 賦值給 $b

    var_dump($a);//str = 'abc'
    var_dump($b);//str = 'abc'

    $a->str = '123';
    var_dump($a);//str = '123'
    var_dump($b);//str = '123'

    $a = 123;
    var_dump($a);//int 123
    var_dump($b);//int 123

【封裝】
訪問控制 public protected privatespa

    class MyClass
    {
        public $a = 'public';
        protected $b = 'protected';
        private $c = 'private';
        
        public function test()
        {
            //類內部調用
            echo $this->a;//public
            echo $this->b;//protected
            echo $this->c;//private
        }
    }


    $obj = new MyClass;
    //類外  以 對象的方式調用
    echo $obj->a;//public
    echo $obj->b;//報錯
    echo $obj->c;//報錯

    $obj->test();

構造函數:對象被實例化時調用code

    class MyClass
    {
        public function __construct()
        {
            echo '調用了__construct <br>';
        }
    }

    $obj1 = new MyClass;//調用了__construct
    $obj2 = new MyClass();//調用了__construct

析構函數:對象被銷燬時調用對象

    class MyClass
    {
        public function __destruct()
        {
            echo '對象被銷燬了';
        }
    }

    $obj = new MyClass();

    $obj = null;//對象被銷燬了
    unset($obj);//對象被銷燬了
    exit('結束掉');//結束掉對象被銷燬了

靜態屬性與靜態方法 staticblog

    class MyClass
    {
        public static $a = 'static';
        
        public $b = '123123';
        
        public static function func1()
        {
            echo '靜態方法調用';
            echo MyClass::$a;
            echo self::$a;
            echo '<hr>';
            MyClass::func2();
            echo '<hr>';
            self::func2();
            //不能夠用$this去調用
            //echo $this->$a;//Fatal error
            //$this->func2();
        }
        public static function func2()
        {
            echo 'this is static func2';
        }
        
        public function func3()
        {
            echo 'this is func3';
            echo '靜態屬性';
            echo MyClass::$a;
            echo self::$a;
            echo '<hr>';
            echo MyClass::func2();
            echo self::func2();
            
            //echo $this->a;//去調用靜態屬性 失敗
            $this->func2();
        }
        
    }

    echo MyClass::$a;
    echo MyClass::$b;//非靜態調用失敗
    MyClass::func1();

    $obj = new MyClass();
    echo $obj->a;//對象使用-> 去調用靜態屬性 失敗
    echo $obj->b;
    $obj->func1();
    $obj->func3();

常量const繼承

    class MyClass
    {
        public static $a = 'abc';
        const NUM = 123;
    }


    echo MyClass::$a;
    echo MyClass::NUM;

    MyClass::$a = 'def';
    echo MyClass::$a;

    MyClass::NUM = 456; //報錯,常量一經定義不能修改

屬性的重載:不可訪問的屬性接口

    class Person
    {
        public $name='小芳';
        protected $age=18;//protected不可在外部訪問

        //觸發了不可訪問的屬性
        public function __get($n)
        {
            if($n == 'age'){
                return $this->age;
            }else{
                return '瞎問什麼啊';
            }

        }
        
        public function __set($n,$v)
        {
            echo '觸發了設置不可訪問的屬性'.$n.'值爲'.$v;
            $this->$n = $v;
        }
        
        public function __isset($n)
        {
            echo '判斷一個不可訪問的屬性是否存在'.$n;
        }
        
        public function __unset($n)
        {
            echo '銷燬一個不可訪問的屬性'.$n;
        }
        
    }

    $xiao = new Person();

    echo $xiao->age;//18
    echo $xiao->xxx;//瞎問什麼啊

    $xiao->age = 11;//設置不可訪問的屬性age值爲11
    echo $xiao->age;//11

    isset($xiao->age);//判斷一個不可訪問的屬性是否存在age
    unset($xiao->age);//銷燬一個不可訪問的屬性age
    isset($xiao->age);//判斷一個不可訪問的屬性是否存在age

方法重載:不可訪問的方法

    class MyClass
    {
        
        protected function func($n)
        {
            echo '這是一個不可訪問的方法';
            echo '參數是'.$n;
        }
        
        public function __call($name,$arg)
        {
            echo '觸發了不可訪問的方法';
            var_dump($name);//方法名稱  func
            var_dump($arg);//參數
    //        array(2) {
    //                [0] =>
    //          string(3) "aaa"
    //                [1] =>
    //          int(123)
    //        }
        }

        protected static function func2()
        {
            echo '受保護的靜態方法';
        }
        
        public static function __callStatic($name,$arg)
        {
            echo '調用了不可訪問的靜態方法';
            var_dump($name);//func2
            var_dump($arg);
    //        array(4) {
    //                [0] =>
    //          int(1)
    //          [1] =>
    //          int(2)
    //          [2] =>
    //          int(3)
    //          [3] =>
    //          int(4)
    //        }
        }
    }

    $obj = new MyClass();
    $obj->func('aaa',123);
    //觸發了不可訪問的方法

    MyClass::func2(1,2,3,4);
    //調用了不可訪問的靜態方法

【繼承】
類的繼承

    class FatherClass
    {
        public $a = 'public';
        protected $b = 'protected';
        private $c = 'private';
        
        public function func1()
        {
            echo 'public func';
        }
        
        protected function func2()
        {
            echo 'protected func';
        }
        
        private function func3()
        {
            echo 'private func';
        }
    }


    class SonClass extends FatherClass
    {
        public function test()
        {
            $this->func1();//public方法能夠被繼承
            $this->func2();//protected方法能夠被繼承
            //$this->func3();//Fatal error:private方法不能夠被繼承
        }
    }

    $obj = new SonClass();
    echo $obj->a;//public
    //echo $obj->b;  //fatal error
    //echo $obj->c;     //Notice

    //$obj->func1();
    //$obj->func2();  //fatal error
    //$obj->func3();   //fatal error

    $obj->test();
    //public func protected func

類的重寫

    class Father
    {
        public function shuo()
        {
            echo 'a a o o';
        }
    }

    class Son extends Father
    {
        public function shuo()
        {
            echo 'hello';
        }
        
        public function test()
        {
            $this->shuo();
            parent::shuo();
        }
    }

    $obj = new Son();
    $obj->shuo();//hello
    $obj->test();//helloa a o o

final 修飾類 則該類不能被繼承

    class Father
    {
        final public function test()  //final 聲明以後不能被重寫
        {
            echo 'hello';
        }
    }

    class Son extends Father
    {
        
        public function test()
        {
            echo '你好';
        }
    }

    $obj = new Son();
    $obj->test();//報錯

【多態】
抽象類abstract

    abstract class MyAbsClass
    {
        public $name = '張三';
        public $age;
        public function test()
        {
            echo 'hello';
        }
        abstract public function func();
    }

    class ChildClass extends MyAbsClass
    {
        public function func()
        {
            
        }
    }

    abstract class SonClass extends MyAbsClass
    {

    }

接口interface

    interface MyInterface
    {
        const NUM = 123;
        public function func();
        public function test();
    }

    class MyClass implements MyInterface
    {
        public function func(){
            
        }
        public function test(){
            echo 'hello';
        }
    }

    abstract class MyAbsClass implements MyInterface
    {
        abstract function func();
        abstract function test();
    }

【條件約束和自動加載】
接口的繼承

    interface Ainter
    {
        public function func();
    }

    interface Binter extends Ainter
    {
        public function test();
    }



    class MyClass implements Binter
    {
        public function test()
        {
            
        }
        
        public function func()
        {
            
        }
    }

判斷是否屬於某個類的實例

    interface A
    {
        public function func();
    }

    abstract class B implements A
    {
        abstract public function func();
    }

    class C extends B
    {
        public function func()
        {
            echo 'ok';
        }
    }

    class D extends B
    {
        public function func()
        {
            echo '好的';
        }
    }

    /*
    B實現了 A
    C、D繼承自B
    C、D是兄弟
    */

    $obj1 = new C();
    $obj2 = new D();
    $arr = [1,2,3];

    //是否屬於D的實例
    function test(D $n)
    {
        echo 'ok';
    }
    //是否屬於A的實例
    function test2(A $n)
    {
        echo 'ok';
    }

    test($obj2);//ok
    //test($obj1);//不屬於D的實例
    test2($obj1);//ok
    test2($obj2);//ok

自動加載__autoload

    function __autoload($a)
    {
        include 'myclassfolder/'.$a.'.class.php';
    }

    class A extends B
    {
        
    }

註冊自動裝載函數

    function myloader($a)
    {
        include 'myclassfolder/'.$a.'.class.php';
    }
    /*
    有三個參數
    參數1:須要註冊的自動裝載函數
    參數2: 若是沒有找到參數1的函數 是否拋出異常錯誤
    參數3: 是否把參數1的函數添加到隊列之首
    */
    spl_autoload_register('myloader',true,true);

    class A extends B
    {
        
    }

註冊自動裝載類

    class MyLoader
    {
        public static function l($a)
        {
            include 'myclassfolder/'.$a.'.class.php';
        }
    }
    //['MyLoader','l']
    //spl_autoload_register 第一個參數以數組方式傳入
    spl_autoload_register(['MyLoader','l'],true,true);

    class A extends B
    {
        
    }

初始化時自動裝載

    class MyLoader
    {
        public function l($a)
        {
            include 'myclassfolder/'.$a.'.class.php';
        }
        
        public function init(){
            //['MyLoader','l']
            //spl_autoload_register 第一個參數以數組方式傳入
            spl_autoload_register([$this,'l'],true,true);
        }
    }

    $obj = new MyLoader();
    $obj->init();
    class A extends B
    {
        
    }

【命名空間】
命名空間(函數案例)

    namespace A;
    function time(){
        echo 'my time function <br>';
    }


    namespace B;
    function time(){
        echo 'my space B time function <br>';
    }


    time();// namespace B time()
    \A\time();// namespace A time()
    \B\time();// namespace B time()
    echo \time(); //    \全局空間

命名空間(類案例)

    namespace A\B;
    class MyClass
    {
        public function __construct()
        {
            echo '空間A\B 中的類 實例化了 <br>';
        }
    }

    namespace A;
    class MyClass
    {
        public function __construct()
        {
            echo '空間A 中的類 實例化了 <br>';
        }
    }

    $obj = new MyClass();// 非限定名稱
    $obj = new \A\B\MyClass();// 徹底限定名稱
    $obj = new \A\MyClass();// 徹底限定名稱
    $obj = new B\MyClass();//限定名稱

打印當前命名空間

    echo __NAMESPACE__;
相關文章
相關標籤/搜索