Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по ООП, Вызов метода другого класса 
V
    Опции темы
cr0w
Дата 6.9.2012, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 6.9.2012

Репутация: нет
Всего: нет



Вообщем досталась вот такая структура наследования классов:

Код

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?



Это сообщение отредактировал(а) cr0w - 9.9.2012, 11:46
PM MAIL   Вверх
Sentox
Дата 6.9.2012, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 27.1.2009
Где: Зимбабве

Репутация: 7
Всего: 7



private говорит само за себя.
private не наследуется.
PM MAIL   Вверх
ksnk
Дата 7.9.2012, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



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

Не так все однозначно в этом мире. Есть reflection, который позволяет редактировать даже приватные методы.

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

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


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Fortop
Дата 8.9.2012, 03:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(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());



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
cr0w
Дата 9.9.2012, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 6.9.2012

Репутация: нет
Всего: нет



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

Не так все однозначно в этом мире. Есть reflection, который позволяет редактировать даже приватные методы.

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

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

в классе privateParent есть методы которые работают с этими переменными(н-р, в одну из них собирается CodeCoverage и при создании нового инстанса класса все начинается сначала)
PM MAIL   Вверх
ksnk
Дата 9.9.2012, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



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

Я счастлив!

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

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

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

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

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


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
cr0w
Дата 9.9.2012, 21:47 (ссылка)    | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 6.9.2012

Репутация: нет
Всего: нет



Цитата(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 ) страниц, это поможет???

Это сообщение отредактировал(а) cr0w - 9.9.2012, 21:52
PM MAIL   Вверх
Sentox
Дата 10.9.2012, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 27.1.2009
Где: Зимбабве

Репутация: 7
Всего: 7



Цитата(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 нет.

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

Это сообщение отредактировал(а) Sentox - 10.9.2012, 12:59
PM MAIL   Вверх
baldina
Дата 10.9.2012, 14:29 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 26
Всего: 101



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

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

cr0w, какие классы из приведенных Вы можете редактировать? есть подозрение, что либо class1_Helper это генетический уродец, либо его используют неправильно.
PM MAIL   Вверх
Sentox
Дата 10.9.2012, 15:12 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 27.1.2009
Где: Зимбабве

Репутация: 7
Всего: 7



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

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

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

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

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

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

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

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

Это сообщение отредактировал(а) Sentox - 10.9.2012, 15:18
PM MAIL   Вверх
cr0w
Дата 10.9.2012, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 6.9.2012

Репутация: нет
Всего: нет



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

все, кроме privateParent
PM MAIL   Вверх
baldina
Дата 10.9.2012, 19:02 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 26
Всего: 101



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 не наследуется. 

Это не так. Я понимаю, что Вы понимаете все точно так же, мы занялись игрой слов. Просто для конкретного разговора нужна точная терминология.
PM MAIL   Вверх
cr0w
Дата 12.9.2012, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 6.9.2012

Репутация: нет
Всего: нет



Цитата(baldina @ 10.9.2012,  19:02)
например так
http://codepad.org/WcSOYXhj
или так
http://codepad.org/rXGwlmiI

Спасибо за помощь, оба варинта работают, правда во втором случае есть ошибка 'Serialization of 'Closure' is not allowed', но это решаемый момент для меня smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0595 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.