Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Получить доступ к свойству из дочернего класса
 
 автор: vorobey   (17.08.2012 в 22:36)   письмо автору
 
 


<?php
class nameA {

    public function 
fnameA(array $data) {
        
$this->dataArr $data;
        return 
$this->dataArr;
    }

    public function 
fnameB($data) {
        
$arr1 $this->data1($data); // не знаю как плоучить доступ к $this->dataArr
        
$arr2 $this->data2($data);
        
$data $this->sumsing($arr1$arr2); // не имеет значения
        
return $data;
    }

}

class 
nameB extends nameA {

    protected function 
data1($data) {
        return 
$this->dataArr// Хотелось бы получить доступ к этому массиву(не используя конструктор)
    
}

    protected function 
data2($data) {
        return 
$data;
    }

}

$obj1 = new nameA();
$obj1->fnameA($arr); // $this->dataArr готов echo print_r($obj->dataArr);

$arrTest = array();
$obj2 = new nameb();
$obg2->fnameB($arrTest);
?>


Нужно вот это
echo $print_r($obj2->dataArr);

зы
я понимаю что нужно в дочернем классе вызвать $this->fnameA($arr)
но ведь это уже сделано по ходу кода и не хочется передавать лишний массив $arr ....

  Ответить  
 
 автор: cheops   (18.08.2012 в 07:37)   письмо автору
 
   для: vorobey   (17.08.2012 в 22:36)
 

Почему нельзя передать массив $data в конструктор и проинициализировать конструкторы nameA и nameB? Если объекты к тому же без этого массива работают неправильно, ваше построение просто противоречит принципам ООП.

PS Сложно высказаться более определенно, так как я понимаю, что помимо этих методов в классах есть еще что-то... поэтому не очень понятно, почему следует избегать инициализации объекта через конструктор.

  Ответить  
 
 автор: vorobey   (18.08.2012 в 17:20)   письмо автору
 
   для: cheops   (18.08.2012 в 07:37)
 

Через конструктор я и сделал.
Они не работают не правильно им просто не хватает массива этого.
Почему противоречит?

Главный класс(контроллер) содержит метод fnameB(); он вызывается для подготовки данных к выводу
(он обращается к "модели" и "виду")

но получается так что в каждом модуле получается свои данные и приходится добавлять новый метод +
самое сложное придумать название его. Поэтому достаточно сделать дочерний класс,
и назвать функции data1, bdata2 и вызывать метод fnameB() и не вспоминать как там я назвал функцию которая
подготавливает данные именно для этого компонента. Если форс мажор, то метод fnameB() переопределяется и все.
К тому же решается задача с подключением ненужных методов в классе.

  Ответить  
 
 автор: cheops   (20.08.2012 в 09:24)   письмо автору
 
   для: vorobey   (18.08.2012 в 17:20)
 

1. Да как же не хватает, если конструктор вообще не принимает параметров, почему бы не сделать так
<?php
  $obj1 
= new nameA($arr); 
  
$obj2 = new nameb($arrTest); 
?>

2. >Почему противоречит?

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

3. А почему бы не воспользоваться полиморфизмом и не определить один метод, одно название для всех классов, а в дочернем классе просто реализовать метод по-новой, при необходимости вызывая базовый метод или не вызывая его. Собственно ООП для таких задач и создавался, чтобы вы не выдумывали название нового метода, а во всех классах использовали однотипные названия (форс можор ли это или что-то другое).

  Ответить  
 
 автор: Jackson   (18.08.2012 в 14:00)   письмо автору
 
   для: vorobey   (17.08.2012 в 22:36)
 

ну во первых нужно определить в суперклассе сам массив
public $dataArr;


fnameA выполняет роль наполнения массива, почему бы не заменить на конструктор эту функцию? ну и из дочернего класса в методе data1 (и уж точно не protected, переназнач на public), думаю лучше обратиться к dataArr через parent::dataArr

  Ответить  
 
 автор: vorobey   (18.08.2012 в 17:30)   письмо автору
 
   для: Jackson   (18.08.2012 в 14:00)
 

protected - все правильно. Вот щас свежим взглядом посмотрел что то тут не то....
Заменит ее на конструктор нельзя так как она вызывается постоянно.
Но интерес академический

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования