[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: наследование конструкторов классов
maxims
Привет. не силён в ООП unsure.gif так что извините за корявое объяснение проблемы.

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

class MoodleQuickForm_hidden extends HTML_QuickForm_hidden


у HTML_QuickForm_hidden есть конструктор

function HTML_QuickForm_hidden($elementName=null, $value='', $attributes=null)
{
HTML_QuickForm_input::HTML_QuickForm_input($elementName, null, $attributes);
$this->setType('hidden');
$this->setValue($value);
}


(это кстати библиотеки открытого кода PEAR)

дак вот после каких-то изменений на сервере стал выдавать

Fatal error: Call to undefined method MoodleQuickForm_hidden::MoodleQuickForm_hidden() in /var/www/mirror/cdo/lib/pear/HTML/QuickForm/element.php on line 379


если в класса MoodleQuickForm_hidden прописать ручками одноименный метод, то ошибки нет.

Подскажите какие настройка серва отвечают за наследование методов класса?




Спустя 1 час, 54 минуты, 10 секунд (10.09.2010 - 06:47) maxims написал(а):
ещё пример

class B 
{
function B()
{
echo 'constructor B<br>';
}
}



class A extends B
{

}



$d = new A;

$d->A();


локальная машина:
Цитата
constructor B
constructor B


сервер:
Цитата
constructor B
Fatal error: Call to undefined method A::A() in /var/www/mirror/cdo/1.php on line 20

Спустя 1 час, 44 минуты, 18 секунд (10.09.2010 - 08:31) linker написал(а):
Ты вызываешь метод, которого не существует в принципе. Видимо на твоей локальной тачке стоит допотопный четвертый пхп и в нем действительно конструктор совпадает с названием класса. На серваке имхо PHP 5.x, поэтому конструкторы там объявляются так
class B
{
public function __construct()
{
}
}

Спустя 25 минут, 53 секунды (10.09.2010 - 08:57) maxims написал(а):
на локальном 5.2.4 на сервере 5.3.3

5.3.3 является универсальной и поддерживает скрипты всех предыдущих версий.
далее при установке CSM Moodle (собственно в которой сейчас проблема) идёт проверка версии пхп и если бы версия не подходила, то он бы просто не установился.

Спустя 4 минуты, 6 секунд (10.09.2010 - 09:01) ZSH написал(а):
class A extends B 
{
public function __construct()
{
parent::B();
}
}

Спустя 2 минуты, 49 секунд (10.09.2010 - 09:04) linker написал(а):
Разрабы CMS часто криворуки по натуре. PHP 5.3 значительно отличается от своих предшественников. Ты пишешь
$d->A()
но такого метода действительно не существует.

Это
public function __construct()
{
parent::B();
}
лишнее, надо
class B 
{
public function __construct()
{
echo 'constructor B<br>';
}
}


class A extends B {}
Класс A унаследует конструктор класса B. Кроме случаев
class B 
{
public function __construct()
{
echo 'constructor B<br>';
}
}


class A extends B
{
public function __construct()
{
parent::__construct();
echo 'constructor A<br>';
}
}

Спустя 5 минут, 45 секунд (10.09.2010 - 09:09) ZSH написал(а):
Цитата
но такого метода действительно не существует.


а таки да rolleyes.gif

Спустя 14 минут, 43 секунды (10.09.2010 - 09:24) maxims написал(а):
нашёл интересный пост в сети

Цитата
Версии 5.3.х для любителей хождения по граблям.

Поставьте PHP 5.2.распоследний и все будет как у нормальных людей

Ну в крайнем случае попробовать 5.3.2

PS 5.3.1 вообще непригоден для эксплуатации.

Спустя 11 минут, 59 секунд (10.09.2010 - 09:36) linker написал(а):
Хождение по граблям - это писать неадекватный код. Если метода нет, то его нет и его надо определить - это адекватное программирование.

Спустя 32 минуты, 41 секунда (10.09.2010 - 10:09) maxims написал(а):
Цитата (linker @ 10.09.2010 - 06:36)
Хождение по граблям - это писать неадекватный код. Если метода нет, то его нет и его надо определить - это адекватное программирование.

я же не буду теперь переписывать всю CMS там более 7000 файлов blink.gif , в моём случае проше пхп откатить до 5.2.х

Спустя 52 минуты, 10 секунд (10.09.2010 - 11:01) linker написал(а):
В твоем - да, только откат и подготовка к переходу на что-нибудь менее кривописанное.

Спустя 33 минуты, 41 секунда (10.09.2010 - 11:35) maxims написал(а):
я думаю что новые версии мудла будут более универсальные, но я так долга не буду работать с данной CMS ))))))

Спустя 11 часов, 6 минут, 20 секунд (10.09.2010 - 22:41) linker написал(а):
Кстати по поводу PHP 5.3.3 из официального пресс-релиза, как раз для вашего случая:

Methods with the same name as the last element of a namespaced class name will no longer be treated as constructor. This change doesn't affect non-namespaced classes.
<?php
namespace Foo;
class Bar {
public function Bar() {
// treated as constructor in PHP 5.3.0-5.3.2
// treated as regular method in PHP 5.3.3

}
}

?>
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.