zoukankan      html  css  js  c++  java
  • 面向对象

    【类和对象的基本使用】
    类的声明
    调用 属性、方法

        //声明类
    
        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'

    对象的引用赋值

        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 private

        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();

    构造函数:对象被实例化时调用

        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('结束掉');//结束掉对象被销毁了

    静态属性与静态方法 static

        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()
        Atime();// namespace A time()
        Btime();// namespace B time()
        echo time(); //    全局空间

    命名空间(类案例)

        namespace AB;
        class MyClass
        {
            public function __construct()
            {
                echo '空间AB 中的类 实例化了 <br>';
            }
        }
    
        namespace A;
        class MyClass
        {
            public function __construct()
            {
                echo '空间A 中的类 实例化了 <br>';
            }
        }
    
        $obj = new MyClass();// 非限定名称
        $obj = new ABMyClass();// 完全限定名称
        $obj = new AMyClass();// 完全限定名称
        $obj = new BMyClass();//限定名称

    打印当前命名空间

        echo __NAMESPACE__;
  • 相关阅读:
    SpringBoot:Web开发
    java @Value注解 和 @Data注解
    携程 Apollo 配置中心传统 .NET 项目集成实践
    Spring Boot 整合 JPA 使用多个数据源
    ibatis 核心原理解析!
    Spring Boot 面试,一个问题就干趴下了!
    在Docker中部署Spring Boot项目
    REDIS缓存穿透,缓存击穿,缓存雪崩原因+解决方案
    超全详解Java开发环境搭建
    SpringBoot入门(一):从HelloWorld开始
  • 原文地址:https://www.cnblogs.com/chenyingying0/p/12187828.html
Copyright © 2011-2022 走看看