子类的PHP依赖注入

时间:2015-03-19 19:01:11

标签: php

我是php oop的新手,我正在尝试以正确的方式学习它,所以我对下面的代码有两个问题:

  1. 当我创建对象Circle和Square时,我通过Circle和Square的构造函数传递Database对象。通过这样做,我是在内存中创建和使用一个Database对象还是两个Database对象?我问这个是因为当我包含这些对象的print_r数组时,我得到了这两个:

    [connection:Database:private] =>资源ID#4

  2. 从依赖注入的角度来看,这是一个很好的做法吗?

  3. 代码:

    <?php
    
    class Database{
    
        public $server = "localhost";
        private $user = "root";
        private $pass = "mysql";
        private $db = "ao";
        private $connection;
    
        function __construct(){
            $this->openConnection();
        }
    
        public function openConnection(){
            $this->connection = mysql_connect($this->server, $this->user, $this->pass);
            if(!$this->connection){
                die("Could not connect: " . mysql_error());
            }
            else{
                $db = mysql_select_db($this->db, $this->connection);
                if(!$db){
                    die("Could not connect: " . mysql_error());
                }
            }
        }
    
        public function closeConnection(){
            if (isset($this->connection)){
                mysql_close($this->connection);
                unset($this->connection);
    
            }
        }
    
        public function query($sql){
            $result = mysql_query($sql, $this->connection);
            $this->confirmQuery($result);
            return $result;
        }
    
        public function fetchAssoc($result){
            return mysql_fetch_assoc($result);
        }
    
        public function numRows($result){
            return mysql_num_rows($result);
        }
    
        private function confirmQuery($result){
            if(!$result){
                die("Query failed: " . mysql_error());
            }
        }
    }
    
    $database = new Database;
    
    ?>
    
    <?php
    
        include("db.class.php");
    //////////////////////////////////////////////////////
        abstract class GeoShape{
    
            private $db;
    
            abstract public function area();
        }
    //////////////////////////////////////////////////////
        class Circle extends GeoShape{
    
            private $r = 5;
    
    
            public function __construct(Database $db){
                $this->db = $db;
            }
    
            public function area(){
                return $this->r * $this->r * 3.14;
            }
    
        ::
    //////////////////////////////////////////////////////////
        class Square extends GeoShape{
    
            private $s = 5;
    
    
            public function __construct(Database $db){
                $this->db = $db;
            }
    
            public function area(){
                return $this->s * $this->s;
            }
    
        }
    
        $objects = array(new Circle($database), new Square($database));
    
        foreach ($objects as $object){
            echo "Area of the " . get_class($object) . ": " . $object->area() . "<br>";
        }
    
    ///////////////////////////////////////////////////////////////
        echo "<pre>";
        print_r($objects);
    
    ?>
    

1 个答案:

答案 0 :(得分:1)

默认情况下,在PHP中,作为参数传递给函数的对象将通过引用传递。如果您创建一个数据库实例并传递给这两个类,那么您将只使用单个实例(在大多数应用程序用例中都是可取的)。

作为旁注,您应该将构造函数放在GeoShape类中,以将传递的DB对象设置为local属性。现在,您在每个具体类中复制此代码。您还在抽象类中将$ db定义为private,这意味着继承类无法访问此属性。这可能不受私密保护。

另外,如果你正在努力学习正确的方法&#34;做事情,你应该非常清楚地知道使用mysql_*方法并不是正确的方式&#34;。这些是不推荐使用的方法(请参阅PHP文档中的大读取警告)。