PHP: birbirinden işlevleri kullanmak Sınıflar?

6 Cevap php

Ben zaten bir süre için bu sorunun içine oldum ve burada StackOverflow bu konuda bazı sorular sordum. Ben bazı tavsiyeler var, ama ben sadece bunu anlayamıyorum. Birisi bana birlikte sorunsuz çalışan sınıfların bir örneği sağlayabilir.

I 3 (belki daha fazla) sınıfları var:

  • mysql
  • kullanıcı
  • uyarılar

Dediğim gibi, birisi bir örnek verebilir, böylece bu sınıflar, örneğin, her bir diğer sınıftan işlevlerini kullanabilirsiniz kullanıcı mysql'in işlevlerini kullanabilirsiniz. Ben öğrenme amaçlı, basit bir örnek için soruyorum.

Ve lütfen, hiçbir google-öneri veya diğer sorulara bağlantılar. Ben zaten bir süre için bu aramak için denedim. Hiçbir başarı, olsa.

Martti Laine

6 Cevap

Eğer tek bir kod örneği size çok yardımcı olmaz anlamıyorum eğer bu temel kavramlar, çünkü http://php.net/manual/en/language.oop5.php - Ben gerçekten ilk sınıfları hakkında okumanızı öneririz.

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

Bu "birlikte sorunsuz çalışıyor" derken ne demek istediğini anlamak zor. Sınıflar bir şekilde sayısız birlikte kullanılabilir. Onlar itiraz sonra olamazdı eğer yönelimli programlama çok iyi olmaz.

İşte basit bir örnek:

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

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

Bunu iki yolu vardır.

1st: Use static methods

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

2nd: Give objects instances as a parameters to other objects methods

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

Sorunsuz yapabilirsiniz:

  • Başka bir mesafede olan bir sınıftan bir nesne Instanciate
  • Başka birinin içine bir nesne örneği Pass: Bu bağımlılık enjeksiyon denir
  • Statik işlev çağrıları kullanın

In all big PHP apps, I see a mix of all 3. Their use depends of the whole design of application, usage, refactoring an testability needs, etc.

Sınıflar istenen sonuca ulaşmak için birlikte çalışma olmalıdır. Eğer belirli ya da diğer yöntemleri bağımlılık enjeksiyon arıyorsanız en çok cepten literatürde açıklanmıştır.

Ama Mysql Class instanstiation üzerine kullanıcı sınıfa MySQL sınıf bir örneğini enjekte olabilir kullanıcı sınıfı tarafından kullanılacak fonksiyonları bir dizi ortaya diyelim eğer:

class User {

private $db = null;

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

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

}

Eğer Bağımlılık Enjeksiyon EKSİLERİNİ okumak ve bu yöntem diğerlerine tercih edilir NEDEN anlamak emin olun. Eğer DBClass için Mysql Class değiştirmek ve mevcut kodu kırmak değil hangi Eğer aynı yöntemleri uygulamak zorunda olacak. Bu yüzden dikkatli Tasarım (sınıflar soyut sınıfları uzatmak veya arabirimleri uygulamak gerekebilir) gerekli olabilir cousre bu daha "karmaşık" alabilirsiniz ....

Ben (benim görüşüme göre iyi bir başlangıç ​​noktası) size başlamak için yeterli .. literatüre biraz zaman geçirmek ve genel bir fikir edinmek için bazı desen çalışması önermek

takip eden başka bir örnektir.

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

Nesne yönelimli tasarım yapmanın birçok yolu vardır, gerçekten proje için gereksinimler nelerdir bağlıdır. Ben de PHP siteyi ziyaret ve cepten öğreticiler arıyor öneriyoruz.