Вернуться   Дизайнерский форум » ВЕБ-ПРОГРАММИРОВАНИЕ » ASP, Perl, PHP и MySQL

Непонятки с наследованием

Обсуждение темы Непонятки с наследованием в разделе ASP, Perl, PHP и MySQL, часть категории ВЕБ-ПРОГРАММИРОВАНИЕ; PHP код: <? class  One {     function  GetString ()     {         return  "one" ;     }          function  Show ()     {         echo  self :: GetString ...


Закрытая тема
 
Опции темы
Старый 04.02.2010, 09:20   #1
PHP код:
<?
class One
{
    function 
GetString()
    {
        return 
"one";
    }
    
    function 
Show()
    {
        echo 
self::GetString();
    }
}

class 
Two extends One
{
    function 
GetString()
    {
        return 
"two";
    }
}

Two::Show();
?>
Собственно, второй класс наследуется от первого. Во втором классе переопределяется один метод, который дает понять функции Show(), какую строку выводить.
Мне одному кажется, что должно выводить "two"?

Напоролся на эту траблу и не знаю, как ее красиво решить. Не хочу полностью дублировать большой класс с заменой всего одной функции.

Добавлено через 1 час 54 минуты

Хм. Не написал, в чем, собственно, вопрос.

Это баг или фича? И есть ли элегантный способ заставить класс Two выводить "two"?

Добавлено через 16 часов 0 минут

Вопрос решился. Для PHP 5.3 вот так:
PHP код:
<? 
class One 

    function 
GetString() 
    { 
        return 
"one"
    } 
     
    function 
Show() 
    { 
        echo static::
GetString(); 
    } 


class 
Two extends One 

    function 
GetString() 
    { 
        return 
"two"
    } 


Two::Show(); 
?>
Для PHP 5.2 надо ставить костыли.

Последний раз редактировалось Scroll; 04.02.2010 в 09:20.. Причина: Добавлено сообщение
 
Старый 04.02.2010, 09:20
Ссылки
Старый 04.02.2010, 10:23   #2
Вообщето, в объектно ориентированном программировании наследования статических методов не предполагается...

И вообще правильно писать было бы так:

PHP код:
<?  
class One
{  
    public static function 
GetString()  
    {  
        return 
"one";  
    }  
      
    public static function 
Show()  
    {  
        echo static::
GetString();  
    }  
}  

class 
Two extends One  
{  
    public static function 
GetString()  
    {  
        return 
"two";  
    }  
}  

Two::Show();  
?>
ну или лучше так:

PHP код:
<?  
class One
{  
    private static 
$instance;

    public function 
GetString()  
    {  
        return 
"one";  
    }  
      
    public function 
Show()  
    {  
        echo 
$this->GetString();  
    }  

    public static function 
GetInstance()
    {
        if (
One::$instance == nullOne::$instance = new One();
        return 
One::$instance;
    }
}  

class 
Two extends One  
{  
    private static 
$instance;

    public function 
GetString()  
    {  
        return 
"two";  
    }  

    public static function 
GetInstance()
    {
        if (
Two::$instance == nullTwo::$instance = new Two();
        return 
Two::$instance;
    }
}  

Two::GetInstance()->Show();  
?>

Последний раз редактировалось Асмодиан; 04.02.2010 в 10:28..
 
Старый 04.02.2010, 11:36   #3
Угу, public опустил в примере за ненадобностью, static упустил, но его наличие в данном случае никак не влияет на результат.

А вот реализацию на синглтоне обдумывал, но, так как пишу API, решил не усложнять вызов методов:
PHP код:
Two::Show(); 
писать удобнее и нагляднее, чем
PHP код:
Two::GetInstance()->Show(); 
И, как видно из этой статьи (http://www.php.net/manual/en/languag...c-bindings.php), в PHP наследование статических методов - нормальное явление.

Добавлено через 29 минут

На sql.ru убедили, что в данном случае мой подход неверен=) Пожалуй, все-таки перейду на синглтон.

Последний раз редактировалось Scroll; 04.02.2010 в 11:36.. Причина: Добавлено сообщение
 
Старый 04.02.2010, 11:36
Закрытая тема


Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
непонятки с оторбражением шрифта DeCa HTML, CSS, JavaScript 2 01.03.2010 21:59
проблема с наследованием в Css krimeano HTML, CSS, JavaScript 6 03.03.2006 14:34


Текущее время: 00:56. Часовой пояс GMT +4.

Реклама на форуме Условия размещения рекламы
Биржа ссылок Заработай на сайте!
Тарифный план «Lite»
Место: 1000 Мб
Трафик: неограниченный
Панель управления
Заказать ТП «Lite»
Тарифный план «Normal»
Место: 2000 Мб
Трафик: неограниченный
Поддержка скриптов
Заказать ТП «Normal»
Тарифный план «Profy»
Место: 7000 Мб
Трафик: неограниченный
Поддержка скриптов
Заказать ТП «Profy»
Тарифный план «Места хватит!»
Место: 25 ГБ
Трафик: неограниченный
Поддержка SSI, ssh
Заказать ТП «Места хватит!»
Дизайнерский форум