как предовратить переопределение в дочерних классах, свойст - атрибтов в родительском

texrdcom

Новичок
как предовратить переопределение в дочерних классах, свойст - атрибтов в родительском

как предовратить переопределение в дочерних классах, свойст - атрибтов в родительском классе,
PHP:
class test
{
final $tr='bla';
function __construct()
{
echo $this->tr;    
}    
}
Выдает ошибку что финал только для методов,
хотя в мане:
Разместив перед объявлениями методов или свойств класса ключевое слово "final", вы можете предотвратить их переопределение в дочерних классах.
Ну да бог с ним но как все таки предовратить. С private мы содержания закрываем атрибута, но если в дочерном классе будет такойже атрибут то не какой ошибки не выдает.
Цель предовратить создания итендичных атрибутов-свойств в дочерных классах!
 

texrdcom

Новичок
ну абалдеть доку поправят :) лутче бы движок переписали :)
ведь хорошая фишка !.
Интерестно как в других языках oop типа жабы есть прикол такой для свойств или нет ?
 

_RVK_

Новичок
ак все таки предовратить
PHP:
<?php
class a
{
    private $tr;
    
    function __construct()
    {
        $this->tr = 1;
    }
    
    function get_tr() {
        return $this->tr;
    }
}

class b extends a {
    
    function get_tr() { //кстати не обязательно
        return parent::get_tr(); 
    }

    function set_tr($val) {
        return $this->tr = $val;
    }
}

$b = new b();

print $b->get_tr();
$b->set_tr(2);
print $b->get_tr();
?>
 

texrdcom

Новичок
Да я понимаю, но надо чтобы error викидывало, и как бы прозрачно как final, вот и подумал может как то можно php средствами но видать не как, за пример спасибо.
p/s
За private (свойства атрибута) я писал в вопросе :)
 

_RVK_

Новичок
texrdcom
Можно и еррор :)

PHP:
class a
{
    private  $tr;
    
    function __construct()
    {
        $this->tr = 1;
    }
    
    function get_tr() {
        return $this->tr;
    }
}

class b extends a {
        
    function __set($var, $value) {
        trigger_error($var.' (c) class a', E_USER_WARNING);
    }
}

$b = new b();

print $b->get_tr();
$b->tr = 2;
print $b->get_tr();
 

texrdcom

Новичок
За приват атрибута я писал в вопросе :)
Смотри мне надо так написать родительский класс чтобы он был максимально закрыт для сыновьего класса, но не заставлял сыновьей класс дописывать кучу обезательного!.
Например для метода задаем final и все, юзер не сможет перезаписать, вот блин и для атрибута надо такое!.

-~{}~ 28.12.05 01:48:

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

_RVK_

Новичок
неугомонный... вот еще максимальнее

PHP:
class a
{
    private  $tr;
    
    function __construct()
    {
        $this->tr = 1;
    }
    
    function get_tr() {
        return $this->tr;
    }
    
    function __set($var, $value) {
        trigger_error('(c) class a', E_USER_WARNING);
    }
}

class b extends a {
        
    function set_tr($val) {
        $this->tr = $val;
    }
}

$b = new b();

print $b->get_tr();
$b->set_tr(2);
print $b->get_tr();
Уж извини, запретить пользователю явно объявить свойство $tr в дочернем классе, не получится

-~{}~ 28.12.05 01:51:

А зачем такой закрытый класс?
 

texrdcom

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

-~{}~ 28.12.05 02:05:

Уж извини, запретить пользователю явно объявить свойство $tr в дочернем классе, не получится
да понимаю вот если бы final :) все ок одно слово! :)
К стати в жабе так можно сделать ! :(
 
Сверху