PHP:使用彼此函数的类?

时间:2010-04-07 13:21:43

标签: php class dependency-injection

我已经遇到过这个问题已经有一段时间了,并且已经在Stackoverflow问了一些关于它的问题。我有一些建议,但我无法理解。有人能为我提供一个顺利合作的课程示例。

我有3个(可能更多)课程:

  • MySQL的
  • 用户
  • 警报

正如我所说,有人可以提供一个例子,所以这些类可以使用其他类的函数,例如:用户可以使用mysql的功能。我想要一个简单的例子,用于学习目的。

请不要谷歌建议或其他问题的链接。我已经尝试过一段时间了。但是没有成功。

Martti Laine

6 个答案:

答案 0 :(得分:4)

我真的建议您先阅读有关课程的内容 - http://php.net/manual/en/language.oop5.php,因为如果您不理解单个代码示例对您没有多大帮助,这些是基本概念。

class Mysql {
    // Public function accessible from everywhere, with class instance
    public function hello() {
        echo '<br>Mysql says Hello';
    }
    // Static function accesible from everywhere, without class instance
    static function bye() {
        echo '<br>Mysql says Bye';
    }
}

class User {
    // Public function accessible from everywhere, with class instance
    public function hello() {
        $mysql = new Mysql();
        $mysql->hello();
        Mysql::bye();
    }
}

class Alert {
    // Static function accesible from everywhere, without class instance
    static function hello() {
        $user = new User();
        $user->hello();
    }
}

$user = new User();
$user->hello();

Mysql::bye();

Alert::hello();

答案 1 :(得分:2)

当你说“一起工作顺利”时,很难理解你的意思。类可以以多种方式一起使用。如果他们不能,那么面向对象的编程就不会那么好了。

这是一个简单的例子:

class mysql {
    private $alert;
    public function __construct(alerts $alert) {
        $this->alert = $alert;
    }

    public function dosomething() {
        if(/* something went wrong */ ) {
            $this->alert->showAlert();
        }
    }
}

答案 2 :(得分:0)

有两种方法可以做到。

第一名:使用静态方法

<?php
class mysql_database
{
    public static function query($q)
    {
        return mysql_query($q);
    }
}

class user
{
    public function get()
    {
        //calling static method from another class
        return mysql_database::query("SELECT * FROM users");
    }
}
?>

第二:将对象实例作为参数提供给其他对象方法

<?php
class mysql_database
{
    public function query($q)
    {
        return mysql_query($q);
    }
}

class user
{
    public function get($DB)
    {
        //calling method using given instance
        return $DB->query("SELECT * FROM users");
    }
}

$DB = new mysql_database();
$user = new user();
$user->get($DB);
?>

答案 3 :(得分:0)

你可以顺利地:

  • 在另一个类中对一个对象进行Instanciate
  • 将对象实例传递给另一个:这称为依赖注入
  • 使用静态函数调用

在所有大型PHP应用程序中,我看到了所有3个应用程序的混合。 它们的使用取决于整个应用程序的设计,使用,重构可测试性需求等等。

答案 4 :(得分:0)

课程应该协同工作以达到预期的效果。如果您正在寻找特定依赖注入或其他方法,那么在大多数OOP文献中都会对它们进行解释。

但是如果让我们说你的Mysql类暴露了一些将由你的用户类使用的函数,你可以在实例化时将一个Mysql类的实例注入你的用户类:

class User {

private $db = null;

public function __construct($mysql) {
  $this->db = $mysql
}

public function getUserName($userID){ 
   $sql = "SQL_QUERY";
   $result = $this->db->ExecuteQuery($sql);
}

}

请确保您阅读了依赖注入的CONS并理解为什么这种方法比其他方法更受欢迎。如果您将Mysql类更改为DBClass而不破坏现有代码,则必须实现相同的方法。这可能会变得更加“复杂”,因此可能需要仔细设计(您的类可能需要扩展抽象类或实现接口)....

我建议你花一些时间在文学上并研究一些模式以获得一个整体的想法..这足以让你开始(在我看来是一个很好的起点)

答案 5 :(得分:0)

以下是另一个例子。

class MySql
{
   private function query($q)
   {
      return mysql_query($q);
   }

   public function checkCredentials($user, $pass)
   {
      $query = "" // add code here to check the user credentials
      $result = query($query);

      $outcome = <true/false>;//based on however you analyze your result
      return $outcome;
   }
} 

class alert
{
  public function generateAlert($alert)
  {
    //code to display your alert
  }
}

class user
{
  var $mysql;
  var $alert;

  public function __construct($mysql, $alert)
  {
    $this->mysql = $mysql;
    $this->alert = $alert;
  }

  public function checkLogin($user, $pass)
  {
    if (!$this->mysql->checkCredentials($user, $pass))
       $this->alert->generateAlert("login failed!");
  }
}

有很多方法可以进行面向对象的设计,它实际上取决于项目的要求。我还建议访问PHP站点并查看他们的OOP教程。