PHP:使用彼此函数的类?

PHP:使用彼此函数的类?,php,class,dependency-injection,Php,Class,Dependency Injection,我已经研究这个问题有一段时间了,在这里问了一些问题。我有一些建议,但我就是不明白。有没有人能给我举一个班级合作顺利的例子 我有3门课(可能更多): mysql 使用者 警报 正如我所说的,有人可以提供一个例子,让这些类可以使用其他类的函数,例如,用户可以使用mysql的函数。我要一个简单的例子,用于学习目的 请不要用谷歌的建议或其他问题的链接。我已经试着搜索了一段时间了。但是没有成功 玛蒂·莱恩(Martti Laine)当你说“合作顺利”时,很难准确理解你的意思。类可以以多种方式一起使用。

我已经研究这个问题有一段时间了,在这里问了一些问题。我有一些建议,但我就是不明白。有没有人能给我举一个班级合作顺利的例子

我有3门课(可能更多):

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

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


玛蒂·莱恩(Martti Laine)

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

下面是一个简单的例子:

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

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

有两种方法可以做到这一点

1:使用静态方法

<?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);
?>

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

<?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);
?>

我真的建议您首先阅读有关类的内容,因为如果您不理解单个代码示例,这些都是基本概念,对您没有多大帮助

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();
classmysql{
//通过类实例,可以从任何地方访问公共函数
公共函数hello(){
echo'
Mysql说你好'; } //静态函数可从任何地方访问,无需类实例 静态函数bye(){ echo'
Mysql说再见'; } } 类用户{ //通过类实例,可以从任何地方访问公共函数 公共函数hello(){ $mysql=newmysql(); $mysql->hello(); Mysql::bye(); } } 类警报{ //静态函数可从任何地方访问,无需类实例 静态函数hello(){ $user=新用户(); $user->hello(); } } $user=新用户(); $user->hello(); Mysql::bye(); 警报::你好();
您可以顺利地:

  • 从一个类实例化另一个类中的对象
  • 将一个对象实例传递到另一个实例:这称为依赖项注入
  • 使用静态函数调用
在所有大型PHP应用程序中,我看到了这三种应用程序的混合。
它们的使用取决于应用程序的整体设计、使用、重构和可测试性需求等。

类应该协同工作以实现预期的结果。如果您正在寻找特定的依赖项注入或其他方法,大多数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);
}

}
请确保您阅读了依赖项注入的缺点,并理解为什么此方法优于其他方法。如果您希望将Mysql类更改为DBClass,并且不破坏现有代码,那么您必须实现相同的方法。当然,这可能会变得更“复杂”,因此可能需要仔细设计(您的类可能必须扩展抽象类或实现接口)


我建议你花些时间在文献上,研究一些模式来获得一个整体的想法。这就足够让你开始了(我认为这是一个很好的起点)

下面是另一个例子

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!");
  }
}
classmysql
{
私有函数查询($q)
{
返回mysql\u查询($q);
}
公共函数检查凭据($user,$pass)
{
$query=”“//在此处添加代码以检查用户凭据
$result=query($query);
$output=;//基于您分析结果的方式
返回$结果;
}
} 
类警报
{
公共函数generateAlert($alert)
{
//显示警报的代码
}
}
类用户
{
var$mysql;
var$alert;
公共函数构造($mysql,$alert)
{
$this->mysql=$mysql;
$this->alert=$alert;
}
公共函数checkLogin($user,$pass)
{
如果(!$this->mysql->checkCredentials($user,$pass))
$this->alert->generateAlert(“登录失败!”);
}
}

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

我建议您在上阅读OOP基础知识,编写一些代码,并在遇到问题时将这些代码与问题一起发布。有几十种方法可以回答这个问题,但没有一种是“正确”的答案。作为OOP领域的新手,我完全理解你想要的答案。似乎很多例子都太复杂了,当你只想看到日常使用中几个类之间的简单交互时,就开始使用抽象类和接口。谢谢,事实上我对类有些了解,但不太了解:D回答不错:)