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

Форум PHP

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Получить доступ к свойству из дочернего класса

Сообщения:  [1-6] 

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

  Ответить  
 
 автор: 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 ....

  Ответить  

Сообщения:  [1-6] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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