如何在PHP OOP中正确调用函数

时间:2014-11-19 15:45:11

标签: php oop

我正在尝试在PHP中学习更好的OOP,并且我一直在努力解决这个问题,现在需要一些帮助。我使用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的文件中)调用它,它在名为add_to_cart()的函数中扩展DatabaseObject,如下所示:

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

static:create();正在调用该函数,但是当它到达

$attributes = $this->sanitized_attributes();

它没有调用我的DatabaseObject类中的sanitized_attributes函数

    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()&#34;中得到回声&#34;以及echo&#34; table&#34; .static:table_name,它确实显示要保存的正确表。我没有得到echo $ sql,也没有得到&#34; In Sanitized&#34;。如果我取出static:create()行,它会继续没有问题,并在我的返回$ amazon语句中显示信息。 我的问题是,我怎么能从add_to_cart()函数中正确调用create函数? 如果你打算对我的问题进行投票,你能否解释一下为什么我不再重复同样的错误?谢谢!

1 个答案:

答案 0 :(得分:2)

由于您正在静态调用create,因此您必须静态调用同一类的任何其他方法,因为您不使用&#34;实例&#34;该类的静态版本。

我不知道其余代码的结构,但您可以将static::create()更改为$this->create(),将内部的静态调用更改为调用$this或更改{{1转到$this->sanitized_attributes()

另外在另一个注意事项中,您应该避免使用全局变量。因为你去OOP你应该练习正确的依赖注入并将这些全局变量传递到你的类而不是使用static::sanitized_attributes()