После перехода на PHP5 - Call to a member function...

  • Автор темы Balancer
  • Дата начала

Balancer

Guest
После перехода на PHP5 - Call to a member function...

Есть такой примерно код:

DataBase.php
Код:
    class DataBase
    {
        var $dbh;
        var $result;
        var $row;
        var $db_name;

        function DataBase($base,$login=NULL,$password=NULL,$server=NULL)
// ...
                    $this->dbh = @mysql_pconnect($server, $login, $password);
Есть другой класс, который использует первый:
Код:
    class HTS
    {
        var $dbh;
        
        function HTS()
        {
            $this->dbh=new DataBase('HTS');
        }

// ...

                if($to_host = $this->dbh->get_value('hts_host_redirect','from',$host,'to'))
                    $host = preg_replace("!^$host$!i","$to_host",$host);

// ...


}
В PHP4 всё работало ок.
После перехода на PHP5 в строке с if() стала выпадать ошибка:

Fatal error: Call to a member function get_value() on a non-object in /home/airbase/html/inc/funcs/HTS.php on line 72

С чем это может быть связано? :-(

Код не менялся, в PHP4 всё ок.
 

confguru

ExAdmin
Команда форума
DataBase.php
должен быть обьявлен ранее...
И зачем так рано переходить? Лучше сходить на конференцию и задать вопросы докладчикам по PHP5 :)
 

Balancer

Guest
Ранее объявлен.

Порылся я тут - как я понял, одноимённые функции больше конструкторами классов не являются? (тесты показали, что после их переименования в __construct всё работает). Но тогда PHP5 пока идёт лесом - если свои классы я поправлю без особых проблем, то что с тем же Smarty делать? :-/

-~{}~ 01.09.04 23:56:

А на PHP5 я перейти хочу, т.к. в нём нет бага PHP из-за которого MySQL 4.1.3 и 4.1.4 не видит чарсетов:
Код:
.File 'NONEXISTENT/charsets/?.conf' not found (Errcode: 2)
.Character set '#33' is not a compiled character set and is not specified in the 'NONEXISTENT/charsets/Index'
file
.File 'NONEXISTENT/charsets/?.conf' not found (Errcode: 2)
.Character set '#33' is not a compiled character set and is not specified in the 'NONEXISTENT/charsets/Index'
file
.File 'NONEXISTENT/charsets/?.conf' not found (Errcode: 2)
.Character set '#33' is not a compiled character set and is not specified in the 'NONEXISTENT/charsets/Index'
file
.File 'NONEXISTENT/charsets/?.conf' not found (Errcode: 2)
Лог забивается десятками и сотнями мегабайтов этого мусора. Разработчики MySQL утверждают, что проблема именно в PHP. И, действительно, в PHP5 с этим всё ок.
 

confguru

ExAdmin
Команда форума
Бред...
про
.File 'NONEXISTENT/charsets/?.conf' not found (Errcode: 2)
.Character set '#33' is not a compiled character set and is not specified in the 'NONEXISTENT/charsets/Index'
 

Balancer

Guest
Угу, именно. Но факт - в PHP5 этой мути нет, в PHP4 с MySQL 4.1.2 тоже, а PHP4+MySQL 4.1.3 или 4.1.4 - пожалуйста.

Естественно, все возможные варианты решения этой проблемы (вплоть до патчения исходников MySQL) перепробовал - бесполезно.
 

fixxxer

К.О.
Партнер клуба
libmysql или libmysqli?

-~{}~ 02.09.04 01:46:

по поводу non-object - обхявление и реализацию get_value сюда. про конструкторы тут вообще не в тему.

-~{}~ 02.09.04 01:47:

да, желание переходить на пхп5 из-за отсутствия как ты говоришь "баги" с чарсетами - оно несколько странное, не находишь? вообще-то пхп5 это уже несколько другой язык...и ни в коем случае не багфикс:)
 

Balancer

Guest
Всё, проблему чарсетов решил жёсткой чисткой системы - поудаял всё, что касалось MySQL и PHP и установил с нуля. Кривой, конечно, подход и долгий, но сработал.

>по поводу non-object - обхявление и реализацию get_value сюда.

Код:
        function get_value($table,$key_search,$value,$key_res)
        {
            if(is_global_key("get_value($table,$key_search,$value)",$key_res)) 
                return global_key("get_value($table,$key_search,$value)",$key_res);

            return set_global_key("get_value($table,$key_search,$value)",$key_res, 
                $this->get("SELECT `".addslashes($key_res)."` FROM `".addslashes($table)."` WHERE `".addslashes($key_search)."`='".addslashes($value)."'"));
        }
>про конструкторы тут вообще не в тему.

Именно они в тему. Я уже проверил, одноимённые с именем класса функции конструкторами не являются. Т.е. при создании объекта класса автоматически не вызываются.

По этой же причине и Smarty не работает.

>да, желание переходить на пхп5 из-за отсутствия как ты говоришь "баги" с чарсетами - оно несколько странное, не находишь?

Вообще-то, между причинами и поводами есть некоторая разница :) Проблема с чарсетами - это только повод. Причины же обычные - хочется иметь больше возможностей, новые особенности и т.д. и т.п.
 

Screjet

Новичок
Покажи конфиг с которым собран ПХП5.

зы. Когда ради любопытства на апач установил mod_php5 был очень приятно удивлен, что все разработки работают правильно. Хотя все приложения разрабатывались под пхп4.
Разработчики пхп5 молодцы!
 

csa

Guest
Автор оригинала: Balancer
если свои классы я поправлю без особых проблем, то что с тем же Smarty делать? :-/
унаследовать от него класс и в конструкторе этого класса вызывать конструктор смарти?
 

fixxxer

К.О.
Партнер клуба
да ну?

код
PHP:
<?

class foo {
  function foo()
  {
    echo phpversion();
  }
}

$bar = new foo;

?>
вывод

5.0.1-dev
 

Balancer

Guest
унаследовать от него класс и в конструкторе этого класса вызывать конструктор смарти?
Smarty - это отнюдь не один класс. И "внутри себя" оно классы принудительно не оптимизирует.

Конфиг - какой конфиг, когда сборка была на уровне
./configure && make && make install ?

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

voodoo

Новичок
про .File 'NONEXISTENT/charsets/?.conf' not found (Errcode: 2)
никаких багов нигде нет.
просто пхп-шный мусклевый клиент про кодировки ничего не знает.
Поэтому надо просто собрать ПХП с внешней, родной МуСКЛевой библиотекой.
т.е.
./configure --with-mysql=/usr/local/ (или-где-оно-там), а не
./configure --with-mysql

В 5-ом ПХП МуСКЛевый клиент из ПХП выкинут.

-~{}~ 02.09.04 16:08:

php.net/mysql :
"Кроме того, в PHP 4, при включении директивы без указания пути к папке установки MySQL, PHP будет использовать встроенную библиотеку MySQL-клиента. "

-~{}~ 02.09.04 16:20:

ну и (оттуда же)
"Note: If you need charsets other than latin (default), you have to install external (not bundled) libmysql with compiled charset support. "
rtfm, в общем
 

Balancer

Guest
>т.е.
>./configure --with-mysql=/usr/local/

Свой файл php-make я не меня, как была там именно эта строчка (среди прочих --with-...") так и осталась. Но после "чистки" - всё прошло. В общем - чей-то баг был в связке :)
 

tony2001

TeaM PHPClub
Balancer
все еще не догадался проверить что же у тебя в той переменной, к которой ты обращаешься как к объекту ?
 

Wingely Dog

Guest
А со с неработой одноименных классу конструкторов, таки как быть?

Проблема решается путем ./configure или настройкой в php.ini ?
 

tony2001

TeaM PHPClub
Wingely Dog
>А со с неработой одноименных классу конструкторов, таки как быть?
нет такой проблемы.
соотв-но, никаких настроек тоже нет.
 

Wingely Dog

Guest
а у мя при смене четвертого пхп на пятый, тоже прокты варнингами как у Balancer'a обвалились хотя на четвертом уже около полугода крутятся без проблем, я еще не разбирался в чем проблема (можт и в руках). Но факт есть.
 

Wingely Dog

Guest
Fatal error: Class ArrayIterator must implement interface Traversable as part of either Iterator or IteratorAggregate in Unknown on line 0

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

PHP:
class Iterator
{
    function Iterator()  {    }

    function reset() { die("bla bla bla"); }

    function next() { die("bla bla bla"); }

    function isValid() { die("bla bla bla"); }

    function &getCurrent() { die("bla bla bla"); }
}

class ArrayIterator extends Iterator{
    function ArrayIterator( &$array ){ $this->array =& $array; }
    // дальше идут реализации функций
}
никакагого интерфейса Traversable в системе нет,
может это что-то встроенное?

В любом случае непонятно, чего от меня хотят
 
Сверху