Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
9 / 9 / 5
Регистрация: 14.01.2015
Сообщений: 173

Избавиться от global внутри метода класса

30.09.2015, 10:09. Показов 2159. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Подскажите, какие-нибудь варианты чтобы можно было избежать использования global для переменных внутри методов класса?
Вот такая конструкция не катит:
PHP
1
2
3
4
5
6
class A {
  public function bar() {
    include_once(PATH . SECONDPATH);
    echo $property;
  }
}
Хоть и подключается файл с переменной - но все равно не видно ее. Может из-за констант? Но вне функций константы внутри include_once работают...

можно попробовать как-то использовать функцию parse_ini_file?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.09.2015, 10:09
Ответы с готовыми решениями:

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

Вызов нестатического метода внутри класса
Здравствуйте! Подскажите пожалуйста, как вызвать внутри класса из одной функции - другую. Вот код: class reg { private $template; ...

Изменения внутри метода класса не отображаются из main
Не писал на c++ уже около года. Сейчас пришлось вернуться. И в первые минуты работы возникла проблема, которая просто в тупик ставит. ...

8
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
30.09.2015, 10:38
Goldsilver, вероятно файл PATH . SECONDPATH, уже был подключен ранее, а once означает, что подключен будет только 1 раз.
Глобальные переменные это конечно не хорошо, но это не значит что нужно писать говнокод лишь бы не было слова global.
А чтобы избежать использования глобальных переменных, нужно спроектировать систему так, чтобы они были не нужны.
0
9 / 9 / 5
Регистрация: 14.01.2015
Сообщений: 173
30.09.2015, 11:31  [ТС]
Цитата Сообщение от Jewbacabra Посмотреть сообщение
вероятно файл PATH . SECONDPATH, уже был подключен ранее, а once означает, что подключен будет только 1 раз.
да, спасибо это понятно. Но в таком случае переменная должна была быть видна...
0
775 / 444 / 93
Регистрация: 24.10.2012
Сообщений: 3,240
Записей в блоге: 5
30.09.2015, 12:06
Goldsilver, вот, что-то соорудил

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
33
34
35
<?php
 
$property = 'External property for class Test';
 
class Test {
    
    public $property;
 
    function test_method_one() {
        
        echo $this->property."<br/>\n";
    }
 
    function test_method_two() {
    
        echo $this->property."<br/>\n"; 
    }
 
    function test_method_three() {
        
        echo $this->property."<br/>\n";
    }
}
 
$Test = new Test;
 
$Test->property = $property;
 
$Test->test_method_one();
 
$Test->test_method_two();
 
$Test->test_method_three();
 
?>
Можно после создания объекта класса записать в его публичное свойство значение внешней от класса переменной и использовать это значение везде.

Добавлено через 22 минуты
Goldsilver, а можно так:

external_included_file.php
PHP
1
2
3
4
5
<?php
 
$property = 'property';
 
?>


PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
 
class Test {
    
    public $property;
    
    function __construct() {
        
        include_once('external_included_file.php');
 
        $this->property = $property;
    }
 
    function test_method_one() {
        
        echo $this->property."<br/>\n";
    }
}
 
$Test = new Test;
 
$Test->test_method_one(); ?>
Добавлено через 11 минут
Цитата Сообщение от Goldsilver
Хоть и подключается файл с переменной - но все равно не видно ее. Может из-за констант?
Нет, константы "видно" везде.

http://php.net/manual/ru/language.constants.php

...константы доступны из любой области видимости. Вы можете использовать константы в любом месте вашего скрипта, не обращая внимания на текущую область видимости.
Следовательно что в вашем коде в сообщении №1 вероятность того что файл подключается в метод где-то 100%. Но все равно не видно $property? Она в подключаемом файле должна быть просто прописана в файле, определена. Тогда она не определена в файле. Может быть она определена внутри функции подключаемого файла? Тогда она будет видима только внутри данной функции.

Можете сделать тест, напишите

PHP
1
echo 'Trace from included file, $property='.$property;
в конце подключаемого файла. Того файла, на который указывает PATH . SECONDPATH.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
30.09.2015, 12:51
Цитата Сообщение от Goldsilver Посмотреть сообщение
Но в таком случае переменная должна была быть видна
Она никому ничего не должна.
http://php.net/manual/ru/function.include.php
http://php.net/manual/ru/function.include-once.php
0
9 / 9 / 5
Регистрация: 14.01.2015
Сообщений: 173
30.09.2015, 13:02  [ТС]
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Она никому ничего не должна.
стоп... Это надо-было использовать require вместо include?!
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
30.09.2015, 13:04
Цитата Сообщение от Goldsilver Посмотреть сообщение
Это надо-было использовать require вместо include?!
Нет. Это вообще не надо использовать.
0
9 / 9 / 5
Регистрация: 14.01.2015
Сообщений: 173
30.09.2015, 13:10  [ТС]
Цитата Сообщение от tolimadokara Посмотреть сообщение
Goldsilver, вот, что-то соорудил
спасибо, но просто нужно в методе вывести сообщение, текст которой внутри переменной из другого файла.
По этому присваивать свойству значение ПОСЛЕ создания экземпляра - немного не то. Плюс сообщение от метода зависит и может быть в другой переменной. Что-то типа такого:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class A {
   public function bar($int) {
    if(int == 10) {
        echo $message['too_larg'];
    } else {
        echo "Ok";
    }
  }
 
 public function baz($int) {
    if(int === true) {
        echo $message_second['need_false'];
    } else {
        echo "Ok";
    }
  }
}
как-то так.

Цитата Сообщение от tolimadokara Посмотреть сообщение
а можно так:
спасибо. Но опять-таки -
сообщение от метода зависит и может быть в другой переменной.
Цитата Сообщение от tolimadokara Посмотреть сообщение
Нет, константы "видно" везде
вот я о том же - не-понятно что не так происходит.
Цитата Сообщение от tolimadokara Посмотреть сообщение
Но все равно не видно $property? Она в подключаемом файле должна быть просто прописана в файле, определена. Тогда она не определена в файле. Может быть она определена внутри функции подключаемого файла? Тогда она будет видима только внутри данной функции.
не не, в подключаемом файле только переменные - функций нет.

п.с. нужно постораться без gettext - такой вариант крайний...
0
775 / 444 / 93
Регистрация: 24.10.2012
Сообщений: 3,240
Записей в блоге: 5
01.10.2015, 14:19
Цитата Сообщение от Goldsilver
Цитата Сообщение от tolimadokara
Goldsilver, вот, что-то соорудил
спасибо, но просто нужно в методе вывести сообщение, текст которой внутри переменной из другого файла.
Вот же оно! Второй блок кода в этом посте.

Цитата Сообщение от Goldsilver
По этому присваивать свойству значение ПОСЛЕ создания экземпляра - немного не то. Плюс сообщение от метода зависит и может быть в другой переменной.
Ну так в вашем проекте есть допустим N классов. И объекты этих N классов создаются к примеру 5 раз.

Вот именно там где они создаются и присваивайте публичному свойству класса значение переменной $property

PHP
1
2
3
$Object = new Object;
 
$Object->property = $property;
Это проще чем везде в методах ставить global $property

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public function method_*() {
 
    global $property;
}
 
public function method_*() {
 
    global $property;
}
 
public function method_*() {
 
    global $property;
}
 
...
Цитата Сообщение от Goldsilver
Плюс сообщение от метода зависит и может быть в другой переменной.
Ок. Тогда

PHP
1
2
3
4
5
$Object = new Object;
                                                                                                                   
$Object->property_0 = $property_0;
$Object->property_1 = $property_1;
$Object->property_2 = $property_2;
Загружайте внешнее свойство для каждой внешней переменной.

Цитата Сообщение от Goldsilver
Цитата Сообщение от tolimadokara
Нет, константы "видно" везде
вот я о том же - не-понятно что не так происходит.
Послушайте, может быть у вас компьютер не корректно выключился? И поэтому локальный веб сервер перестал правильно работать? Переустановите веб сервер.

Вот этот код

PHP
1
2
3
4
5
6
class A {
  public function bar() {
    include_once(PATH . SECONDPATH);
    echo $property;
  }
}
имхо, должен без проблем отрабатываться и выводить значение переменной $property. Goldsilver, объект же класса A создается? Метод $A->bar() вызывается? Веб сервер ошибки какие то выводит? Notice может быть? Включите отображение ошибок в php. А если это хостинг то не получиться, да? Но есть ф-я ini_set. Можно ещё как то в веб сервере Apache включать отображение ошибок (если не ошибаюсь). Напишите в техн. поддержку хостинга, спросите там.

Goldsivler, Вы объясните как то по-проще что Вам нужно. А то не очень понятно.

Цитата Сообщение от Goldsilver
п.с. нужно постораться без gettext - такой вариант крайний...
А при чем тут gettext? Это же вообще что-то левое

Функции gettext реализуют NLS (Native Language Support) API, который может использоваться для интернационализации ваших PHP-приложений. Обратитесь к документации gettext для вашей системы или откройте её по адресу » http://www.gnu.org/software/ge... ttext.html.
http://php.net/manual/ru/intro.gettext.php

Вы просто хотите переделать какой-то самописный код? Дополняете своим функционалом и надо переделать что бы он заработал? Тогда сделайте это хоть как нибудь. Если проект не качественный, то... пускай уже он не качественным и остается. В хороших движках которые построены по принципу ООП таких трудностей появляться не должно. Там новый функционал должен просто подключаться.

Не по теме:

Цитата Сообщение от Jewbacabra
Глобальные переменные это конечно не хорошо, но это не значит что нужно писать говнокод лишь бы не было слова global.
А если весь проект это *код, что тогда, что бы нормально добавить новый функционал надо, имхо, переделывать весь код. А это много работы. Тогда пускай уже он и остается *кодом, проставить везде global и все :pardon:.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.10.2015, 14:19
Помогаю со студенческими работами здесь

Вызов public метода public класса внутри static метода static класса
Подскажите, пожалуйста, возможен вызов не статического метода не статического класса внутри статического метода статического класса? ...

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

Как избавиться от GLOBAL
Здравствуйте, что означает : &quot;Чтобы избавиться от необходимости использовать глобальные переменные, для функций существует...

Вызов constexpr метода, внутри класса в котором метод и объявлен
Есть статический constexpr метод. Есть статическая constexpr же константа, которая инициализируется этим самым методом. Ну или должна...

Как обратиться к методу из другого метода внутри одного и того же класса
Доброго времени суток. Продолжаю изучение C#, и вот моя третья тема (или четвертая, за сегодня) с вопросом. А не получается вот, что... ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru