Почему не вызываются родительские конструкторы? - PullRequest
3 голосов
/ 03 июня 2011

Я добавил в parent::__construct(); конструкторы таблицы и закладки, чтобы этот код работал. Почему они не вызываются автоматически?

Если я создаю объект типа закладка, $obj_ref_bo = new bookmark(); не следует закладывать, а также создавать объекты из каждого из его родительских классов (кроме абстрактных классов).

Цепочка вызовов

bookmark-> table-> база данных (реферат) -> single_connect

    /*single_connect*/

class single_connect
  {
  protected static $_db_pointer = NULL;
  private function __construct()
    {
    $this->_db_pointer = mysql_connect(DB_HOST, DB_USER, DB_PASS);
    mysql_select_db(DB_DATABASE);
    }
  public static function get_connection()
    {
    if(self::$_db_pointer == NULL)
      {
      return new self();
      } 
    else
      {
      echo "Error:only one connection";
      }
    }
  }

/*database*/

abstract class database
  {
  protected function __construct()
    {
    single_connect::get_connection();
    }
  static protected function query($query)
    {
    $result = mysql_query($query) or die(mysql_error());
    return $result;
    }
  }

/*table*/

class table extends database
  {
  public $_protected_arr=array();
  protected function __construct()
    {
    parent::__construct();
    $this->protect();
    }
  protected function protect()
    {
    foreach($_POST as $key => $value)
      {
      $this->_protected_arr[$key] = mysql_real_escape_string($value);
      }
    }
  }

/*bookmark*/

class bookmark extends table 
  {
  function __construct()
    {
    parent::__construct();
    $this->start();
    }   
  function start()
    {
    if(this->test())
      {
      this->insert();
      }
    else
      {
      return 1;
      }
    }
  function test()
    {
    if(this->test_empty())
      {
      return 1;
      }
    else
      {
      return 0;
      }
    }
  function test_empty()
    {
    if(text::test_empty($this->_protected_arr)) 
      {
      return 1;
      }
    else
      {
      return 0;
      }
    }
  function insert()
    {
    $url =  $this->_protected_arr['url'];
    $title =  $this->_protected_arr['title'];
    $email = $_SESSION['email'];
    database::query("INSERT INTO bo VALUES ('$title', '$url', '$email')");
    }
  }

Ответы [ 2 ]

8 голосов
/ 03 июня 2011

не должен создавать закладки, а также создавать объекты из каждого из его родительских классов

Это полностью ваш выбор, нет требования в языке для вызовародительские методы.

Как кратко изложено в руководстве по PHP:

Примечание: Родительские конструкторы не вызываются неявно, если дочерний класс определяет конструктор.Для запуска родительского конструктора требуется вызов parent::__construct() внутри дочернего конструктора.

- http://php.net/oop5.decon

1 голос
/ 03 июня 2011

В то время как Java будет вызывать конструктор no-arg родительского класса, если вы не вызываете его специально, PHP не имеет такой возможности.Это позволяет вам выполнить некоторую работу перед вызовом родительского конструктора, хотя вы, очевидно, не должны зависеть от каких-либо свойств, установленных родительским конструктором.;)

Кстати, как я уже говорил в комментарии, большинство ваших вызовов, использующих self::, должны использовать вместо него $this->.Только статические методы вызываются с использованием self::.

...