powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Как обратиться к объекту из функции класса?
25 сообщений из 25, страница 1 из 1
Как обратиться к объекту из функции класса?
    #38849880
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

Есть некоторый код PHP:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
// КЛАСС: класс 1
class clsClass1 {
	public function Test1() {
		echo('Вызов из объекта clsClass2');
	}
}
// КЛАСС: класс 2
class clsClass2 {
	public function Test2() {
		$objClass1->Test1();
	}
}
// создаем объекты классов
$objClass1 = new clsClass1;
$objClass2 = new clsClass2;
// вызываем метод Test2() класса 2
$objClass2->Test2();



Проблема в том, что метод Test2() не видит объект $objClass1. Почему?
...
Рейтинг: 0 / 0
Как обратиться к объекту из функции класса?
    #38849896
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я нашёл выход из положения, передал объект $objClass1 в качестве параметра:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
<?php
// КЛАСС: класс 1
class clsClass1 {
	public function Test1() {
		echo('Hello clsClass2');
	}
}
// КЛАСС: класс 2
class clsClass2 {
	public function Test2($objClass1) {
		$objClass1->Test1();
	}
}
// создаем объекты классов
$objClass1 = new clsClass1;
$objClass2 = new clsClass2;
// вызываем метод Test2() класса 2
$objClass2->Test2($objClass1);
?>


Хотя считаю такое положение вещей несправедливым. Т.к. переменная $objClass1 глобальна по-отношению к функции Test2() и раз она не переобъявлена внутри функции Test2(), то вполне логично было бы использовать глобальное значение переменной. Но авторы PHP решили по-своему. Придется как-то с этим жить. Просто если у меня будет не один глобальный объект, а 50? Я что должен все 50 объектов передавать в каждую функцию? Это очень нелогично!
...
Рейтинг: 0 / 0
Как обратиться к объекту из функции класса?
    #38849969
MikkiMouse
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Смирнов,

Немедленно читать любую книгу по ООП, хоть для чайников. И писать побольше кода, причем сюда постить из написанного поменьше - тапками закидают!
...
Рейтинг: 0 / 0
Как обратиться к объекту из функции класса?
    #38849971
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
открой для себя DI contaider
...
Рейтинг: 0 / 0
Как обратиться к объекту из функции класса?
    #38849973
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как обратиться к объекту из функции класса?
    #38849996
Фотография A Serious Man
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Смирнов,

Леха ты дебил?

Модератор:
A Serious Man , прошу общаться без оскорблений.
--
vkle
...
Рейтинг: 0 / 0
Как обратиться к объекту из функции класса?
    #38850147
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Смирнов, Вам все-таки лучше перейти на JavaScript :)
...
Рейтинг: 0 / 0
Как обратиться к объекту из функции класса?
    #38850221
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikkiMouseАлексей Смирнов,

Немедленно читать любую книгу по ООП, хоть для чайников. И писать побольше кода, причем сюда постить из написанного поменьше - тапками закидают!

Ну и пишу и по ходу опять встретился с тем, что мне нужны какие-то глобальные свойства проекта (не переменные сессии), которые бы принимали значение на период прорисовки страницы и были доступны внутри методов классов. Как это сделать? Расскажите, если знаете.
...
Рейтинг: 0 / 0
Как обратиться к объекту из функции класса?
    #38850226
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowоткрой для себя DI contaider

Спасибо почитал. Я так понял надо интерфейсы использовать?
...
Рейтинг: 0 / 0
Как обратиться к объекту из функции класса?
    #38850231
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A Serious ManАлексей Смирнов,

Леха ты дебил?



Это к чему вообще?
...
Рейтинг: 0 / 0
Как обратиться к объекту из функции класса?
    #38850232
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Смирнов, Вам все-таки лучше перейти на JavaScript :)

JAVA-script выполняет на стороне браузера. Мне нужно писать код на стороне сервера, т.к. в нем много вещей, которых пользователю видеть нельзя (доступ к базе например).
...
Рейтинг: 0 / 0
Как обратиться к объекту из функции класса?
    #38850233
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow http://php.net/manual/en/language.variables.scope.php#language.variables.scope.global

Спасибо! Один нормальный ответ и всех. Как раз то что надо!
Про global я не знал. Попробовал, работает!
...
Рейтинг: 0 / 0
Как обратиться к объекту из функции класса?
    #38850244
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей СмирновScareCrow http://php.net/manual/en/language.variables.scope.php#language.variables.scope.global

Спасибо! Один нормальный ответ и всех. Как раз то что надо!
Про global я не знал. Попробовал, работает!

Слава богу что хоть функции, объявленные вне классов доступны внутри классов. Кстати это идея. Они же могут и объекты возвращать). Тогда без global можно будет обойтись.
...
Рейтинг: 0 / 0
Как обратиться к объекту из функции класса?
    #38850253
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей СмирновskyANAАлексей Смирнов, Вам все-таки лучше перейти на JavaScript :)

JAVA-script выполняет на стороне браузера. Мне нужно писать код на стороне сервера, т.к. в нем много вещей, которых пользователю видеть нельзя (доступ к базе например).Я Вам уже предлагал Meteor.JS.
Если не хотите, то начните читать книжку по PHP и по ООП, а то Вы сейчас напишете код, который Вам потом стыдно будет показывать.
...
Рейтинг: 0 / 0
Как обратиться к объекту из функции класса?
    #38850272
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAЯ Вам уже предлагал Meteor.JS.
Если не хотите, то начните читать книжку по PHP и по ООП, а то Вы сейчас напишете код, который Вам потом стыдно будет показывать.

Нет мне не стыдно). У меня все получилось). Я объект затолкал внутрь функции, описанной вне классов, а такие функции доступны внутри методов классов). Проблема решена).
...
Рейтинг: 0 / 0
Как обратиться к объекту из функции класса?
    #38850274
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Слава богу что хоть функции, объявленные вне классов доступны внутри классов. Кстати это идея. Они же могут и объекты возвращать). Тогда без global можно будет обойтись.

Да всё получилось! И global тоже помог. Написал такую функцию, она возвращает объект. И эта функция доступна во всех методах классов:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
// КЛАСС: класс 1
class clsClass1 {
	public function Test1() {
		echo('Вызов из объекта clsClass2');
	}
}
// КЛАСС: класс 2
class clsClass2 {
	public function Test2() {
		objClass1()->Test1();
	}
}

// ФУНКЦИЯ: возвращает объект
function objClass1() {
	// объявление глобальной переменой
	global $objClass1;
	// создание объекта
	if (!isset($objClass1)) $objClass1 = new clsClass1();
	// сохранение результата
	return $objClass1;
}

// создание объекта класса 2
$objClass2 = new clsClass2;

// вызываем метод Test2() класса 2
$objClass2->Test2();
...
Рейтинг: 0 / 0
Как обратиться к объекту из функции класса?
    #38850281
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Глупый вопрос. Наследование никак нельзя тут использовать?
...
Рейтинг: 0 / 0
Как обратиться к объекту из функции класса?
    #38850286
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей... хочеться писать своё не вникая в чужой код???

сделайте

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
class MyGlobalVars 
{

protected static $_values = array();

public static function get_var($name)
{
return (isset(self::$_values[(string)$name]))? self::$_values[(string)$name] : null;
}

public static function set_var($name, $value)
{
self::$_values[(string)$name] = $value;

return true;
}
}



и сохраняйте так.
потом можно будет переделать методы этого класса не переделывая кода, если будете это хранить даже не на время прорисовки...а на сутки целые - в базе, файле, мемкеше...
...
Рейтинг: 0 / 0
Как обратиться к объекту из функции класса?
    #38850305
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453и сохраняйте так. потом можно будет переделать методы этого класса не переделывая кода, если будете это хранить даже не на время прорисовки...а на сутки целые - в базе, файле, мемкеше...

Я подозреваю, что вы мне предлагаете простое решение заменить на сложное. Пока не вижу минусов моего подхода. Я использую всего лишь обычную function.

А теперь посмотрите то, что вы мне предлагаете:
1) protected
2) static
3) public static
4) ::

Усложнение синтаксиса приводит к дополнительным ошибкам. Из всего вами предложенного я в своем проекте ещё даже не использовал. И все отлично работает без этих странных конструкций.
...
Рейтинг: 0 / 0
Как обратиться к объекту из функции класса?
    #38850308
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkleГлупый вопрос. Наследование никак нельзя тут использовать?

Наследование пока не нужно. Планирую использовать в будущем, но именно наследование в своем прямом предназначении (наследование методов и свойств родительского объекта). Пока что на этапе описания глобальных объектов и они у меня все разношерстные. Когда уже буду описывать логику там да, наследование пригодится.
...
Рейтинг: 0 / 0
Как обратиться к объекту из функции класса?
    #38850512
kunaksergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей Смирнов,
Почему вам в Class2 не передавать объект класса Class1

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
class clsClass1 {
	public function Test1() {
		echo('Вызов из объекта clsClass2');
	}
}

class clsClass2 {
private $obj;

function construct(Class1 $obj){
$this->obj=$obj;
}
public function Test2() {
		$this->obj->Test1();
	}
}

$class2=new Class2(new Class1);



Class 1 у вас может быть например синглтоном.

По поводу ". Просто если у меня будет не один глобальный объект, а 50? Я что должен все 50 объектов передавать в каждую функцию? Это очень нелогично!"
Вы можете создать класс, в котором в качестве массива будут храниться ваши 50 объектов. И передавать только один объект.. или вообще хранить их в статическом классе.
...
Рейтинг: 0 / 0
Как обратиться к объекту из функции класса?
    #38850537
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kunaksergeyАлексей Смирнов,
Почему вам в Class2 не передавать объект класса Class1

Но в моём решении передавать ни в один класс вообще ничего не нужно. Это удобно, т.к. мне теперь не нужно вспоминать - передал я этот объект сюда или нет.

Вы можете создать класс, в котором в качестве массива будут храниться ваши 50 объектов. И передавать только один объект.. или вообще хранить их в статическом классе.
И мне придется перечислять все объекты в статическом классе.
И опять же как к ним обращаться потом?
Так: objStatichClass->objObject1->FunctionName1() ?
Через два "->"?
...
Рейтинг: 0 / 0
Как обратиться к объекту из функции класса?
    #38850600
kunaksergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей Смирнов,

да
...
Рейтинг: 0 / 0
Как обратиться к объекту из функции класса?
    #38850645
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Смирнов,

это хорошо что человек(вы) задумывается о правильности организации кода, и о удобстве.

будет вообще отлично если сразу пойдёте правильным путём. точного совета нету, ибо нету задачи - в методе класса использовать объект другого класса, это очень расплывчато, - вариантов тьма тьмущая.

====

по написанному вами, я бы советовал так.

прежде всего. есть золотое правило. один метод, одно действие.

примеры

if($this->a != $this->b)
{
return $this->c;
}
else
{
return $this->d;
}

в общем случае - сдесь 5 действий.
почему щитывание поля отдельное действие.
потому что, в общем случае, чтобы оно не означало, сегодня это ....например состояние обьекта - готов или не готов к работе, завтра за этим можем стоять логика, что уже не одним флагом а несколькими определяется.
поэтому если $this->f - флаг готовности, то лучше делать

function is_active()
{
return (bool) $this->f;
}

завтра если у потомка добавиться ещо один флаг, $this->ff и готовность будет другой, будет
достаточно переписать этот метод, а не лопатить весь код, и менять везде.

с практической точки зрения - подобное должно быть для всех публичных свойств - либо функция, если оно больше подходит по логике - как проверка готовности, либо __set __get
с защищёными методами _set_field_a($newvalue) _get_field_a()

для защищённых,
если больше похоже на действие как с готовностью, лучше все таки через метод.
если не похоже, но по логике вы понимаете что врядли завтра нужно будет за простым считыванием поставить логику...можно не парится.
(даже если надо будет, есть вариант убрать это поле из описания, и магическими методами добавить логики)

1) нехотите париться о передаче обьекта ...
тут надо определиться.
есть базовые ситуации.
1.1 - этот глобальный обьект - это обьект связаный с текущей авторизацией/правами в системе итд.
тогда решением хорошим будет.
логика - есть понятие текущая авторизация === есть класс который за это отвечает.
все кому надо чтото из этого глобального понятия используют класс.

решение - class Auth {} в нем изначально инициализируеться все, и потом все кому надо глобально чтото - используют , напр. Auth::current_user(), Auth::is_anonymous(), Auth::expiration_time(), Auth::user()->name - если поле юзер содержит обьект текущего пользователя.

1.2 - этот глобальный обьект, это ...сейчас мы обрабатываем загружаемые файлы методом пост, но понимаем что в перспективе для действия save_file() может надо будет не из поста, а на прямую передать файл. делаем
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
function get_file_from_post()
{
  return array('file_name' => $_FILES['send_file']['name'].....);
}

function save_file($specific_file = null)
{
$file = ($specific_file === NULL)? $this->get_file_form_post() : $specific_file; 
}


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

1.3 это глобальное связано с поведением - например, наш класс1 - это клас через который мы сохраняем файлы, а класс2 - это обработчик который физически сохраняет файл, в базе данных, а есть класс2.1 - он сохраняет на фтп сервер, а класс2.2 вообще хитро ещо кудато сует.
это называеться драйвер.

тогда обычно
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
class File {

protected $_driver = null;

protected $_current_data = ''; //current data of a file

protected $_current_fname = '';

public function __constructor($driver= 'Local')
{

$driver = 'File_'.$driver;

if (class_exist($driver))
{
$this->_driver = new $driver();
}
else
{
throw new Exception("$driver is not valid name of driver.");
}
}

public function save()
{
//check - current_data, ....

//if we can save file

return $this->_driver->save($this->_current_fname, $this->_current_data);
}
}



----
лично у меня сложилось впечатление, что вы точно чувствуете, чего хотите добиться, но когда доходит до реализации возникают сомнения, путаются мысли... вообще как у всех по началу. выход один - рассматривать примеры если не того же, что нужно вам, то похожего - и потом появятся мысли как правильно, красиво, сделать то, что именно вам надо.

надеюсь мой эпос поможет на пути создания и красивой и удобной архитектуры.
...
Рейтинг: 0 / 0
Как обратиться к объекту из функции класса?
    #38850753
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453, спасибо! Вы целую статью написали. Мне к сожалению сразу сложно вникнуть и что-то ответить сейчас. Буду читать на досуге за чашкой чая.

Информации очень много. А сроки (практический результат) как всегда требуют быстрейшего решения. Пока что остановился на простом решении - использовании функций, возвращающих объекты. Дальше видно будет.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Как обратиться к объекту из функции класса?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]