Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Вопрос по ООП, Вызов метода другого класса


Автор: cr0w 6.9.2012, 18:27
Вообщем досталась вот такая структура наследования классов:

Код

class privateParent
{
    private $a;
    private $b;
    private $c;

    function xx()
    {
    }
}

class myGeneral extends privateParent
{
    public function __call($command, $arguments)
    {
        if (preg_match('/Helper$/', $command)) {
            $className = 'получение имени класса';
            return new $className();
        }
        return parent::__call($command, $arguments);
    }

    public function first()
    {
        $this->xx();
    }

    public function second()
    {
        $this->xx();
    }
}

class class1_Helper extends myGeneral
{
    function test()
    {
        $this->first();
        $this->second();
        $this->xx();
    }
}

class test extends myGeneral
{

    function bla()
    {
        $this->first();
        $this->xx();
        $this->class1Helper()->test();
    }
}


возможности редактировать class privateParent нет. Как организовать вызов методов с класса class1Helper в классе  test, что б значения private переменных класса privateParent не обнулялись при работе в class1Helper?


Автор: Sentox 6.9.2012, 19:59
private говорит само за себя.
private не наследуется.

Автор: ksnk 7.9.2012, 07:54
Цитата(cr0w @  6.9.2012,  18:27 Найти цитируемый пост)
возможности редактировать class privateParent нет

Не так все однозначно в этом мире. Есть http://php.net/manual/en/book.reflection.php, который позволяет редактировать даже приватные методы.

Цитата(cr0w @  6.9.2012,  18:27 Найти цитируемый пост)
что б значения private переменных класса privateParent не обнулялись при работе в class1Helper?

Сейчас переменные $a,$b,$c и так неопределены. В каком месте и когда они обнуляются? Желательно примером.

Автор: Fortop 8.9.2012, 03:27
Цитата(Sentox @  6.9.2012,  19:59 Найти цитируемый пост)
private не наследуется. 

Чего?

Можно с этого момента поподробнее?

Код

<?php

class P {
    private $a = '1';
    public function getA() {
        return $this->a;
    }
}

class C extends P {
}

$o = new C();

var_dump($o->getA());

Автор: cr0w 9.9.2012, 11:42
Цитата(ksnk @ 7.9.2012,  07:54)
Цитата(cr0w @  6.9.2012,  18:27 Найти цитируемый пост)
возможности редактировать class privateParent нет

Не так все однозначно в этом мире. Есть http://php.net/manual/en/book.reflection.php, который позволяет редактировать даже приватные методы.

Цитата(cr0w @  6.9.2012,  18:27 Найти цитируемый пост)
что б значения private переменных класса privateParent не обнулялись при работе в class1Helper?

Сейчас переменные $a,$b,$c и так неопределены. В каком месте и когда они обнуляются? Желательно примером.

в классе privateParent есть методы которые работают с этими переменными(н-р, в одну из них собирается CodeCoverage и при создании нового инстанса класса все начинается сначала)

Автор: ksnk 9.9.2012, 15:29
Цитата(cr0w @  9.9.2012,  11:42 Найти цитируемый пост)
в классе privateParent есть методы которые работают с этими переменными(н-р, в одну из них собирается CodeCoverage и при создании нового инстанса класса все начинается сначала) 

Я счастлив!

если добавить пару строчек 
Код

$test=new test();
$test->bla();

получится
Цитата

Fatal error: Class 'получение имени класса' not found in ...(16)

Нужно ли объяснять, что правильно демонстрирующий проблему пример будет способствовать получению ответа? 

Автор: cr0w 9.9.2012, 21:47
Цитата(ksnk @ 9.9.2012,  15:29)
Цитата(cr0w @  9.9.2012,  11:42 Найти цитируемый пост)
в классе privateParent есть методы которые работают с этими переменными(н-р, в одну из них собирается CodeCoverage и при создании нового инстанса класса все начинается сначала) 

Я счастлив!

если добавить пару строчек 
Код

$test=new test();
$test->bla();

получится
Цитата

Fatal error: Class 'получение имени класса' not found in ...(16)

Нужно ли объяснять, что правильно демонстрирующий проблему пример будет способствовать получению ответа?

во блин народ пошол, нужно ли обьяснять, что это был только приближенный пример. если я выложу листинг всего кода на 15(хотя может и меньше...smile ) страниц, это поможет???

Автор: Sentox 10.9.2012, 12:58
Цитата(Fortop @ 8.9.2012,  03:27)
Цитата(Sentox @  6.9.2012,  19:59 Найти цитируемый пост)
private не наследуется. 

Чего?

Можно с этого момента поподробнее?

Код

<?php

class P {
    private $a = '1';
    public function getA() {
        return $this->a;
    }
}

class C extends P {
}

$o = new C();

var_dump($o->getA());

Цитата

Чего?
Можно с этого момента поподробнее?

И где здесь наследование частногго свойства?

Метод доступа к частной переменной в родительском классе да, и ещё раз: где здесь наследование?

В контексте ТС и сказано что приват не наследуется, по этому при сказанном условии 
Цитата

возможности редактировать class privateParent нет.

нет возможности к ним добраться. 

Автор: baldina 10.9.2012, 14:29
Цитата(Sentox @  10.9.2012,  12:58 Найти цитируемый пост)
И где здесь наследование частногго свойства?

Вы не видите?  smile 
Конечно, оно унаследовано, хоть и не доступно. возможность доступа и наследование это как теплое с мягким, смешивать не надо.

cr0w, какие классы из приведенных Вы можете редактировать? есть подозрение, что либо class1_Helper это генетический уродец, либо его используют неправильно.

Автор: Sentox 10.9.2012, 15:12
Цитата(baldina @ 10.9.2012,  14:29)
Цитата(Sentox @  10.9.2012,  12:58 Найти цитируемый пост)
И где здесь наследование частногго свойства?

Вы не видите?  smile 
Конечно, оно унаследовано, хоть и не доступно. возможность доступа и наследование это как теплое с мягким, смешивать не надо.

Противоречивый какой то ответ. Ну да ладно --
http://www.php5.ru/php5/zend2

Что бы не рыться воспроизведу цитату:
Цитата

Защищенные (protected) переменные-элементы класса доступны методам (methods) класса, в котором они объявлены, и методам производного от него класса. Частные (private) элементы класса доступны только методам класса, в котором они объявлены. 

Только методам класса  в котором они объявлены, то есть фактически только родному классу и никому более, на то они частные.
Как можно утверждать что здесь произошло наследование, когда просто в родительский класс был добавлен механизм доступа к частному свойству для использования в дочерних классах. 
То что в PHP такой доступ к ним это Вы точно подчеркнули 
Цитата

возможность доступа и наследование это как теплое с мягким, смешивать не надо.

Кстати это именно я и подчеркнул в своём посте и не понятен Ваш ответ, так как:
Конечно, оно унаследовано, хоть и не доступно !== возможность доступа и наследование это как теплое с мягким, смешивать не надо 

Автор: cr0w 10.9.2012, 16:18
Цитата(baldina @ 10.9.2012,  14:29)
cr0w, какие классы из приведенных Вы можете редактировать? есть подозрение, что либо class1_Helper это генетический уродец, либо его используют неправильно.

все, кроме privateParent

Автор: baldina 10.9.2012, 19:02
cr0w, вам нужно в итоге работать с тем объектом, для которого вызываете хелпер, а не с новым
например так
http://codepad.org/WcSOYXhj
или так
http://codepad.org/rXGwlmiI

Sentox,
Цитата(Sentox @  10.9.2012,  15:12 Найти цитируемый пост)
Противоречивый какой то ответ. Ну да ладно --
http://www.php5.ru/php5/zend2

читал я этот 
Цитата

достаточно вольный перевод статьи с официального сайта PHP
. Про наследование/не наследование приватных членов - ни слова. На php.net есть про видимость, а про то что приватные члены не наследуются, конечно ни слова. Есть, правда, двусмысленная фраза "For example, when you extend a class, the subclass inherits all of the public and protected methods from the parent class.". Впрочем, PHP не имеет стандарта, на php.net внятных определений немного (они даже наследование называют Object Inheritance, хотя на самом деле это Class Inheritance), так что я пользуюсь терминологией языков, у которых php заимствует идеи и синтаксис ООП.

я всего лишь сказал, что приватный член унаследован. это означает, что он в виде данных (пусть недоступных непосредственно) присутствует во всех объектах подкласса. Если нечто (константа, переменная, метод) присутствует в базовом классе, оно есть и в наследуемом. в этом суть наследования.
У унаследованных членов есть правила видимости/доступа: некоторые видны и доступны не всем.

Механизм наследования и правила видимости/доступа суть вещи разные, одно прекрасно может быть без другого, так что не надо их смешивать.

Цитата(Sentox @  6.9.2012,  19:59 Найти цитируемый пост)
private говорит само за себя.
private не наследуется. 

Это не так. Я понимаю, что Вы понимаете все точно так же, мы занялись игрой слов. Просто для конкретного разговора нужна точная терминология.

Автор: cr0w 12.9.2012, 14:08
Цитата(baldina @ 10.9.2012,  19:02)
например так
http://codepad.org/WcSOYXhj
или так
http://codepad.org/rXGwlmiI

Спасибо за помощь, оба варинта работают, правда во втором случае есть ошибка 'Serialization of 'Closure' is not allowed', но это решаемый момент для меня smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)