Обращения между классами
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Обращения между классами Expand / Collapse
Автор
Сообщение
30.03.2007 11:08


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 12.06.2008 11:23
Сообщ.: 96, Visits: 535
Доброе утро!

Подскажите, как из одного класса получить значение из другого класса.

Например есть:
class classOne{
var $text = 'testing...';
}
$classOne = new classOne();

class classTwo{
function print_text(){
print $classOne->text;
}
}

$classTwo = new classTwo();
$classTwo->print_text();
?>

Но такой способ не проходит, а parent не хочется использовать. Может как-то можно первый класс объявить во втором? И обращаться к нему как приведено в функции?

Заранее благодарен!
Сообщ. #912051
30.03.2007 11:11


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 12.06.2008 11:23
Сообщ.: 96, Visits: 535
Или может можно как-то реальзовать такую вещь
print $this->classOne->text; //(this - это classTwo в функции)?
Сообщ. #912054
30.03.2007 13:08
Junior Member

Junior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior Member

участник
Last Login: 19.04.2007 17:48
Сообщ.: 14, Visits: 159
Способов несколько и при выборе нужно исходить из того, как эти классы между собой соотносятся. И если все-таки действительно нужно использовать классы, то крайне желательно следовать принципам ООП и не лезть в глобальное пространство имен :) Вообще имхо global в классах запретить нужно :)
Вот навскидку список возможных вариантов:
1. Самое простое - передать ссылку на classOne в функцию print_text. Это если классы связаны только через переменную text - получил значение из класса classOne, вывел и забыл.
<?php
class classOne{
var $text = 'testing...';
}
$classOne = new classOne();

class classTwo {
function print_text($classOne){
print $classOne->text;
}
}

$classTwo = new classTwo();
$classTwo->print_text($classOne);
?>

--------------------------------------------------
2. Передать ссылку на classOne в конструктор класса classTwo. Можно использовать когда с экземпляром класса classOne внутри classTwo нужно проделать еще какие-то действия, помимо получения и вывода переменной text.
<?php
class classOne{
var $text = 'testing...';
}
$classOne = new classOne();

class classTwo {
var $classOne;

function classTwo($classOne) {
$this->classOne=$classOne;
}

function print_text(){
print $this->classOne->text;
}
}

$classTwo = new classTwo($classOne);
$classTwo->print_text();
?>

--------------------------------------------------
3. Передать ссылку на classOne в метод класса classTwo, который сделает эту ссылку значением внутреннего члена класса classTwo. Опять-таки использование этого метода оправдывается тем, что с объектом classOne нужно проделать что-то большее внутри classTwo при условии того, что к моменту вызова конструктора classTwo экземпляр classOne еще не готов или мы просто хотим следовать bean-модели )
<?php
class classOne{
var $text = 'testing...';
}
$classOne = new classOne();

class classTwo {
var $classOne;

function setClassOne($classOne) {
$this->classOne=$classOne;
}

function print_text(){
print $this->classOne->text;
}
}

$classTwo = new classTwo();
$classTwo->setClassOne($classOne);
$classTwo->print_text();
?>

--------------------------------------------------
4. объявить $text как статическую переменную внутри класса classOne - в этом случае не придется даже его объект создавать, т.к. можно обратиться к нему напрямую. Можно использовать, если объект класса classOne по каким-то причинам не нужен.
<?php
class classOne{
static $text = 'testing...';
}

class classTwo{
function print_text(){
print classOne::$text;
}
}

$classTwo = new classTwo();
$classTwo->print_text();
?>

--------------------------------------------------
Как не нужно делать, если следовать правилам ООП:
использовать global для получения доступа к ссылке на объект класса classOne внутри classTwo. Затрудняет читабельность, отладку и сопровождение кода.
<?php
class classOne{
var $text = 'testing...';
}
$classOne = new classOne();

class classTwo {
var $classOne;

function classTwo() {
global $classOne;
$this->classOne=$classOne;
}

function print_text(){
print $this->classOne->text;
}
}

$classTwo = new classTwo();
$classTwo->print_text();
?>

или
<?php
class classOne{
var $text = 'testing...';
}
$classOne = new classOne();

class classTwo {
function print_text(){
global $classOne;
print $classOne->text;
}
}

$classTwo = new classTwo();
$classTwo->print_text();
?>
Сообщ. #912061
30.03.2007 13:42
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
2 DarkRebel

+1

Отличный ответ.

Сообщ. #912062
31.03.2007 0:45


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 12.06.2008 11:23
Сообщ.: 96, Visits: 535
Да, прекрасный ответ! Спасибо огромное! Второй метод мне как раз и нужен!
Сообщ. #912076
31.03.2007 13:49


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 12.06.2008 11:23
Сообщ.: 96, Visits: 535
Возник еще один вопрос, а как сделать такое обращение?

class classOne{
function print_text(){
// Этот класс добавлен в classTwo, как сделать print переменной $text из classTwo,
// , или в обратную сторону двигаться уже нельзя?
}
}

$classOne = new classOne();

class classTwo {
var $text = 'testing...';

var $classOne;
function classTwo($classOne) {
$this->classOne=$classOne;
}

}

$classTwo = new classTwo($classOne);

$classTwo->classOne->print_text();
Сообщ. #912080
31.03.2007 15:38
Junior Member

Junior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior Member

участник
Last Login: 19.04.2007 17:48
Сообщ.: 14, Visits: 159
Как я понял, Вам нужно слинковать два разных объекта и обеспечить доступность методов и полей каждого их них в другом.
Строго говоря, такого быть не должно и от этого желательно избавиться. Обратные вызовы могут затруднить в дальнейшем поддержку и принести еще немало "сюрпризов".
Могу посоветовать еще раз обдумать необходимость разделения кода на два класса и:
1. либо объединить их в один класс
2. либо выделить те части, которые должны пересекаться и сделать из них еще один класс, обеспечив экземпляром этого класса каждый из объектов classOne и classTwo

Если же объединить классы или выделить их части не получается, то
3. можно сделать класс, содержащий ссылки на экземпляры классов classOne и classTwo и сделать в нем вызовы нужных функций для этих классов. При этом каждому из экземпляров classOne и classTwo нужно предоставить ссылку на объект этого нового класса, чтобы через него можно было делать вызовы к другому классу.
Конечно, для простой программы это ненужное усложнение, но преимущества этого паттерна проектирования (фасад) могут быть оценены, когда классов будет много и каждому из них будет нужно что-то от другого.

Ну и уж если сильно нужна такая линковка:
<?php
class classOne{
var $classTwo;
function print_text(){
// Этот класс добавлен в classTwo, как сделать print переменной $text из classTwo,
// , или в обратную сторону двигаться уже нельзя?
echo($this->classTwo->text);
}
function setClassTwo($classTwo) {
$this->classTwo=$classTwo;
}
}

$classOne = new classOne();

class classTwo {
var $text = 'testing...';
var $classOne;
function classTwo($classOne) {
$this->classOne=$classOne;
$this->classOne->setClassTwo($this);
}
}

$classTwo = new classTwo($classOne);

$classTwo->classOne->print_text();
// or
//$classOne->print_text();
?>
Сообщ. #912081
03.04.2007 22:45
Junior Member

Junior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior Member

участник
Last Login: 02.05.2007 11:13
Сообщ.: 17, Visits: 30
я обычно к классам обращаюсь без вызова new.
new создает новую инстанцию захламляя память сервера
можно обращаться так Class::Function()
работает откуда угодно. учтите что $this при таком раскладе перестает работать.
потому что $this становится классовым/файловым/функциональным из места запуска.
Сообщ. #912196