Очень надо сделать возможность вызывать защищённые методы класса из дочернего. Суть проблемы - в родительском классе около двух сотен (это примерно) защищённых функций которые надо вызывать из дочернего класса, не изменяя родительский класс. Переписывать каждую функцию внутри дочернего класса просто муторно. Хотя этим собственно говоря я сейчас и занимаюсь, но вдруг найдуться умельцы которые объяснят мне глупому как же это сделать. PHP: <?php class ParentClass { protected function ParentFunction($variable) { echo $variable; } } class ChildClass extends ParentClass { private $ParentClass; public function __construct() { $this->ParentClass=new ParentClass(); } public function __call($function,$arguments) { //Первый вариант $this->call_user_func($function,$arguments); } public function __call($function,$arguments) { //Второй вариант $ParentClass=new ReflectionMethod('ParentClass',$function); return $ParentClass->invokeArgs($this->ParentClass,$arguments); } } $c=new ChildClass(); $c->ParentFunction("It works!"); ?> Вот такие у меня были неудачные попытки... Второй метод - позорная попытка вызывать методы, если родительский класс только один.
костыль: PHP: <?php class A{ protected function aaa($aa) { echo 'a='.$aa; } } class B extends A{ public function mycall($function,$arguments) { call_user_func(array($this,$function),$arguments); } } $a = new A; $b = new B; echo $b->mycall('aaa','gggg'); ?>
только у меня это статика, а не с экземпляром класса. и вообще непонятно как работает )), надо бы передавать имя класса, а не $this
PHP: <?php class A { protected function hello($who) { print 'Hello, ' . $who . '?'; } } class B extends A { public function __call($name, $args) { return call_user_func_array(array($this, $name), $args); } } class C { private $b; public function __construct(B $b) { $this->b = $b; } public function __call($name, $args) { $this->b->__call($name, $args); } } $c = new C(new B()); $c->hello('world');
Sergey89а зачем такие извращения, тогда уж просто прозрачно создавать внутри детки родителя и фазамакерствовать. но все равно это статика.
Если сделать, как ты говоришь, то __call ребёнка не перехватит вызов защищённого метода. Не нужно забывать, что класс B наследуется от A. а вот этого не понял. поясни.
Sergey89 ок, ну все равно неявно вызывать внутри (псевдо)родителя и с ним изгаляться. статика - что ты вызываешь статический метод, неспособный работать с данными этого экземпляра.
почему же? PHP: <?php class A { private $hello = 'Hello, %s!'; public function __construct($hello) { $this->hello = $hello; } protected function hello($who) { printf($this->hello, $who); } } class B extends A { public function __call($name, $args) { return call_user_func_array(array($this, $name), $args); } } class C { private $b; public function __construct(B $b) { $this->b = $b; } public function __call($name, $args) { $this->b->__call($name, $args); } } $c = new C(new B('Hello, %s!')); $c->hello('world');
я вот тож не пойму какие проблемы вызвать метод унаследованный от родителя. protected как раз это позволяет.
ок, тогда так: PHP: <?php class C { private $b; public function __construct($h) { $this->b = new B($h); } public function __call($name, $args) { $this->b->__call($name, $args); } } $c = new C('Hello, gg!'); $c->hello('world'); ?> но __call можно вынести в A
Если нужно поменять поведение только класса B, то можно и так сделать, но я не люблю связывать классы подобным образом. Если не считать этого условия то можно и вынести
Ну вот. Только вчера колдовали, а сегодня пришло такое известие Новое поведение __call в PHP 5.2.9, теперь он может перехватывать вызовы к private и protected методам. Теперь класс C можно выкинуть и переложить всю ответственность на класс B.
Я вообще жду php 6. Ведь в 5.3 уже есть __callStatic() и пространства имен. Пространства имен это вообще манна небесная, глядишь php скоро объектно-ориентированным языком программирования станет...
В php 6 только поддержку юникода и добавят, весь новый функционал в php 5 будет реализован. да уже давно как стал
Холивар! http://otvety.google.ru/otvety/thre...n:asp.net=0.38&hlt=asp&hlt=net&hlt=php&hlt=vs Я тоже согласен что главное мозги. Но не всех все и всегда устраивает, для этого и пишутся новые версии и т.д. И... *барабанная дробь* PHP не идеален .
"вечный спор, чтоже лучше. винда или линукс, фар или нортон коммандер. моё или твоё...". ну и так далее.