|
|
|
|
<?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 .... | |
|
|
|
|
|
|
|
для: vorobey
(17.08.2012 в 22:36)
| | Почему нельзя передать массив $data в конструктор и проинициализировать конструкторы nameA и nameB? Если объекты к тому же без этого массива работают неправильно, ваше построение просто противоречит принципам ООП.
PS Сложно высказаться более определенно, так как я понимаю, что помимо этих методов в классах есть еще что-то... поэтому не очень понятно, почему следует избегать инициализации объекта через конструктор. | |
|
|
|
|
|
|
|
для: cheops
(18.08.2012 в 07:37)
| | Через конструктор я и сделал.
Они не работают не правильно им просто не хватает массива этого.
Почему противоречит?
Главный класс(контроллер) содержит метод fnameB(); он вызывается для подготовки данных к выводу
(он обращается к "модели" и "виду")
но получается так что в каждом модуле получается свои данные и приходится добавлять новый метод +
самое сложное придумать название его. Поэтому достаточно сделать дочерний класс,
и назвать функции data1, bdata2 и вызывать метод fnameB() и не вспоминать как там я назвал функцию которая
подготавливает данные именно для этого компонента. Если форс мажор, то метод fnameB() переопределяется и все.
К тому же решается задача с подключением ненужных методов в классе. | |
|
|
|
|
|
|
|
для: vorobey
(18.08.2012 в 17:20)
| | 1. Да как же не хватает, если конструктор вообще не принимает параметров, почему бы не сделать так
<?php
$obj1 = new nameA($arr);
$obj2 = new nameb($arrTest);
?>
|
2. >Почему противоречит?
Объект нельзя использовать сразу - его нужно дополнительно инициализировать, причем нельзя использовать и другие методы, пока не произойдете корректной инициализации - вызов методов зависит друг от друга - это процедурный процедурный подход в ООП-оболочке.
3. А почему бы не воспользоваться полиморфизмом и не определить один метод, одно название для всех классов, а в дочернем классе просто реализовать метод по-новой, при необходимости вызывая базовый метод или не вызывая его. Собственно ООП для таких задач и создавался, чтобы вы не выдумывали название нового метода, а во всех классах использовали однотипные названия (форс можор ли это или что-то другое). | |
|
|
|
|
|
|
|
для: vorobey
(17.08.2012 в 22:36)
| | ну во первых нужно определить в суперклассе сам массив
fnameA выполняет роль наполнения массива, почему бы не заменить на конструктор эту функцию? ну и из дочернего класса в методе data1 (и уж точно не protected, переназнач на public), думаю лучше обратиться к dataArr через parent::dataArr | |
|
|
|
|
|
|
|
для: Jackson
(18.08.2012 в 14:00)
| | protected - все правильно. Вот щас свежим взглядом посмотрел что то тут не то....
Заменит ее на конструктор нельзя так как она вызывается постоянно.
Но интерес академический | |
|
|
|