Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2010, 17:48   #1
Cronos20
Форумчанин
 
Регистрация: 08.07.2010
Сообщений: 679
По умолчанию ООП - получить еще не созданный объект в дочернем классе

Здравствуйте, задача такая: сделать вывод всей страницы сайта в внутри одного класса WebForm
PHP код:
<?php
class Sql
{
function  
__construct(){} // что-нить создаем
public function  connect() {} //
public function  query_get($query// делаем запрос
}

class 
WebForm
{
protected 
$sql;
protected 
$settings;
function 
__construct(){
$this->sql = new Sql();
$this->sql->connect();
$this->settings = new Settings;
}
public function 
load(){} // запускаем сайт
}

class 
Settings extends WebForm
{
function  
__construct(){
var_dump ($this->sql// выводит NULL,  объект не создан
$this->sql->qyery_get($zapros// ошибка
}
}

$site=new WebForm();
$site->load();

?>
Вопрос в том как получить объект внутри дочернего класса, если в родительском классе он еще не создан, использую только логику наследования ООП (без global $sql или new settings($sql) ).

Или как вообще реализовать это, потому что передача переменных внутри множества функций в данном большом проекте нереальна.
Cronos20 вне форума Ответить с цитированием
Старый 29.11.2010, 09:15   #2
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

вызвать конструктор родителя
PHP код:
class Settings extends WebForm
{
function  
__construct(){
parent::__construct();
var_dump ($this->sql
$this->sql->qyery_get($zapros
}

Стрелок-охотник

Последний раз редактировалось mv28jam; 29.11.2010 в 09:20.
mv28jam вне форума Ответить с цитированием
Старый 29.11.2010, 12:12   #3
Cronos20
Форумчанин
 
Регистрация: 08.07.2010
Сообщений: 679
По умолчанию

Цитата:
Сообщение от mv28jam Посмотреть сообщение
вызвать конструктор родителя
И при этом мы снова создаем объекты sql (с новым коннектом!) и свой же класс settings (круг замкнулся).

Пока единственный вариант - это создать вспомогательный абстрактный класс, в котором будут создаваться все объекты и инициализироваться из главного класса. А в остальных классах будут получаться ссылки на них с помощью какой-нибудь функции вроде globalObjects::getSql().
Cronos20 вне форума Ответить с цитированием
Старый 29.11.2010, 12:53   #4
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

Цитата:
Сообщение от Cronos20 Посмотреть сообщение
И при этом мы снова создаем объекты sql (с новым коннектом!) и свой же класс settings (круг замкнулся).
Это называется - ошибка проектирования.

Не нужно создавать соединение при создании класса, тем более для каждого экземпляра новое. Соединение можно хранить в статическом свойстве класса и создавать его только при вызове ф-ий его использующих.
Стрелок-охотник
mv28jam вне форума Ответить с цитированием
Старый 29.11.2010, 14:18   #5
Cronos20
Форумчанин
 
Регистрация: 08.07.2010
Сообщений: 679
По умолчанию

Цитата:
Сообщение от mv28jam Посмотреть сообщение
Это называется - ошибка проектирования.

Не нужно создавать соединение при создании класса, тем более для каждого экземпляра новое. Соединение можно хранить в статическом свойстве класса и создавать его только при вызове ф-ий его использующих.
Тогда возвращаемся к первому вопросу:

Сделать вывод всей страницы сайта внутри одного класса WebForm

И речь здесь идет не только об одном соединении с БД, а о куче других объектов, которые будут создаваться помимо этого. И хотелось бы, чтобы они были доступны напрямую от базового класса.
Cronos20 вне форума Ответить с цитированием
Старый 29.11.2010, 14:43   #6
ssdm
Форумчанин
 
Регистрация: 20.05.2009
Сообщений: 506
По умолчанию

Цитата:
И речь здесь идет не только об одном соединении с БД, а о куче других объектов, которые будут создаваться помимо этого. И хотелось бы, чтобы они были доступны напрямую от базового класса.
Код:
class a{...}

class b{...}

class c{
public $a;
public $b;

public function get_a(){
   return $this->a;
}

public function  get_b(){
   return $this->b;
}
 __construct{
     $this->a=new a();
      $this->b=new b();
  }
}
соответственоо

$c=new c();
$c->get_a(); -- вызов обьекта типа a.
$c->get_b(); -- вызов обьекта типа b.

Последний раз редактировалось ssdm; 29.11.2010 в 14:51. Причина: Вроде все исправил.
ssdm вне форума Ответить с цитированием
Старый 29.11.2010, 14:56   #7
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

Цитата:
Сообщение от Cronos20 Посмотреть сообщение
Сделать вывод всей страницы сайта внутри одного класса WebForm
И что это значит? Это предложение вместе с кодом, который вы приложили, не имеет никакого определённого смысла.

Сформулируйте ЧЁТКО задачу.
Стрелок-охотник
mv28jam вне форума Ответить с цитированием
Старый 30.11.2010, 01:09   #8
Cronos20
Форумчанин
 
Регистрация: 08.07.2010
Сообщений: 679
По умолчанию

Если кому интересно то я нашел решение с помощью свойства static

PHP код:
<?php
class Sql
{
function  
__construct(){} // что-нить создаем
public function  connect() {} //
public function  query_get($query// делаем запрос
}

class 
WebForm
{
static 
$sql;
static 
$settings;
function 
__construct(){
self::$sql = new Sql();
self::$sql->connect();
self::$settings = new Settings();
}
public function 
load(){} // запускаем сайт
}

class 
Settings extends WebForm
{
function  
__construct(){
var_dump (& parent::$sql// РАБОТАЕТ
}
}

$site=new WebForm();
$site->load();

?>
Всем спасибо ... оказывается плохо учил матчасть)
Cronos20 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Из потока прочитать созданный в программе объект. DIgorevich Общие вопросы Delphi 3 30.08.2010 08:16
Как в базовом классе описать указатель на объект производного класса? MasterGH Общие вопросы C/C++ 3 16.11.2009 02:55
Если в классе объявить объект другого класса,будет ли видно переменные первого класса из объекта второго? TwiX Общие вопросы Delphi 3 15.11.2009 00:54
Возможно ли получить обработчиком событий ссылку на объект? neizerth Общие вопросы C/C++ 4 15.02.2009 11:00
Получить ссылку на вызывающий объект grenles Общие вопросы Delphi 10 07.11.2008 12:37