2014-11-19 2 views
0

Я пытаюсь лучше узнать ООП в PHP, и я пытался решить эту проблему в течение нескольких часов и нуждаюсь в некоторой помощи. Я использую php 5.4, поэтому считаю, что могу использовать позднюю статическую привязку.
У меня есть класс с именем DatabaseObject (database_object.php), который имеет функцию с именем создать что выглядит следующим образом:Как правильно вызвать функцию в PHP OOP

public function create() { 
     echo "in Create() "; 
     global $database; echo "<br> table: ".static::$table_name; 
     $attributes = $this->sanitized_attributes(); 
     $sql = "INSERT INTO " .static::$table_name." ("; 
     $sql .= join(", ", array_keys($attributes)); 
     $sql .= ") VALUES ('"; 
     $sql .= join("', '", array_values($attributes)); 
     $sql .= "')"; echo $sql; 
     if($database->query($sql)) { 
     $this->id = $database->insert_id(); 
     return TRUE; 
     } else { 
     return FALSE; 
     } 
    } 

Я называю это из моей корзины класса (в файле cart_id.php), который расширяет DatabaseObject в функции, называемой add_to_cart(), которая выглядит так:

public function add_to_cart($cart_id,$isbn) { 
     global $database; 
     $isbn = $database->escape_value($isbn); 
     $amazon = Amazon::get_info($isbn); 
     //get cart id if there is not one 
     if (empty($cart_id)) {echo " getting cart_id"; 
     $cart_id = static::get_new_cart_id(); 
     } 
     if(!empty($amazon['payPrice']) && !empty($isbn)) { 
     echo "<br> getting ready to save info"; 
     $cart = new Cart(); 
     $cart->price = $amazon['payPrice']; 
     $cart->qty = $amazon['qty']; 
     $cart->cart_id =$cart_id; 
     $cart->isbn = $isbn; 
     if(isset($cart->cart_id)) { 
      echo " Saving...maybe"; 
      static::create(); 
     } 
     } 

     return $amazon; 
    } 

Статический: create(); является вызовом функции, но когда дело доходит до

$attributes = $this->sanitized_attributes(); 

это не вызов функции sanitized_attributes, которая находится в моем DatabaseObject классе

protected function sanitized_attributes() { 
     echo "<br>in Sanatized... "; 
     global $database; 
     $clean_attributes = array(); 
     //Sanitize values before submitting 
     foreach($this->attributes() as $key=>$value) { 
     $clean_attributes[$key] = $database->escape_value($value); 
     } 
     return $clean_attributes; 
    } 

атрибутов

protected function attributes() { 
     //return get_object_vars($this); 
     $attributes = array(); 
     foreach (static::$db_fields as $field) { 
     if(property_exists($this, $field)) { 
      $attributes[$field] = $this->$field; 
     } 
     } 
     return $attributes; 
    } 

Я получаю эхо «в create()», а также в таблице «echo» .static: table_name, которая показывает правильную таблицу для сохранения. Я не получаю echo $ sql, и не получаю «In Sanitized». Если я выберу статическую: create() строку, она будет продолжена без проблем и покажет мне информацию в моем возвращении $ amazon statement. Мой вопрос: как я должен правильно вызвать функцию create из моей функции add_to_cart()? Если вы собираетесь опросить мой вопрос, не могли бы вы объяснить, почему я не повторяю ту же ошибку снова? Благодаря!

+4

Пожалуйста, начните свое приключение ООП с правильным отступом. – jgroenen

+0

Мне сложно выполнить ваш код за короткое время и с небольшим контекстом, но ... вы уверены, что правильно используете статическое ключевое слово ?. Помимо объявления статических элементов и методов, это относительно «новая» вещь в php, более похожая на исправление (предполагается, что она должна достигать вершины иерархии классов из базового класса для получения наиболее производного метода или значения). .. Почему бы не просто «this-> create()» ?. Определите абстрактный метод get_table в вашем базовом классе и реализуйте его производные классы, создайте просто «this-> get_table()», и все готово ... –

ответ

2

Поскольку вы вызываете создание статически, вам нужно называть любые другие методы одного и того же класса статически, поскольку вы не работаете с «экземпляром» класса, а статическим вариантом его.

я не знаю структуру остальной части кода, но вы можете либо изменить static::create() в $this->create() и статические вызовы внутри создать для вызова $this или изменить $this->sanitized_attributes() к static::sanitized_attributes().

Также на другой ноте вы должны воздерживаться от использования глобальных переменных. Поскольку вы собираетесь ООП, вы должны практиковать правильную инъекцию зависимостей и передавать эти глобальные переменные в свои классы вместо использования global $blah

+0

Спасибо за ваш ответ DigitalFiz, я внедрил статический :: sanitized_attributes (с тех пор, как я пробовал $ this-> create, это не сработало), и я получил свое эхо в Sanitized. Мой глобальный передает информацию о подключении, так как мне передать это в мой класс? – Jim

+0

Я предполагаю, что если $ this-> create didnt работает, то вы, вероятно, вызываете add_to_cart статически? Как я уже сказал, я думаю, что вы, возможно, отключили большую часть кода, чтобы кто-нибудь действительно сказал, что случилось. Если add_to_cart называется статическим, то каждый метод в том же классе должен быть вызван статически и при использовании через метод create. Это один из способов, которым вы можете запутаться при смешивании статической/нестатической методологии. По-моему, вы действительно должны избегать статических вызовов, если это не простое или конкретное. – DigitalFiz

+0

Вы правы, я вызываю его по $ result = Cart :: add_to_cart ($ cart_id, $ isbn); Каков наилучший способ сделать это? – Jim

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