[php] Использование экземпляра одного класса в методе другого

Дмитрий
На сайте с 23.08.2006
Offline
199
3386

Собственно есть два экземпляра класса:

$class1 = new Class1();

$class2 = new Class2();

Например у класса Class1 есть метод view1(), а у класса Class2 - view2().

Если использовать влоб:

class Class1 {


public function view1() {
return 'hello, world';
}

}

$class1 = new Class1();

class Class2 {

public function view2() {
return $class1->view1();
}

}

$class2 = new Class2();
echo $class2->view2();

Notice: Undefined variable: class1 in .....

Fatal error: Call to a member function view1() on a non-object in ....

Можно передать экземпляр первого класса параметром, при создании экземпляра второго класса. В конструкте второго присвоить его какой нить переменной и использовать, но мне кажется что это очень криво. Просветите меня, как правильно делать :)

Разрабатываю и автоматизирую на php http://jonnyb.ru/
sun
На сайте с 22.10.2005
Offline
81
sun
#1

Почитайте по область видимости переменных, можно использовать массив GLOBALS или GLOBAL уже не помню как точно.

devmen.com (http://devmen.com/)
[Удален]
#2

Ну если твоя функция полностью идентична то лучше использовать наследование классов. Т.е.

class Class2 extends Class1

тогда Class2 получит те же свойства и методы что и Class1 плюс некоторые можно переобъявить, а некоторые дописать.

Если же делать так как ты делаешь, то наименее расходным по производительности вариантом будет объявлять экземпляр класса 1 внутри конкретного метода класса2, там где нужно. Но все равно это страх божий и удар по производительности аццкий =)

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

global $class1;

$class1= new Class1;

и в Class2->View

просто написать global $class1;

Дмитрий
На сайте с 23.08.2006
Offline
199
#3
Почитайте по область видимости переменных, можно использовать массив GLOBALS или GLOBAL уже не помню как точно.

Нет, глобалы я небуду исползовать.

Ну если твоя функция полностью идентична то лучше использовать наследование классов. Т.е.
class Class2 extends Class1

тогда Class2 получит те же свойства и методы что и Class1 плюс некоторые можно переобъявить, а некоторые дописать.

Если же делать так как ты делаешь, то наименее расходным по производительности вариантом будет объявлять экземпляр класса 1 внутри конкретного метода класса2, там где нужно. Но все равно это страх божий и удар по производительности аццкий =)

Да, это тоже как-то не так.

Собственно есть класс Config у которого есть метод getParam(переменная), который возвращает значение переменной конфига. Он инициализирован в index.php и его экземпляр "идет" через всю cms. Естественно этот метод может понадобиться внутри других классов, так же как и методы класса для работы с MySQL. Мне кажеться не выход вставлять экземпляры класса в глобалс или объявлять их внутри каждого класса. Других вариантов я так понимаю нету?

Николай В.
На сайте с 07.09.2006
Offline
62
#4

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

Если так, то нужно использовать шаблон Singleton:


<?php
class Class1
{
static private $instance = null;
private $var = '';

static public function getInstance()
{
if (self::$instance == null) {
self::$instance = new Class1();
}
return self::$instance;
}

private function __construct()
{
}

private function __clone()
{
}

public function setEchoVar($var)
{
$this->var = $var;
}

public function view1()
{
echo $this->var;
}
}

class Class2
{
public function view2()
{
Class1::getInstance()->view1();
}
}

$obj1 = Class1::getInstance();
$obj1->setEchoVar('Привет, мир!');
$obj2 = new Class2;
$obj2->view2();
Дмитрий
На сайте с 23.08.2006
Offline
199
#5

Николай В., спасибо большое, это действительно то, что нужно!

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий