Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Глюк со свойствами, PHP5 
:(
    Опции темы
<Spawn>
Дата 9.4.2005, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 2
Всего: 64



Есть такой код(menu.php):

Код

  $connection = new od_mysql_connection(hp_config::get_db_server_addr(), "login", "password", hp_config::DB_DATABASE, true);
  $query = new od_mysql_enum_query($connection);
  $query->sql->text = "SELECT Name, Href FROM hp_menu WHERE level = 0"; <--Ошибка тут
  $mysql_serializer = new od_enum_db_serializer($query);
  $menu_object = new od_homepage_menu($mysql_serializer);
  echo $menu_object->generate();


При его интерпретации возникает следующий еррор:

Fatal error: Cannot access undefined property for object with overloaded property access

Хотя по идее такого быть не должно - $query->sql возвращает ссылку на обьект, у которого есть свойство text. И если этот код разделить на:

Код

  $sql = $query->sql;
  $sql->text = "SELECT Name, Href FROM hp_menu WHERE level = 0";


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

Вот коды доступа к соответствующим элементам нерабочей конструкции smile :

mysql_enum_query:

Код

    public function __get($name)
    {
      switch ($name)
      {
        case self::PROP_CONNECTION: return $this->f_connection;
        case self::PROP_SQL: return $this->f_sql;  <----------------------------------
        case self::PROP_FETCH_COUNT: return $this->f_fetch_count;
        case self::PROP_FETCHED_ALL: return $this->f_fetched_all;
        case self::PROP_FETCHED_ROWS: return $this->f_fetched_rows;
      }
    }


sql:

Код

    public function __set($name, $value)
    {
      switch ($name)
      {
        case self::PROP_TEXT: $this->set_text($value); break; <-----------------------------
      }
    }


Может у кого есть какие идеи по ликвидации данной проблемки?


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Mal Hack
Дата 9.4.2005, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



Цитата
$query->sql возвращает ссылку на обьект, у которого есть свойство text. И если этот код разделить на:

Если разделишь, то ссылка видна, а если нет, где ссылка? Ранее ты в $sql где-ть объект пишешь?
Дай описание $sql посмотреть.
Добавлено @ 16:34
Как вариант, но на счет работоспособности не проверял. 5 ПХП нету.
$query-> (object) { "sql" }->text
PM ICQ   Вверх
<Spawn>
Дата 9.4.2005, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 2
Всего: 64



text это свойсво обьекта od_custom_sql.

Вот его небольшой код(Этот самый $sql, т.е. предок $sql-я, но в нем определяется свойство text):

Код

abstract class od_custom_sql extends od_object
  {
    const PROP_TEXT = "text";
    const PROP_QUERY_TYPE = "query_type";

    const C_QT_SELECT = 0;
    const C_QT_DML = 1;
    const C_QT_DDL = 2;
    const C_QT_UNKNOWN = 3;

    protected $f_text;
    protected $f_query_type;

    public function __construct($text)
    {
      $this->f_query_type = self::C_QT_UNKNOWN;
      (!empty($text)) ?
        $this->set_text($text) :
        $this->f_text = "";
    }

    protected function calc_query_type()
    {
      $sql_text = strtoupper($this->f_text);
      switch (true)
      {
        case (ereg("SELECT", $sql_text, $arr)):
        {
          $this->f_query_type = self::C_QT_SELECT;
          break;
        }
        case (ereg("INSERT|UPDATE|DELETE", $sql_text, $arr)):
        {
          $this->f_query_type = self::C_QT_DML;
          break;
        }
        case (ereg("ALTER|CREATE|DROP", $sql_text, $arr)):
        {
          $this->f_query_type = self::C_QT_DDL;
          break;
        }
        default: $this->f_query_type = self::C_QT_UNKNOWN;
      }
    }

    abstract protected function parse();

    abstract public function set_param_by_name($name, $value);

    protected function set_text($text)
    {
      $this->f_text = $text;
      $this->calc_query_type();
      $this->parse();
    }

    public function __get($name)
    {
      switch ($name)
      {
        case self::PROP_TEXT: return $this->f_text;
        case self::PROP_QUERY_TYPE: return $this->f_query_type;
      }
    }

    public function __set($name, $value)
    {
      switch ($name)
      {
        case self::PROP_TEXT: $this->set_text($value); break;
      }
    }
  }



То есть реально происходит следующее действие:

Код

$sql->set_text("SELECT Name, Href FROM hp_menu WHERE level = 0");


Мне кажется, что это недоработка PHP 5(Может в версии поновее нормально все). Если бы $object->sql была переменной, а не свойством, то все работалоб в сокращенном вариантеsmile.

Это сообщение отредактировал(а) <Spawn> - 9.4.2005, 19:37


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.1377 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.