Показать полную графическую версию : [решено] глобальные переменные в php
люди выскажите свои мнения насчет глобальных переменных в php. Имею в виду пользовательские. Есть две функции, надо из первой функции взять значение нескольких переменных из второй. Return не подходит, тк уже выдается другое значение. Как сделать это правильно. Пример
function a(){
n1=1;
n2=2;
}
function b(){
???(n1, n2)
}
//rtm - через $GLOBALS обращайся везде...
$GLOBALS['n1'] = 1 ; $GLOBALS['n1'] = 2;
//или
global $n1, $n2;
нет, я хотел сказать как избежать глобальных.
bruder, иначе, рули аргументами (в зависимости от их значения пусть выдает то что нужно)...
vadimiron
18-04-2008, 02:10
bruder,
Для этого есть понятие как объектно-ориентированное программирование. Создайте нужный класс и возвращайте объекты данного класса
class MyFunctionReturnClass
{
public $n1;
public $n2;
}
-----------------------------------
function a(){
$ret=new MyFunctionReturnClass();
$ret->n1=1;
$ret->n2=2;
return $ret;
}
вот кстати почему я и задал собстно вопрос. Я в начале написал класс. В фирме сторонники процедурного программирования и говорят что классы громоздки и медленны. Что если несколько функций хотят от класса чтолибо надо создавать новый объект что есть не гут.
function a(){
$ret=new MyFunctionReturnClass();
}
function b(){
$ret=new MyFunctionReturnClass();
}
Хотя можно наверно объявить его глобальным и передавать ссылкой
$ret=new MyFunctionReturnClass();
function a(&$ret){
......
}
какие тут минусы?
vadimiron
18-04-2008, 14:21
классы громоздки и медленны »
Маразм!!!! "Громоздки" - если их не понимать. "Медленны" - у меня примерно 120 классов, из которых на каждой странице в среднем 40 подгружены - всё быстро и без проблем.
Весь мир работает с классами, потому что это удобно.
надо создавать новый объект что есть не гут. »
Если у вас только не 10 Мб свободной памяти - на современных машинах нет проблем по обработке большого количества объектов
Хотя можно наверно объявить его глобальным и передавать ссылкой »
Если уж совсем приспичало именно один раз класс инстанциировать, то почитайте про Singleton - то, что вам нужно
убедительно :) Пойду переписывать на классы. Спасибо за разъяснения
Важно понимать различие ООП в PHP 4- и 5+ версий, т.е. этоpublic $n1; »только для PHP5
Классы imo применимы там, где действительно требуется объектная структура и много private-функций. Если же проект не громоздкий, то удобнее обычные функции...
т.е. необходимо самому прикинуть, что будет лучше... т.е.Весь мир работает с классами, потому что это удобно. »
это неправильный подход :)
если несколько функций хотят от класса чтолибо надо создавать новый объект »
Заблуждение.
rtm - для этого есть оператор "::"
class::function();
я думал так можно обратиться только к статичным методам в php5, но нет, проверил и правда работает. Причем проверил, конструктор не вызывается, значит не создается объект!? Какой смысл тогда делать это с new? Чтото путанно все както
Какой смысл тогда делать это с new? »
все это инструментарий программера, ему и решать, как удобнее и оптимальнее... конечно "::" - не ООП в полной мере, скорее удобная фича при наличии объемных классов (чтобы не объявлять класс ради одного метода например)...
а где можно подробно почитать о "::"? Почемуто очень мало про этот оператор написанно
vadimiron
19-04-2008, 12:46
bruder,
Оператор "::" обозначает статичный метод. Смысл его в том, чтобы использовать некую функциональность без создания объекта данного класса. Изначально это было придумано изза следущей логики: есть методы объекта, которые касаются только определённого объекта, например getName() возвращает имя определённой инстанции. А есть также методы, которые для любого объекта данного класса одинаковы, то есть статичные методы, например есть класс Person и у него метод Person::createWoman(), который создаёт инстанцию Person с предустановленными женскими характеристиками.
Я в своём framework-е использую часто чисто статичные классы, то есть классы, которые содержат только статичные методы, то есть получается что-то типа библиотеки функций. Например, есть класс HtmlFormTools, который может создавать такие вещи как кнопки submit и reset, селекты с месяцами, датами, годами и временем, ну и тому подобные вещи
да, это понятно. А почему я могу вызвать таким способом любую функцию не объявленную как static (пока не рассмативаем private). Например:
class Myclass{
function a(){
echo "my a";
}
}
Myclass::a();
так пашет. Все функции по умолчанию статичны?
vadimiron
19-04-2008, 14:19
bruder,
хм.... видимо да - что не есть хорошо. Никогда такое не замечал.
Я в любом случае статичные методы обозначаю как static, а обычные только в контексте объекта использую. Поэтому никогда не заечал, что и объектные методы могут вызываться как статичные - просто в этом случае будут естественно ошибки, если ещё использовать $this-> внутри таких функций
в этом случае будут естественно ошибки, если ещё использовать $this-> внутри таких функций »
а.. тогда все понятно. Какой тогда тут нафиг namespace, никаких внутриклассовых переменных. Практически тоже самое что функция вне класса. Отлично, почерпнул для себя очень много интересного, можно даже мини FAQ составить для начинающих :) Спасибо всем
где можно подробно почитать о "::" »
http://www.google.com/search?hl=ru&rls=ru&q=Paamayim+Nekudotayim&lr=lang_ru
просто в этом случае будут естественно ошибки, если ещё использовать $this-> внутри таких функций »
self::method();// вместо this
parent::method();// метод из родительского класса
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.