﻿<?xml version='1.0' encoding='UTF-8'?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Релиб / Веб-программирование / PHP  / Обращения между классами / Latest Posts</title><generator>InstantForum.NET v4.1.4</generator><description>Релиб</description><link>http://www.relib.com/forums/</link><webMaster>robot@relib.com</webMaster><lastBuildDate>Sat, 22 Nov 2008 20:32:08 GMT</lastBuildDate><ttl>20</ttl><item><title>RE: Обращения между классами</title><link>http://www.relib.com/forums/Topic912051-17-1.aspx</link><description>Это верно, но как видно не всегда можно и стоит использовать new )</description><pubDate>Thu, 05 Apr 2007 01:37:36 GMT</pubDate><dc:creator>Equand</dc:creator></item><item><title>RE: Обращения между классами</title><link>http://www.relib.com/forums/Topic912051-17-1.aspx</link><description>Лично мне аргумент насчет "захламления памяти" непонятен. Если так рассуждать то и обычные переменные ее захлямляют. Суть же класса в объединении данных и методов работающих с этими данными в одно целое. При наличии модификаторов доступа (они вроде уже есть в PHP 5) появляется возможность разделить интерфейс класса на внешний и внутренний, скрывая в той или иной степени внутренние детали реализации от пользователя своего класса. В этом случае без new не обойтись. Конечно классы имеют свои накладные расходы, но это не значит что надо всегда избегать использования new.</description><pubDate>Wed, 04 Apr 2007 10:23:32 GMT</pubDate><dc:creator>bazile</dc:creator></item><item><title>RE: Обращения между классами</title><link>http://www.relib.com/forums/Topic912051-17-1.aspx</link><description>я обычно к классам обращаюсь без вызова new.&lt;br&gt;new создает новую инстанцию захламляя память сервера&lt;br&gt;можно обращаться так Class::Function()&lt;br&gt;работает откуда угодно. учтите что $this при таком раскладе перестает работать.&lt;br&gt;потому что $this становится классовым/файловым/функциональным из места запуска.</description><pubDate>Tue, 03 Apr 2007 22:45:01 GMT</pubDate><dc:creator>Equand</dc:creator></item><item><title>RE: Обращения между классами</title><link>http://www.relib.com/forums/Topic912051-17-1.aspx</link><description>Как я понял, Вам нужно слинковать два разных объекта и обеспечить доступность методов и полей каждого их них в другом.&lt;br&gt;Строго говоря, такого быть не должно и от этого желательно избавиться. Обратные вызовы могут затруднить в дальнейшем поддержку и принести еще немало "сюрпризов".&lt;br&gt;Могу посоветовать еще раз обдумать необходимость разделения кода на два класса и:&lt;br&gt;1. либо объединить их в один класс&lt;br&gt;2. либо выделить те части, которые должны пересекаться и сделать из них еще один класс, обеспечив экземпляром этого класса каждый из объектов classOne и classTwo&lt;br&gt;&lt;br&gt;Если же объединить классы или выделить их части не получается, то&lt;br&gt;3. можно сделать класс, содержащий ссылки на экземпляры классов classOne и classTwo и сделать в нем вызовы нужных функций для этих классов. При этом каждому из экземпляров classOne и classTwo нужно предоставить ссылку на объект этого нового класса, чтобы через него можно было делать вызовы к другому классу.&lt;br&gt;Конечно, для простой программы это ненужное усложнение, но преимущества этого паттерна проектирования (фасад) могут быть оценены, когда классов будет много и каждому из них будет нужно что-то от другого.&lt;br&gt;&lt;br&gt;Ну и уж если сильно нужна такая линковка:&lt;br&gt;[code]&amp;lt;?php&lt;br&gt;class classOne{&lt;br&gt;	var $classTwo;&lt;br&gt;	function print_text(){&lt;br&gt;		// Этот класс добавлен в classTwo, как сделать print переменной $text из classTwo,&lt;br&gt;		// , или в обратную сторону двигаться уже нельзя?&lt;br&gt;        echo($this-&amp;gt;classTwo-&amp;gt;text);&lt;br&gt;	}&lt;br&gt;	function setClassTwo($classTwo) {&lt;br&gt;		$this-&amp;gt;classTwo=$classTwo;&lt;br&gt;	}&lt;br&gt;}&lt;br&gt;&lt;br&gt;$classOne = new classOne();&lt;br&gt;&lt;br&gt;class classTwo {&lt;br&gt;	var $text = 'testing...';&lt;br&gt;	var $classOne;&lt;br&gt;	function classTwo($classOne) {&lt;br&gt;		$this-&amp;gt;classOne=$classOne;&lt;br&gt;		$this-&amp;gt;classOne-&amp;gt;setClassTwo($this);&lt;br&gt;	}&lt;br&gt;}&lt;br&gt;&lt;br&gt;$classTwo = new classTwo($classOne);&lt;br&gt;&lt;br&gt;$classTwo-&amp;gt;classOne-&amp;gt;print_text();&lt;br&gt;// or&lt;br&gt;//$classOne-&amp;gt;print_text();&lt;br&gt;?&amp;gt;[/code]</description><pubDate>Sat, 31 Mar 2007 15:38:12 GMT</pubDate><dc:creator>DarkRebel</dc:creator></item><item><title>RE: Обращения между классами</title><link>http://www.relib.com/forums/Topic912051-17-1.aspx</link><description>Возник еще один вопрос, а как сделать такое обращение?&lt;br&gt;&lt;br&gt;class classOne{&lt;br&gt;	function print_text(){&lt;br&gt;		 // Этот класс добавлен в classTwo, как сделать print переменной $text из classTwo,&lt;br&gt;                  // , или в обратную сторону двигаться уже нельзя?&lt;br&gt;	}	&lt;br&gt;}&lt;br&gt;&lt;br&gt;$classOne = new classOne();&lt;br&gt;&lt;br&gt;class classTwo {&lt;br&gt;	var $text = 'testing...';&lt;br&gt;&lt;br&gt;	var $classOne;&lt;br&gt;	function classTwo($classOne) {&lt;br&gt;		$this-&gt;classOne=$classOne;&lt;br&gt;	}&lt;br&gt;&lt;br&gt;}&lt;br&gt;&lt;br&gt;$classTwo = new classTwo($classOne);&lt;br&gt;&lt;br&gt;$classTwo-&gt;classOne-&gt;print_text();</description><pubDate>Sat, 31 Mar 2007 13:49:29 GMT</pubDate><dc:creator>blaze</dc:creator></item><item><title>RE: Обращения между классами</title><link>http://www.relib.com/forums/Topic912051-17-1.aspx</link><description>Да, прекрасный ответ! Спасибо огромное! Второй метод мне как раз и нужен!</description><pubDate>Sat, 31 Mar 2007 00:45:02 GMT</pubDate><dc:creator>blaze</dc:creator></item><item><title>RE: Обращения между классами</title><link>http://www.relib.com/forums/Topic912051-17-1.aspx</link><description>2 DarkRebel&lt;/P&gt;&lt;P&gt;+1&lt;/P&gt;&lt;P&gt;Отличный ответ.</description><pubDate>Fri, 30 Mar 2007 13:42:53 GMT</pubDate><dc:creator>bazile</dc:creator></item><item><title>RE: Обращения между классами</title><link>http://www.relib.com/forums/Topic912051-17-1.aspx</link><description>Способов несколько и при выборе нужно исходить из того, как эти классы между собой соотносятся. И если все-таки действительно нужно использовать классы, то крайне желательно следовать принципам ООП и не лезть в глобальное пространство имен :) Вообще имхо global в классах запретить нужно :)&lt;br&gt;Вот навскидку список возможных вариантов:&lt;br&gt;1. Самое простое - передать ссылку на classOne в функцию print_text. Это если классы связаны только через переменную text - получил значение из класса classOne, вывел и забыл.&lt;br&gt;[code]&amp;lt;?php&lt;br&gt;class classOne{&lt;br&gt;	var $text = 'testing...';&lt;br&gt;}&lt;br&gt;$classOne = new classOne();&lt;br&gt;&lt;br&gt;class classTwo {&lt;br&gt;	function print_text($classOne){&lt;br&gt;		print $classOne-&amp;gt;text;&lt;br&gt;	}&lt;br&gt;}&lt;br&gt; &lt;br&gt;$classTwo = new classTwo();&lt;br&gt;$classTwo-&amp;gt;print_text($classOne);&lt;br&gt;?&amp;gt;[/code]&lt;br&gt;--------------------------------------------------&lt;br&gt;2. Передать ссылку на classOne в конструктор класса classTwo. Можно использовать когда с экземпляром класса classOne внутри classTwo нужно проделать еще какие-то действия, помимо получения и вывода переменной text.&lt;br&gt;[code]&amp;lt;?php&lt;br&gt;class classOne{&lt;br&gt;	var $text = 'testing...';&lt;br&gt;}&lt;br&gt;$classOne = new classOne();&lt;br&gt;&lt;br&gt;class classTwo {&lt;br&gt;	var $classOne;&lt;br&gt;	&lt;br&gt;	function classTwo($classOne) {&lt;br&gt;		$this-&amp;gt;classOne=$classOne;&lt;br&gt;	}&lt;br&gt;	&lt;br&gt;	function print_text(){&lt;br&gt;		print $this-&amp;gt;classOne-&amp;gt;text;&lt;br&gt;	}&lt;br&gt;}&lt;br&gt;&lt;br&gt;$classTwo = new classTwo($classOne);&lt;br&gt;$classTwo-&amp;gt;print_text();&lt;br&gt;?&amp;gt;[/code]&lt;br&gt;--------------------------------------------------&lt;br&gt;3. Передать ссылку на classOne в метод класса classTwo, который сделает эту ссылку значением внутреннего члена класса classTwo. Опять-таки использование этого метода оправдывается тем, что с объектом classOne нужно проделать что-то большее внутри classTwo при условии того, что к моменту вызова конструктора classTwo экземпляр classOne еще не готов или мы просто хотим следовать bean-модели )&lt;br&gt;[code]&amp;lt;?php&lt;br&gt;class classOne{&lt;br&gt;	var $text = 'testing...';&lt;br&gt;}&lt;br&gt;$classOne = new classOne();&lt;br&gt;&lt;br&gt;class classTwo {&lt;br&gt;	var $classOne;&lt;br&gt;	&lt;br&gt;	function setClassOne($classOne) {&lt;br&gt;		$this-&amp;gt;classOne=$classOne;&lt;br&gt;	}&lt;br&gt;	&lt;br&gt;	function print_text(){&lt;br&gt;		print $this-&amp;gt;classOne-&amp;gt;text;&lt;br&gt;	}&lt;br&gt;}&lt;br&gt; &lt;br&gt;$classTwo = new classTwo();&lt;br&gt;$classTwo-&amp;gt;setClassOne($classOne);&lt;br&gt;$classTwo-&amp;gt;print_text();&lt;br&gt;?&amp;gt;[/code]&lt;br&gt;--------------------------------------------------&lt;br&gt;4. объявить $text как статическую переменную внутри класса classOne - в этом случае не придется даже его объект создавать, т.к. можно обратиться к нему напрямую. Можно использовать, если объект класса classOne по каким-то причинам не нужен.&lt;br&gt;[code]&amp;lt;?php&lt;br&gt;class classOne{&lt;br&gt;	static $text = 'testing...';&lt;br&gt;}&lt;br&gt;&lt;br&gt;class classTwo{&lt;br&gt;	function print_text(){&lt;br&gt;		print classOne::$text;&lt;br&gt;	}&lt;br&gt;}&lt;br&gt; &lt;br&gt;$classTwo = new classTwo();&lt;br&gt;$classTwo-&amp;gt;print_text();&lt;br&gt;?&amp;gt;[/code]&lt;br&gt;--------------------------------------------------&lt;br&gt;Как не нужно делать, если следовать правилам ООП:&lt;br&gt;использовать global для получения доступа к ссылке на объект класса classOne внутри classTwo. Затрудняет читабельность, отладку и сопровождение кода.&lt;br&gt;[code]&amp;lt;?php&lt;br&gt;class classOne{&lt;br&gt;	var $text = 'testing...';&lt;br&gt;}&lt;br&gt;$classOne = new classOne();&lt;br&gt;&lt;br&gt;class classTwo {&lt;br&gt;	var $classOne;&lt;br&gt;	&lt;br&gt;	function classTwo() {&lt;br&gt;		global $classOne;&lt;br&gt;		$this-&amp;gt;classOne=$classOne;&lt;br&gt;	}&lt;br&gt;	&lt;br&gt;	function print_text(){&lt;br&gt;		print $this-&amp;gt;classOne-&amp;gt;text;&lt;br&gt;	}&lt;br&gt;}&lt;br&gt; &lt;br&gt;$classTwo = new classTwo();&lt;br&gt;$classTwo-&amp;gt;print_text();&lt;br&gt;?&amp;gt;[/code]&lt;br&gt;или&lt;br&gt;[code]&amp;lt;?php&lt;br&gt;class classOne{&lt;br&gt;	var $text = 'testing...';&lt;br&gt;}&lt;br&gt;$classOne = new classOne();&lt;br&gt;&lt;br&gt;class classTwo {&lt;br&gt;	function print_text(){&lt;br&gt;		global $classOne;&lt;br&gt;		print $classOne-&amp;gt;text;&lt;br&gt;	}&lt;br&gt;}&lt;br&gt; &lt;br&gt;$classTwo = new classTwo();&lt;br&gt;$classTwo-&amp;gt;print_text();&lt;br&gt;?&amp;gt;[/code]</description><pubDate>Fri, 30 Mar 2007 13:08:15 GMT</pubDate><dc:creator>DarkRebel</dc:creator></item><item><title>RE: Обращения между классами</title><link>http://www.relib.com/forums/Topic912051-17-1.aspx</link><description>Или может можно как-то реальзовать такую вещь&lt;br&gt;[i]print $this-&gt;classOne-&gt;text; //(this - это classTwo в функции)[/i]?</description><pubDate>Fri, 30 Mar 2007 11:11:53 GMT</pubDate><dc:creator>blaze</dc:creator></item><item><title>Обращения между классами</title><link>http://www.relib.com/forums/Topic912051-17-1.aspx</link><description>Доброе утро!&lt;br&gt;&lt;br&gt; Подскажите, как из одного класса получить значение из другого класса.&lt;br&gt;&lt;br&gt; Например есть:&lt;br&gt;&lt;?&lt;br&gt;class classOne{&lt;br&gt;	var $text = 'testing...';&lt;br&gt;}&lt;br&gt;$classOne = new classOne();&lt;br&gt;&lt;br&gt;class classTwo{&lt;br&gt;	function print_text(){&lt;br&gt;		print $classOne-&gt;text;&lt;br&gt;	}&lt;br&gt;}&lt;br&gt;&lt;br&gt;$classTwo = new classTwo();&lt;br&gt;$classTwo-&gt;print_text();&lt;br&gt;?&gt;&lt;br&gt;&lt;br&gt; Но такой способ не проходит, а parent не хочется использовать. Может как-то можно первый класс объявить во втором? И обращаться к нему как приведено в функции?&lt;br&gt;&lt;br&gt; Заранее благодарен!</description><pubDate>Fri, 30 Mar 2007 11:08:07 GMT</pubDate><dc:creator>blaze</dc:creator></item></channel></rss>