наследование и статический метод

alex77

Новичок
наследование и статический метод

Здравствуйте!

почему код
PHP:
<?php
class a {
    protected static $p = 0;
    public static function getP() {
        return self::$p;
    }
}
class b extends a {
    protected static $p = 1;
}
echo b::getP();
выводит 0,
а код
PHP:
<?php
class a {
    public static function getP() {
        return self::$p;
    }
}
class b extends a {
    protected static $p = 1;
}
echo b::getP();
выводит
Fatal error: Access to undeclared static property: a::$p in D:\...e.php on line 4
 

dimagolov

Новичок
alex77, ну если не каждый, то через одного, кто начинает рисовать классы пытается сделать предка зависимым от реализации потомков. Откуда такие дурацкие мысли берутся?

Запомни, предки НИКАК не должны быть завязаны на реализацию потомков.
 

dimagolov

Новичок
alex77, ну поспорь :) можешь еще головой об стенку побиться, результат будет тот же.

Ты хочешь потомками менять поведение в предке. такого НЕЛЬЗЯ. НИКАК. СОВСЕМ. Потому что это противоречит основным принципам ООП.

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

alex77

Новичок
Биться не буду :)
Ткните по возможности носом в источник, где об этом написано.
Спасибо.

-~{}~ 04.02.09 18:05:

хотя вот так
PHP:
<?php
class a {
    public function getP() {
        return $this->p;
    }
}
class b extends a {
    protected $p = 1;
}
$b =  new b();
echo $b->getP();
работает.
 

jonjonson

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

Духовность™

Продвинутый новичок
НЕЛЬЗЯ. НИКАК. СОВСЕМ
а если базовый класс является абстрактным, например? просто содержит в себе определенный функционал методов и один из методов оперирует методом подкласса?

PHP:
abstract class parent_
{  
    function __construct(){}

    function run()
    {
        // тут много-много кода который идеально подходит для 
        // потомка и мы его не хотим плодить..............
        echo $this->foo();
    }
}
class child extends parent_
{
    function __construct()
    {
        parent::__construct();
    }

    function foo()
    {
        return 'a';
    }
}

$child = new child();
$child->run();
 

jonjonson

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

alex77

Новичок
у меня от одного класса наследуется 6 других, и надо было, чтобы у всех 6-ти был этот статический метод. Я не хотел копировать одинаковый код во все классы, думал сканает :):):)
 

AmdY

Пью пиво
Команда форума
triumvirat тогда правильно должно быть
PHP:
abstract class parent_ 
{   
    function __construct(){} 

    function run() 
    { 
        // тут много-много кода который идеально подходит для  
        // потомка и мы его не хотим плодить.............. 
        echo $this->foo(); 
    } 
    abstract function foo();
}
alex77
твой код немного видоизменённый будет работать в php 5.2.7
 

x-yuri

Новичок
Ты хочешь потомками менять поведение в предке. такого НЕЛЬЗЯ. НИКАК. СОВСЕМ. Потому что это противоречит основным принципам ООП
dimagolov слепое следование принципам ООП ни к чему хорошему не приводит (http://www.phppatterns.com/docs/design/hello_world_in_patterns)

alex77 попробуй рассказать, что у тебя там за 6 классов которые от кого-то там наследуются и что за статический метод тебе нужен
 

alex77

Новичок
класс группы Group
у группы есть поля
абстрактный класс поле Field
от него наследуется
FieldInteger
FieldString
FieldText
FieldRichText
FieldPrice
FieldDecimal
у каждого класса поля есть статич. метод getElementsByOwner(Group $group)
который возвращает массив объектов полей, относящихся к этой группе.
я хотел его написать 1 раз в классе Field, таким образом он был бы у всех потомков.
всё.
 

AmdY

Пью пиво
Команда форума
alex77 зачем тебе ООП, если ты не готов его использовать. Зачем тебе статические методы там, где нужно иметь объект с состояниям
 
Сверху