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