1.demo1
实例
<?php //命名空间 namespace _1205; class Temp{ } //实例化 $obj1 = new Temp(); $obj2 = new Temp(); //输出 var_dump($obj1, $obj2); echo '<br>'; //输出$obj1跟$obj2是否相等 var_dump($obj1 === $obj2); echo '<hr>'; // 单例模式原理 class Demo1{ // 构造方法私有化 private function __construct(){ } // 目前 只能在类中的内部将类实例化 // 当前类的实例 public static $instance = null; // 实例化当前类的方法 public static function getInstance(){ // 实例化当前类,并返回类实例/对象 // 判断当前类是否已经被实例化过了,如果没有的话就实例化,如果已实例化,就返回它 if (is_null(self::$instance)) { //静态调用$instance=实例化本身 self::$instance = new self(); } //返回$instance return self::$instance; } // 禁用克隆魔术方法 private function __clone(){ } } //静态调用Demo1类里的getInstance()方法 $obj1 = Demo1::getInstance(); $obj2 = Demo1::getInstance(); //输出$obj1是否跟obj2相等 var_dump($obj1 === $obj2); echo '<br>'; //输出$obj1和$obj2 var_dump($obj1, $obj2); echo '<hr>'; // 单例模型应用场景 class Db{ // 构造方法私有化 private function __construct(...$connectParams){ //定义PDO的3个参数 $dsn = $connectParams[0]; $username = $connectParams[1]; $password = $connectParams[2]; //实例化PDO,把值传给$pdo self::$pdo = new \PDO($dsn, $username, $password); } // 目前 只能在类中的内部将类实例化 // 当前类的实例 public static $pdo = null; // 实例化当前类的方法 public static function getInstance(...$connectParams){ // 实例化当前类,并返回类实例/对象 // 判断当前类是否已经被实例化过了,如果没有的话就实例化,如果已实例化,就返回它 if (is_null(self::$pdo)) { // 构造函数不需要返回 new self(...$connectParams); } //如果已经实例化就返回$pdo return self::$pdo; } // 禁用克隆魔术方法 private function __clone(){ } } echo '<hr>'; //连接数据库 $connectParams = ['mysql:host=localhost;dbname=test2', 'root', 'root']; //静态调用Db类的getInstance方法 $pdo = Db::getInstance(...$connectParams); //查询结果输出 print_r($pdo->query('SELECT * FROM `user`')->fetchAll());
运行实例 »
点击 "运行实例" 按钮查看在线实例
2.demo2
实例
<?php //命名空间 namespace _1205; // 工厂模式: 用于批量创建类的实例/对象 use mvc\Facade; //创建类 class Demo2{ } // file1.php $obj = new Demo2(); // file2.php $obj = new Demo2(); // file3.php $obj = new Demo2(); /********************************************/ //创建类 class Test1{ //构造方法 public function __construct($arg1){ //输出内容 echo '对象创建成功, 参数是: ' . $arg1; } } //创建类 class Test2{ //构造方法 public function __construct($arg1, $arg2){ //输出内容,把数组合为一个字符串 echo '对象创建成功, 参数是: ' . implode(', ', [$arg1, $arg2]); } } //创建类 class Test3{ //构造方法 public function __construct($arg1, $arg2, $arg3){ //输出内容,把数组合为一个字符串 echo '对象创建成功, 参数是: ' . implode(', ', [$arg1, $arg2, $arg3]); } } // 工厂类, 专用于创建类实例 class Factory{ //创建静态方法 public static function create($className, ...$argments){ //返回实例化 return new $className(...$argments); } } //echo Test1::class; // _1205\Test1: 完整的类名, 带有命名空间的 // 用工厂类来创建类实例/对象 //静态调用Factory的create方法,静态调用Test1,参数为class,值为100 Factory::create(Test1::class, 100); echo '<br>'; //静态调用Factory的create方法,静态调用Test2,参数为class,值为100,200 Factory::create(Test2::class, 100, 200); echo '<br>'; //静态调用Factory的create方法,静态调用Test3,参数为class,值为100,200,300 Factory::create(Test3::class, 100, 200, 300);
运行实例 »
点击 "运行实例" 按钮查看在线实例
3.demo3
实例
<?php //命名空间 namespace _1205; // 工作类 class Person{ // 要依赖的外部对象 private $car = null; // 在构造方法中将依赖的外部对象全部实例化 // 注入点放到构造方法中 public function __construct(){ //实例化Car传值给本类的$car $this->car = new Car(); } // 外部对象执行一个动作 public function work(){ //调用car的drive方法 return $this->car->drive(); } } // 依赖的外部类 class Car{ //创建drive方法 public function drive(){ //返回字符串内容 return '开车去上班'; } } // 实例化类 $person = new Person(); //输出内容 echo $person->work(); echo '<hr>'; /*******************************************/ //创建类 class Person1{ // 要依赖的外部对象 private $car = null; // 在构造方法中将依赖的外部对象全部实例化 // 注入点放到构造方法中 public function __construct(Car $car){ //外部获取的 $car值传给本类的car $this->car = $car; } // 外部对象执行一个动作 public function work(){ //调用外部的drive方法 return $this->car->drive(); } } // 依赖的外部类 class Car1{ //创建drive方法 public function drive(){ //返回字符串内容 return '开车去上班'; } } // 实例化类 $car = new Car(); //实例化Person1类,参数为$car $person = new Person1($car); //调用Person1里的work方法 echo $person->work(); echo '<hr>';
运行实例 »
点击 "运行实例" 按钮查看在线实例
4.demo4
实例
<?php //命名空间 namespace _1205; //加载数据页 require 'Product.php'; require 'Maker.php'; // 创建类 class Client1{ // 输出商品与制造商 public function show(){ // 创建产品的实例 $product = new Product(); // 创建制造商的实例 $maker = new Maker(); // 制造商注入到产品类中 return $product->get($maker); } } // 客户端调用 echo (new Client1())->show();
运行实例 »
点击 "运行实例" 按钮查看在线实例
5.使用容器
实例
<?php //命名空间 namespace _1205; //加载 require 'Product.php'; require 'Maker.php'; require 'Container.php'; // 创建类 class Client2{ // 输出商品与制造商 public function show(Product $product, Maker $maker){ // 制造商注入到产品类中 return $product->get($maker); } } // 客户端调用 // 将类实例绑定到容器中并实例化且返回 $container = new Container(); // 将实例化代码绑定到容器中 $container->bind('product', function () {return new Product();}); $container->bind('maker', function () {return new Maker();}); // 创建类实例并返回 $product = $container->make('product'); $maker = $container->make('maker'); //输出并实例化调用方法 echo (new Client2())->show($product, $maker);
运行实例 »
点击 "运行实例" 按钮查看在线实例
总结
通过例子,知道了单例和工厂方法,还有服务容器的原理,可以增加扩展性。