• 面向对象(二)


    ========关键字======

    一、const   类常量(修饰属性)

    <?php
        header("Content-type: text/html; charset=utf-8");
        class Person{
            private $name;    
            const HOST = 'localhost';//定义常量,最好是大写,前面没有$符号    
            
            public function __construct($name='',$age=18){
                $this->name = $name;
                $this->age = $age;
            }
            
            public function say(){
                echo "my name is {$this->name}";
            }
        }    
        
        $p1 = new Person("lisi",25);
        $p1->say();
        echo Person::HOST;//类常量是属于类的,不能用对象调用,只能用类调用
    ?>

    二、static     静态成员(修饰属性和方法)

    1、静态属性和方法,在加载类的时候就分配空间,所以不需要实例化就可以直接访问

    2、静态成员在内存中就一份,是属于类的,所以调用方法是  类::成员

    3、静态方法是不能访问普通变量和方法,只能访问静态成员。因为静态方法是在加载类的时候就分配空间,
         普通变量是在实例化对象的时候,才分配空间

    三、final    最终版本(修饰类和方法)

    final class Person{//定义了final关键字,该类不能被继承
            private $name;    
            public function say(){
                echo "my name is {$this->name}";
            }
        }    
        
        class Tt extends Person{//报错,不能继承
            
        }
    //    ----------------------------------------
        class Person1{
            private $name;    
            final public function say(){//定义了final关键字,该方法不能被重写或继承
                echo "my name is {$this->name}";
            }
        }    
        
        class Tt extends Person{
            public function say(){//报错,不能继承或重写
                
            }
        }

    ==========设计模式=========

    一、单例模式

    一个类只有一个对象

    三私一公:

    (1)、私有的变量,用来接受内部造出的对象

    (2)、私有的构造函数,用来防止外部实例化对象

    (3)、私有的克隆方法,防止外部克隆

    (4)、公有的方法:用来获得内部造出的对象

    class Person{
            private static $obj;
            private function __construct(){//私有化的构造函数的作用是,阻止类的外部实例化
                
            }
            private function __clone(){//私有化的__clone()阻止外部克隆
                
            }
            public static function getObj(){//由于静态方法只能访问静态变量,所以要把上面的$obj设为静态
                if(self::$obj instanceof self){//判断变量是否已经被实例化,如果已经被实例化,则直接返回
                    self::$obj = new self;
                }else{
                    return self::$obj;
                }
                
            }
        }

    二、工厂模式

    通过传递不同的参数,获得不同的对象

    abstract class Product{
            abstract public function getName();
        }
        class ProductA extends Product{
            public function getName(){
                echo "这是A商品<br>";
            }
        }
        class ProductB extends Product{
            public function getName(){
                echo "这是B商品<br>";
            }
        }
        
        class ProductFactory{
            public static function create($num){
                switch($num){
                    case 1:
                        return new ProductA;
                    break;
                    case 2:
                        return new ProductA;
                    break;
                }
                return null;
            }
        }
        $objA = ProductFactory::create(1);
        $objA->getName();
        $objB = ProductFactory::create(2);
        $objB->getName();

    ==========魔术方法==========

    一、__construct:构造方法

    二、__destruct:析构方法

    三、__toString:对对象的说明

    class Person{
            public $name;    
            public $age;    
            
            public function __construct($name='',$age=18){
                $this->name = $name;
                $this->age = $age;
            }
            
            public function test(){
                echo "Person->test()";
            }
            public function __toString(){
                return "this is a object";
            }
        }    
        
        $p1 = new Person("lisi",25);
        echo $p1;

    四、__call:当调用不存在或无权访问的方法时,会自动调用该方法

    <?php
        header("Content-type: text/html; charset=utf-8");
        class Person{
            public $name;    
            public $age;    
            
            public function __construct($name='',$age=18){
                $this->name = $name;
                $this->age = $age;
            }
            
            public function test(){
                echo "Person->test()";
            }
            public function __call($i,$j){//__call()方法必须提供两个参数
                echo "你访问的方法不存在";
            }
        }    
        
        $p1 = new Person("lisi",25);
        $p1->say();//say()方法不存在,所以在调用的时候会报错,为了防止报错,在类中加__call()方法,当调用不存在的方法时,会自动调用该方法
    ?>

    五、__get:当调用无权访问的属性时,自动调用该方法

    class Person{
            private $name;    
            public $age;    
            
            public function __construct($name='',$age=18){
                $this->name = $name;
                $this->age = $age;
            }
            
            public function test(){
                echo "Person->test()";
            }
            public function __get($i){
                echo "你无权访问$i";
            }
        }    
        
        $p1 = new Person("lisi",25);
        $p1->name;

    六、__set:类中某属性,对象无权访问或操作时,自动调用该方法

    <?php
        header("Content-type: text/html; charset=utf-8");
        class Person{
            private $name;    
            public $age;    
            
            public function __construct($name='',$age=18){
                $this->name = $name;
                $this->age = $age;
            }
            
            public function test(){
                echo "Person->test()";
            }
            public function __get($i){
                echo "你无权访问$i";
            }
            public function __set($i,$j){
                echo "你无权设置{$i}为{$j}";
            }
        }    
        
        $p1 = new Person("lisi",25);
        $p1->name;
        $p1->name = "zhangsan";
    ?>

    七、__isset:当用isset()判断一个属性或方法存在与否时,自动触发__isset()

    <?php
        header("Content-type: text/html; charset=utf-8");
        class Person{
            private $name;    
            public $age;    
            
            public function __construct($name='',$age=18){
                $this->name = $name;
                $this->age = $age;
            }
            
            public function test(){
                echo "Person->test()";
            }
            public function __isset($i){
                echo "你无权测试$i是否存在";
            }
        }    
        
        $p1 = new Person("lisi",25);
        $pp = isset($p1->name);
        var_dump($pp);
    ?>

    八、__unset:当用unset()删除一个属性或方法时,自动触发__unset()

    <?php
        header("Content-type: text/html; charset=utf-8");
        class Person{
            private $name;    
            public $age;    
            
            public function __construct($name='',$age=18){
                $this->name = $name;
                $this->age = $age;
            }
            
            public function test(){
                echo "Person->test()";
            }
            public function __unset($i){
                echo "你无权删除{$i}";
            }
        }    
        
        $p1 = new Person("lisi",25);
        unset($p1->name);
    ?>
  • 相关阅读:
    spring中bean的生命周期
    【数据结构与算法】2.2 数组实现循环队列思路、代码
    【数据结构与算法】2.1、数组队列场景、思路、实现
    【Java 基础领域】手气红包实现思路、代码
    【数据结构与算法】1、稀疏数组场景、思路、代码实现
    【Java基础领域】 byte num = 100 没有强制类型转换,为什么也可以编译通过
    【程序人生】程序员发展的7大方向
    【读书笔记】老许的架构
    对于开发中为什么很少用设计模式的思考
    Java编程思想目录
  • 原文地址:https://www.cnblogs.com/zhengleilei/p/9350599.html
Copyright © 2020-2023  润新知