2010-05-27 4 views
0

У меня есть очень простой класс:Basic возвращает класс объекта ссылки вместо массива

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

Это не делает то, что я хочу, чтобы это, но я понимаю, почему ... $ клиент возвращает ссылку на объект клиента. ..

Что я хочу, это массив строк MySQL из mysql_fetch_row() - Как мне вернуть массив?

Что мне не хватает?

+0

Что делает 'print_r()' выход? – alex

+0

print_r() выводит объект клиента –

ответ

2

Вы могли бы использовать ArrayObject (при условии, что вы используете PHP 5.3), чтобы получить то, что вы хотите:

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

Затем вы можете использовать $customer как массив:

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

приведенный выше код print_r ($ customer) ничего не печатает и echo $ customer-> name также ничего не печатает –

+0

Моя ошибка, я думал, что set_customer возвращает строку, но это не так. Я применил пример. – rojoca

3

Конечно. Если вы создадите новый объект, вы вернете ссылку на новый объект. Как еще вы могли бы ссылаться на него?

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

Оператор new всегда будет ссылаться на вновь созданный объект. Вы ничего не можете вернуть от конструктора.

+0

Бинго, туда мы идем. –

+0

Ребята ... Я знаю и понимаю это !!! Вот почему я написал: «Я хочу, это массив строк MySQL из mysql_fetch_row()» Я обновлю сообщение, чтобы поставить вопросительный знак в конце этого предложения ... может быть, тогда я получить обратную связь, которую я ищу. –

+0

@ php-b-grader Вам нужно будет вызвать метод 'set_customer()' на втором шаге вручную, другого выхода нет. Или вы сохраняете результат в переменной экземпляра и читаете его после того, как вы построили объект. В любом случае вам потребуется перестроить свой конструктор. – deceze

0

Поместите результат в общедоступную переменную внутри класса, а затем выполните печать_r на $ customer и не вернетесь в конструктор.

В настоящее время это защищенная переменная, так что вы не будете видеть его с print_r

ли что-то нравится эта работа?

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); 
+0

У меня проблема с тем, как я ссылаюсь на это ... print_r ($ customer) печатает объект Customer, а не $ customer array ... Я могу ссылаться на клиента $ customer-> ... Но Если я откажу $ customer-> customer-> name или $ customer-> customer ['name'] Он печатает: Array-> name или Array ['name'] –

+0

Это не очень хороший способ ООП. –

2

Звуки например, вы хотите использовать статический метод (судя по комментариям) - см. пример в конце.

Я думаю, что вам не хватает «мышления» объекта.

класс Клиент должен быть Объектом - фактическим клиентом. Вы на полпути, но вы берете массив и захлопываете его в пустой объект.

Используйте что set_customer для заполнения вашего объекта - как это (это было напечатано в браузере Кстати, просто получить идею через):

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 

, чтобы соответствовать вашему коду и комментарии:

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); 
+0

Я думаю, что я нахожусь там мысленно ... Я не пропускаю «образ мышления» объекта - мне не хватает «мышления» преобразования объекта в фактическую информацию о клиенте. Вы не вызываете конструктор в методе выше, хотя ??? Это имеет значение? Кроме того, я изначально хотел установить каждое поле, но есть 20-30 полей и думал, что это станет неуправляемым ... Вот почему я начал рассматривать только один объект массива для одной ссылки ... –

+0

Статический метод, нет конструктора, но в основном это дом для функции - это не очень хороший вариант для использования ООП в этом случае. Это больше для функций полезности. Для классов на уровне всего домена, например класса db или шаблона, я бы использовал синглтоны. Вы правы в настройке полей - вот где итерация через них автоматически является благословением. –

1

Как об этом:

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

Тем не менее, кое-что отметить:

  • Класс отсутствует alot (обработка ошибок/исключений для одного).
  • Возможно, вы захотите изучить один из многих ORM's для php.
  • Возможно, вам понадобится заменить mysql_ * с помощью PDO и использовать параметризованные запросы.
+0

I + 1 вас, из-за 'fetch_assoc', но, черт возьми, вы не могли бы сделать это ООП. '$ customer-> getCustomer();' Что, черт возьми, это;) – Gutzofter

+1

@ Gutzofter Я согласен, что $ customer-> getCustomer() не имеет большого смысла. Я снимал для самого прямого ответа на исходный вопрос, не предполагая, что он должен делать вместо этого. –

1

Вот что я думаю, что это более объектно-ориентированный стиль:

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); 
+0

Лучшее имя класса для его поведения –

Смежные вопросы