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

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

30.09.2015, 10:09. Показов 1322. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.09.2015, 10:09
Ответы с готовыми решениями:

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

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

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

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

8
502 bad gateway
Эксперт PHP
4609 / 3749 / 1565
Регистрация: 24.04.2014
Сообщений: 10,984
30.09.2015, 10:38 2
Goldsilver, вероятно файл PATH . SECONDPATH, уже был подключен ранее, а once означает, что подключен будет только 1 раз.
Глобальные переменные это конечно не хорошо, но это не значит что нужно писать говнокод лишь бы не было слова global.
А чтобы избежать использования глобальных переменных, нужно спроектировать систему так, чтобы они были не нужны.
0
9 / 9 / 5
Регистрация: 14.01.2015
Сообщений: 173
30.09.2015, 11:31  [ТС] 3
Цитата Сообщение от Jewbacabra Посмотреть сообщение
вероятно файл PATH . SECONDPATH, уже был подключен ранее, а once означает, что подключен будет только 1 раз.
да, спасибо это понятно. Но в таком случае переменная должна была быть видна...
0
775 / 444 / 93
Регистрация: 24.10.2012
Сообщений: 3,240
Записей в блоге: 5
30.09.2015, 12:06 4
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
502 bad gateway
Эксперт PHP
4609 / 3749 / 1565
Регистрация: 24.04.2014
Сообщений: 10,984
30.09.2015, 12:51 5
Цитата Сообщение от 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  [ТС] 6
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Она никому ничего не должна.
стоп... Это надо-было использовать require вместо include?!
0
502 bad gateway
Эксперт PHP
4609 / 3749 / 1565
Регистрация: 24.04.2014
Сообщений: 10,984
30.09.2015, 13:04 7
Цитата Сообщение от Goldsilver Посмотреть сообщение
Это надо-было использовать require вместо include?!
Нет. Это вообще не надо использовать.
0
9 / 9 / 5
Регистрация: 14.01.2015
Сообщений: 173
30.09.2015, 13:10  [ТС] 8
Цитата Сообщение от 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 9
Цитата Сообщение от 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.10.2015, 14:19

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru