Bir PHP iç içe sınıf veya iç içe yöntemleri yapmak nasıl?

4 Cevap php

PHP nasıl yapabilirim

$myDBClass->users()->limit(5);//output you limited users to 5
$myDBClass->comments()->limit(3);//output you limited comments to 3

what I meant is nested methods or nested class (I don't know!) so when I call the limit method as a child of users it will know that I am calling it from "users" method -or class- and when I call limit method -or class!- from comments It also knows that.

Bu işi yapmak için bir PHP sınıfı için olası yapı nedir?


Ben veritabanı için kendi sınıfının üzerinde çalışıyorum çünkü bu sorunun nedeni bu yüzden kolayca böyle bir şey kullanabilirsiniz

     $DB->comments()->id(" > 3")->limit(10);

to generate the sql code "select * from comments where id > 3 limit 10" Thanks

4 Cevap

Anlatılan metodlar ile nesneleri döndürmek, ve sen sonra ne olsun var.

Bu nedenle, sürece $DB a comments()-yöntemi sahip bir nesne olduğu için, bu kısmı geçerlidir. O comments() bir id()-yöntemi vardır bir nesne döndürürse, bu kısmı da geçerlidir. Daha sonra, id() limit()-yöntemi olan bir nesneyi döndürmek için gereklidir.

Belirli bir durumda, böyle bir şey yapmak isteyebilirsiniz:

class DB {
  public function comments() {
    // do preparations that make the object select the "comments"-table...
    return $this;
  }

  public function id($string) {
    // handle this too...
    return $this;
  }

  public function limit($int) {
    // also this
    return $this;
  }

  public function execute() {
    $success = try_to_execute_accumulated_db_commands();
    return $success;
  }
}

$DB = new DB();

Komutlar birlikte zincirleme böylece benim örnekte, her yöntemi (burada da tasvir değil), nesnenin kendisini dönecekti. Veritabanı sorgu inşaat yapıldığında, aslında execute() ki (benim durumumda) veritabanı yürütme başarısını temsil edecek bir boolean dönecekti çağırarak sorgu değerlendirir.

Kullanıcı bu nickohm a {[(0)] olarak adlandırılır} düşündürmektedir. Ben bu benim için yeni bir terim olduğunu itiraf etmeliyim, ama o terimin kullanımını daha, benim bilgi muhtemelen daha söyler. ("I just write code, you know...")

Note: $this şu anda aktif nesneye işaret eden bir 'sihirli' değişkendir. Adından da anlaşılacağı gibi, sadece yöntemi için dönüş değeri olarak kendisini verir.

Bunun için standart bir kongre yöntem çağrısı her sonunda $ bunun örneğini döndürmektir. Çağırana döndüğünde Yani biz o zaman başka bir yöntem çağrısı başvuran.

class Foo
{
  public function do_something()
  { 
    return $this; 
  }

 public function do_something_else() 
 {
   return $this; 
  }
}

$foo->do_something()->do_something_else();

Başlamak için yöntemi uygulamak için basit gibi gidebilir:

class db
{
  public function __call($function, $arguments)
  {
    switch($function) {
      // implement table handling here
      case 'user':
        //do something
        return $something;
        break;
    }
  }
}

Depending on whether or not you want to go complicated, but solid or simple, but less flexible you might implement two different strategies. Simple strategy might go like so:

class db
{

  protected $operatingTable;

  public function limit($limitNumber)
  {
    return $this->executeQuery("SELECT * FROM ".$this->operatingTable." LIMIT ".$limitNumber); // where executeQuery is a function that runs a query
  }

  public function __call($function, $arguments)
  {
    switch($function) {
      // implement table handling here
      case 'user':
        $this->operatingTable='user'; // alternately, but less secure: $this->operatingTable=$function;
        return $this;
        break;
    }
  }
}

Alternatif olarak, ancak daha güçlü:

class db
{
  protected $operatingTable;

  public function limit($limitNumber)
  {
    return $this->executeQuery("SELECT * FROM ".$this->operatingTable." LIMIT ".$limitNumber); // where executeQuery is a function that runs a query
  }

  public function __call($function, $arguments)
  {
    switch($function) {
      // implement table handling here
      case 'user':
        $user = new user($this); // pass in the database to the object, so the table object can have a reference to the db
        return $user;
        break;
    }
  }
}

class baseTableClass
{
  protected $db; // an instance of class db

  function limit($limitNumber)
  {
    $db->execute($aStatementDerivedFromThisClassesInformation); // execute a sql command, based on information about the table in the class
  }

}

class user extends baseTableClass
{
  public function __construct($db) {
    $this->db = $db;
  }
}

Siz anladınız. Db nesnesini aşırı, ya da bir baz db nesnesi oluşturmak ve tablo nesneleri, yarattığı zaman, bir tablo nesnesi db nesnesine bir başvuruyu saklar sağlanması, tablo nesneleri istihbarat çok koyarak Ya

Orada bir zend class Hiç bir referans tür ya da her türlü ihtiyacınız varsa, sizinkine benzer bir şey yapıyor.