Как правильно вызвать функцию в PHP ООП

0

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

    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 (в файле с именем 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
    Пожалуйста, начните свое ООП приключение с правильного отступа.
  • 0
    Мне трудно следовать вашему коду за короткое время и без особого контекста, но ... вы уверены, что правильно используете ключевое слово static ?. Помимо объявления статических членов и методов, это относительно «новая» вещь в php, больше похожая на исправление (она должна достигать вершины иерархии классов из базового класса, чтобы извлечь наиболее производный метод или значение). .. Почему бы просто не "this-> create ()"? Определите абстрактный метод "get_table" в вашем базовом классе и сделайте так, чтобы производные классы реализовали его, в create просто выполните "this-> get_table ()", и все готово ...
Теги:
oop

1 ответ

2

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

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

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

  • 0
    Спасибо за ваш ответ DigitalFiz, я реализовал static :: sanitized_attributes (так как, когда я попытался $ this-> create, он не работал), я получил свое эхо в Sanitized. Мой глобальный передает информацию о соединении, так как я должен передать это в мой класс?
  • 0
    Я предполагаю, что если $ this-> create не работает, то вы, вероятно, вызываете add_to_cart статически? Как я уже сказал, я думаю, что вы, возможно, вырезали большую часть кода, чтобы кто-нибудь действительно мог сказать, что не так. Если add_to_cart вызывается статически, то каждый метод в том же классе должен вызываться статически также при использовании через метод create. Это один из способов запутать вас при смешении статической / нестатической методологии. На мой взгляд, вам следует избегать статических звонков, если это не связано с простыми или конкретными вещами.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню