PHP: классы для использования функций друг от друга? - PullRequest
2 голосов
/ 07 апреля 2010

Я уже давно занимаюсь этой проблемой и задавал несколько вопросов здесь Stackoverflow.У меня есть несколько советов, но я просто не могу этого понять.Может ли кто-нибудь предоставить мне пример классов, слаженно работающих вместе.

У меня есть 3 (может быть, больше) классов:

  • mysql
  • user
  • alert

Как я уже сказал, кто-то может привести пример, чтобы эти классы могли использовать функции друг от друга, например, пользователь мог использовать функции mysql.Я прошу простой пример, для учебных целей.

И, пожалуйста, никаких гугл-предложений или ссылок на другие вопросы.Я пытался найти это уже некоторое время.Но безуспешно.

Марти Лайн

Ответы [ 6 ]

4 голосов
/ 07 апреля 2010

Я действительно рекомендую вам сначала прочитать о классах - 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();
2 голосов
/ 07 апреля 2010

Трудно понять, что именно вы имеете в виду, когда говорите «гладко работать вместе»Классы могут использоваться вместе множеством способов.Если бы они не могли быть, тогда объектно-ориентированное программирование было бы не очень хорошим.

0 голосов
/ 07 апреля 2010

следующий пример.

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 и посмотреть их учебники по ООП.

0 голосов
/ 07 апреля 2010

Классы должны работать вместе, чтобы достичь желаемого результата. Если вы ищете внедрение зависимости, в частности, или другие методы, они объясняются в большинстве публикаций ООП.

Но если, скажем, ваш класс 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 of Dependency Injection и понимаете, ПОЧЕМУ этот метод предпочтительнее других. Если вы хотите изменить класс Mysql на DBClass и не нарушать существующий код, вам придется реализовать те же методы. Конечно, это может стать более «сложным», поэтому может потребоваться тщательный дизайн (ваши классы могут расширять абстрактные классы или реализовывать интерфейсы) ....

Я предлагаю вам потратить некоторое время на литературу и изучить некоторые закономерности, чтобы получить общее представление ... этого достаточно, чтобы начать работу (на мой взгляд, хорошая отправная точка)

0 голосов
/ 07 апреля 2010

Вы можете плавно:

  • Создание экземпляров объекта из одного класса в другом
  • Передача экземпляра объекта в другой: это называется внедрением зависимости
  • Использовать статические вызовы функций

Во всех больших PHP-приложениях я вижу смесь всех трех. Их использование зависит от всей конструкции приложения, использования, рефакторинга потребностей тестируемости и т. Д.

0 голосов
/ 07 апреля 2010

Есть два способа сделать это.

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

2-й: Предоставить экземпляры объектов в качестве параметров другим методам объектов

<?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);
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...