|
|
|
Supreme 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 не хочется использовать. Может как-то можно первый класс объявить во втором? И обращаться к нему как приведено в функции?
Заранее благодарен!
|
|
|
|
|
Supreme Being
      
участник
Last Login: 12.06.2008 11:23
Сообщ.: 96,
Visits: 535
|
|
Или может можно как-то реальзовать такую вещь
print $this->classOne->text; //(this - это classTwo в функции)?
|
|
|
|
|
Junior 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();
?>
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
| 2 DarkRebel +1 Отличный ответ.
|
|
|
|
|
Supreme Being
      
участник
Last Login: 12.06.2008 11:23
Сообщ.: 96,
Visits: 535
|
|
| Да, прекрасный ответ! Спасибо огромное! Второй метод мне как раз и нужен!
|
|
|
|
|
Supreme 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();
|
|
|
|
|
Junior 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();
?>
|
|
|
|
|
Junior Member
      
участник
Last Login: 02.05.2007 11:13
Сообщ.: 17,
Visits: 30
|
|
я обычно к классам обращаюсь без вызова new.
new создает новую инстанцию захламляя память сервера
можно обращаться так Class::Function()
работает откуда угодно. учтите что $this при таком раскладе перестает работать.
потому что $this становится классовым/файловым/функциональным из места запуска.
|
|
|
| | |