最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • PHP类规则和设计模式

    正文概述 转载于:掘金(陆小天)   2021-07-23   356

    一、类的规则

    1. 一个文件中只能放一个类(必须的)
    2. 文件名和类名同名(必须的)
    3. 类文件以.class.php结尾(不是必须的)

    1.1 手动加载类

    在项目开发中,因为一个文件中只能写一个类,并且在执行过程中会有很多的类参与,我们先演示手动一个个加载类。 项目结构如下:

    php
    ├── Book.class.php
    ├── Goods.class.php
    ├── index.php
    ├── Phone.class.php
    

    Book.class.php代码如下:

    <?php
    // 图书类
        class Book extends Goods {
            public function getName () {
                echo "《{$this->name}》<br/>";
            }
        } 
    ?>
    

    Good.class.php代码如下:

    <?php
        // 商品类
        abstract class Goods {
            protected $name;
            final public function setName ($name) {
                $this->name = $name;
            }
            public abstract function getName();
        }
    ?>
    

    index.php代码如下:

    <?php
    require './Goods.class.php';
    require './Book.class.php';
    require './Phone.class.php';
        // 测试
        $book = new Book();
        $book -> setName('面向对象编程');
        $phone = new Phone();
        $phone -> setName('华为');
        $book -> getName();
        $phone -> getName();
    ?>
    

    Phone.class.php代码如下:

    <?php
        // 电话类
        class Phone extends Goods {
            public function getName () {
                echo $this->name,'<br/>';
            }
        }
    ?>
    

    运行结果如下: PHP类规则和设计模式 可以看到,我们这边一个个的手动去加载类非常的麻烦,下面介绍自动加载类。

    1.2 自动加载类

    在项目开发中,因为一个文件中只能写一个类,并且在执行过程中会有很多的类参与,如果一个一个的加载很麻烦,所以,就需要一个机制实现在PHP执行过程中自动加载需要的类。

    1.2.1 __autoload()函数

    方法一:__autoload()函数 当缺少类的时候自动的调用__autoload()函数,并且将缺少的类名作为参数传递给__autoload()。

    项目结构还是如下:

    php
    ├── Book.class.php
    ├── Goods.class.php
    ├── index.php
    ├── Phone.class.php
    

    改变index.php中的内容如下(其他不改变):

    <?php
    // 自动加载类
    function __autoload ($class_name) {
        require "./{$class_name}.class.php";
    }
        // 测试
        $book = new Book();
        $book -> setName('面向对象编程');
        $phone = new Phone();
        $phone -> setName('华为');
        $book -> getName();
        $phone -> getName();
    ?>
    

    效果如下: PHP类规则和设计模式

    1.2.2 spl_autoload_register()

    注册__autoload()函数 项目结构还是不变。 index.php改为如下:

    <?php
    
    // 方法一
    function loadClass ($class_name) {
        require "./{$class_name}.class.php";
    }
    //注册加载类函数
    spl_autoload_register('loadClass');
    
    // 方法二 
    // spl_autoload_register(function  ($class_name) {
    //     require "./{$class_name}.class.php";
    // });
    
    
        // 测试
        $book = new Book();
        $book -> setName('面向对象编程');
        $phone = new Phone();
        $phone -> setName('华为');
        $book -> getName();
        $phone -> getName();
    ?>
    

    效果: PHP类规则和设计模式 也可以注册多个函数(以队列的形式,先进先出),进行(区分)不同类的加载。

    1.3 类文件存储不规则

    类文件存储不规则的加载方法,将类名和文件地址做一个映射,组成一个关联数组。 代码如下:

    <?php
    spl_autoload_register(function ($class_name) {
        // 类名和文件地址映射成一个关联数组
        $map = array(
            'Goods' => './aa/Goods.class.php',
            'Book' => './bb/Book.class.php',
            'Phone' => './cc/Phone.class.php'
        );
        // 在映射数组中找到就包含
        if (isset($map[$class_name])) {
            require $map[$class_name];
        }
    })
    
        // 测试
        $book = new Book();
        $book -> setName('面向对象编程');
        $phone = new Phone();
        $phone -> setName('华为');
        $book -> getName();
        $phone -> getName();
    ?>
    

    在项目中,绝大部分都是规则存储的,不规则的比较少。

    二、clone和__clone()

    创建对象的方式有哪些? 方法一:实例化 方法二:克隆 例题:

    <?php
    class Student {
    
    }
    $stu1=new Student;
    $stu2=new Student;
    var_dump($stu1,$stu2);
    
    ?>
    

    效果: PHP类规则和设计模式


    <?php
    class Student {
    
    }
    $stu1=new Student;
    $stu2=$stu1;
    var_dump($stu1,$stu2);
    
    ?>
    

    效果: PHP类规则和设计模式


    <?php
    class Student {
    
    }
    $stu1=new Student;
    $stu2=clone $stu1;
    var_dump($stu1,$stu2);
    
    ?>
    

    效果: PHP类规则和设计模式


    __clone()函数在调用clone指令的时候自动调用。 例题:

    <?php
    class Student {
        public function __clone() {
            echo '正在克隆';
        }
    }
    $stu1=new Student;
    $stu2=clone $stu1;
    var_dump($stu1,$stu2);
    
    ?>
    

    效果: PHP类规则和设计模式 小结: 1、clone是创建对象的方法之一 2、当执行clone指令的时候,会自动的调用__clone()方法

    三、设计模式

    3.1 单例模式

    一个类只能有一个对象。 应用场景:多次请求的数据库只需要一个连接对象。 实现:三私一公

    代码:

    <?php
    // 三私一公
    class DB {
        // 私有的静态属性用来保存单例
        private static $instance;
        // 私有的构造方法阻止在类的外部实例化
        private function __construct() {
    
        }
        // 私有的__clone()阻止在类的外部克隆对象
        private function __clone() {
    
        }
        // 公有的方法用来获取单例
        public static function getInstance () {
            if (!self::$instance instanceof self) {
                self::$instance = new self();
            }
            return self::$instance;
        }
    }
    $db1 = DB::getInstance();
    // $db2 = clone $db1;
    $db2 = DB::getInstance();
    var_dump($db1, $db2)
    
    ?>
    

    效果: PHP类规则和设计模式

    3.2 工厂模式

    特点:传递不同的参数调用不同的策略。(方法)

    <?php
        class ProductsA {
    
        }
        class ProductsB {
    
        }
        class Factory {
            public function create($num) {
                switch ($num) {
                    case 1: 
                        return new ProductsA;
                    case 2: 
                        return new ProductsB;
                    default:
                        return null;
                }
            }
        }
    
        // 测试
        $factory = new Factory();
        $obj1 = $factory->create(1);
        $obj2 = $factory->create(2);
        var_dump($obj1, $obj2);
    ?>
    

    效果: PHP类规则和设计模式

    3.3 策略模式

    特点:传递不同的参数调用不同的策略(方法)

    <?php
        class Walk {
            public function way() {
                echo '走着去<br/>';
            }
        }
        class Bus {
            public function way() {
                echo '坐车去<br/>';
            }
        }
        // 策略模式
        class Student {
            public function play ($obj) {
                $obj->way();
            }
        }
        // 测试
        $stu = new Student;
        // $stu->play(new Walk()); // 走着去
        $stu->play(new Bus()); // 坐车去
    ?>
    

    起源地下载网 » PHP类规则和设计模式

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元