Temel sınıf döner yerine Array referans nesne

6 Cevap php

Ben çok temel sınıf vardır:

class Customer {

  protected $id;
  protected $customer;

  public function __construct($customer_id) {
    $this->id = $customer_id;
    return $this->set_customer();
  }

  protected function set_customer() {
    $query = mysql_query("SELECT * FROM customer WHERE id = '$this->id'");
    $this->customer = mysql_fetch_row($query);
    return $this->customer;
  }
}

$customer = new Customer($order->customer->id);
print_r($customer);

Bu ben istiyorum ne yapıyor değil ama neden ... $ müşteri Müşteri Nesne bir başvuru döndürür anlıyorum ...

Mysql_fetch_row gelen MySQL satır array (Ne istiyorum) - Nasıl dizi dönmek?

Ne eksik?

6 Cevap

Kaldıraç ArrayObject istediğini elde etmek için (PHP 5.3 kullanıyorsanız sağlanan) olabilir:

class Customer extends ArrayObject {

    protected $id;
    protected $customer;

    public function __construct($customer_id) {
        $this->id = $customer_id;
        $this->set_customer();
        parent::__construct($this->customer);
    }

    protected function set_customer() {
       $query = mysql_query("SELECT * FROM customer WHERE id = '$this->id'");
       $this->customer = mysql_fetch_row($query);
    }
}

Sonra $customer bir dizi olarak kullanabilirsiniz:

$customer = new Customer($customer_id);
echo $customer['name'];

Tabii. Yeni bir nesne oluşturmak, yeni nesnesine bir başvuru geri alırsınız. Başka nasıl kendisine referans tutacaktı?

$customer = new Customer();
// if $customer was a data array, where did the object reference go?

new operatörü her zaman yeni oluşturulan nesnenin bir başvuru dönecektir. Sen kurucusundan başka bir şey döndüremez.

Sonunda örneğe bakın - Eğer (yorumlarına bakılırsa) yerine statik bir yöntem istiyorsanız benziyor.

Ben ancak, nesnenin 'zihniyet' eksik düşünüyorum.

gerçek bir müşteri - sınıf Müşteri bir nesne olmalıdır. Sen yolu yarıladık, ancak bir dizi alarak ve boş bir nesne içine çarparak ediyoruz.

Lütfen nesnesini doldurmak için bu set_customer kullanın - Bu gibi (bu sadece karşısında fikir almak, btw yılında tarayıcı yazdığınız):

class Customer {

  public $id;
  public $name;
  public $address;

  public function __construct($customer_id) {
    $this->customer = $this->set_customer($id);
  }

  private function set_customer($id ) {
    $query = mysql_query("SELECT * FROM customer WHERE id = '$id'");
    $customer = mysql_fetch_assoc($query);
    foreach($customer as $field => $value) {
       $this->$field = $value;
    }
  }
}

$customer = new Customer();
print_r($customer); // now has $customer->id, $customer->name, $customer->address

kodunuzu ve yorumlarınızı uygun:

class Customer {

  protected $id;
  public $customer;

  public function __construct($customer_id) {
    $this->id = $customer_id;
    $this->customer = self::get_customer($id);
  }

  public static function get_customer($id ) {
    $query = mysql_query("SELECT * FROM customer WHERE id = '$id'");
    return mysql_fetch_row($query);
  }
}

$customer = Customer::get_customer($id);

Burada bir daha Object Oriented Stil olduğunu düşünüyorum budur:

class CustomerFind {

    public static function byIdNumber($customer_id) {
      $query = mysql_query("SELECT * FROM customer WHERE id = '$customer_id'");
      return mysql_fetch_assoc($query);
    }

}

$customer = CustomerFind::byIdNumber( 1 );
print_r( $customer );

Buna ne dersiniz:

class Customer {

  protected $id;

  public function __construct($customer_id) {
    $this->id = $customer_id;
  }

  public function getAsArray() {
    $query = mysql_query("SELECT * FROM customer WHERE id = '$this->id'");
    return mysql_fetch_assoc($query);
  }
}

$customer = new Customer( $id );
$customer_array = $customer->getAsArray();
print_r( $customer_array );

Bu söz, bir kaç şey söyledi:

  • Sınıf (hata / istisna biri için işleme) çok eksik.
  • Sen ORM's için birçok php birine bakmak isteyebilirsiniz.
  • Sen PDO ile mysql_ * kullanımını değiştirmek ve parametreli sorgular kullanmak isteyebilirsiniz.

Sınıf içinde bir kamu değişkene sonucu koyun ve sonra $ müşteri bir print_r yapmak ve yapıcı dönüş yok.

Şu anda korunan bir değişken, yani alışkanlık print_r ile görmek

Bu iş böyle bir şey yapar?

class Customer {

  protected $id;
  public $customer;

  public function __construct($customer_id) {
    $this->id = $customer_id;
    $this->set_customer();
  }

  protected function set_customer() {
    $query = mysql_query("SELECT * FROM customer WHERE id = '$this->id'");
    $this->customer = mysql_fetch_row($query);
  }
}

$customer = new Customer($order->customer->id);
print_r($customer);