PHP OOP问题,并附一个例子



我知道对此有一些问题,但我需要一个更"具体"的示例
和解决方案。

这是我的示例
databse.class.php

class db{ 
   public function connect($conStr){...} 
} 

函数.class.php

func class{ 
   public insert_song(){ 
      //ineed to use the conenct method from database 
      //then I would INERT INTO... 
   } 
}

问题:
1) 我应该要求或扩展func类中的db类吗
2) 如果我需要,db类函数的作用域会保留吗?(比如说,如果我有一个私有变量,它可以从外部访问吗?)

  • 不,您不应该要求或扩展数据库类
  • 不,私有变量或方法永远不会在类之外可用。受保护的变量只能用于子类,公共变量是。。。公众

您可以在配置中的某个位置需要数据库类所在的文件,这样您就可以随时随地实例化数据库类。但是,由于您可能只需要数据库对象的一个实例,您可以在配置中实例化它,并使用依赖项注入传递它。

这基本上意味着将数据库对象传递给其他需要数据库对象的对象。处理数据库对象的一种常见方法是使用构造函数注入,尽管setter注入也可以。

你所做的与此类似:

// config:
$db = new Database;
$db->setConnectionValues();
$fooClass = new Foo($db);
$fooClass->insertSomething();
// fooClass:
class Foo
{
    private $db;
    public function __construct(Database $db)
    {
        $this->db = $db;
    }
    public function insertSomething()
    {
        $this->db->query("INSERT");
    }
}

这解决了大部分依赖性问题。

// changed the class name, func is not good for a class name.
class Foo {
   protected $db;
   public setDb($db) {
     $this->db = $db;
   }
   public insert_song(){ 
      //ineed to use the conenct method from database 
      //then I would INERT INTO...
      $this->db->insert(...); 
   } 
}

示例:

// omited the error handling.
$db = new db();
$db->connect();
$foo = new Foo();
$foo->setDb($db);
$foo->insert_songs();

作为抽象的一部分,您应该将类的职责分开。Database类应该关心Songs(应该这样命名)类。

如果Songs类使用Database类,则应将其注入构造函数中,如下所示:

<?php
class Database {
    public function connect($conStr) {
        /*
         * Connect to database here
         */
    }
}
class Songs {
    private $db;
    public function __construct(Database $db) {
        $this->db = $db;
    }
    public function insert_song($song) {
        /*
         * Now you can use $this->db as your database object!
         */
    }
}

最新更新