Войти

Показать полную графическую версию : [решено] глобальные переменные в php


bruder
17-04-2008, 22:50
люди выскажите свои мнения насчет глобальных переменных в php. Имею в виду пользовательские. Есть две функции, надо из первой функции взять значение нескольких переменных из второй. Return не подходит, тк уже выдается другое значение. Как сделать это правильно. Пример

function a(){
n1=1;
n2=2;
}

function b(){

???(n1, n2)

}

Sham
17-04-2008, 23:29
//rtm - через $GLOBALS обращайся везде...
$GLOBALS['n1'] = 1 ; $GLOBALS['n1'] = 2;
//или
global $n1, $n2;

bruder
18-04-2008, 00:15
нет, я хотел сказать как избежать глобальных.

Sham
18-04-2008, 01:47
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;
}

bruder
18-04-2008, 13:27
вот кстати почему я и задал собстно вопрос. Я в начале написал класс. В фирме сторонники процедурного программирования и говорят что классы громоздки и медленны. Что если несколько функций хотят от класса чтолибо надо создавать новый объект что есть не гут.

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 - то, что вам нужно

bruder
18-04-2008, 15:10
убедительно :) Пойду переписывать на классы. Спасибо за разъяснения

Sham
18-04-2008, 20:55
Важно понимать различие ООП в PHP 4- и 5+ версий, т.е. этоpublic $n1; »только для PHP5

Классы imo применимы там, где действительно требуется объектная структура и много private-функций. Если же проект не громоздкий, то удобнее обычные функции...

т.е. необходимо самому прикинуть, что будет лучше... т.е.Весь мир работает с классами, потому что это удобно. »
это неправильный подход :)

Sham
19-04-2008, 01:07
если несколько функций хотят от класса чтолибо надо создавать новый объект »
Заблуждение.

rtm - для этого есть оператор "::"
class::function();

bruder
19-04-2008, 02:13
я думал так можно обратиться только к статичным методам в php5, но нет, проверил и правда работает. Причем проверил, конструктор не вызывается, значит не создается объект!? Какой смысл тогда делать это с new? Чтото путанно все както

Sham
19-04-2008, 03:53
Какой смысл тогда делать это с new? »
все это инструментарий программера, ему и решать, как удобнее и оптимальнее... конечно "::" - не ООП в полной мере, скорее удобная фича при наличии объемных классов (чтобы не объявлять класс ради одного метода например)...

bruder
19-04-2008, 11:03
а где можно подробно почитать о "::"? Почемуто очень мало про этот оператор написанно

vadimiron
19-04-2008, 12:46
bruder,
Оператор "::" обозначает статичный метод. Смысл его в том, чтобы использовать некую функциональность без создания объекта данного класса. Изначально это было придумано изза следущей логики: есть методы объекта, которые касаются только определённого объекта, например getName() возвращает имя определённой инстанции. А есть также методы, которые для любого объекта данного класса одинаковы, то есть статичные методы, например есть класс Person и у него метод Person::createWoman(), который создаёт инстанцию Person с предустановленными женскими характеристиками.

Я в своём framework-е использую часто чисто статичные классы, то есть классы, которые содержат только статичные методы, то есть получается что-то типа библиотеки функций. Например, есть класс HtmlFormTools, который может создавать такие вещи как кнопки submit и reset, селекты с месяцами, датами, годами и временем, ну и тому подобные вещи

bruder
19-04-2008, 13:22
да, это понятно. А почему я могу вызвать таким способом любую функцию не объявленную как static (пока не рассмативаем private). Например:

class Myclass{
function a(){
echo "my a";
}
}

Myclass::a();

так пашет. Все функции по умолчанию статичны?

vadimiron
19-04-2008, 14:19
bruder,
хм.... видимо да - что не есть хорошо. Никогда такое не замечал.

Я в любом случае статичные методы обозначаю как static, а обычные только в контексте объекта использую. Поэтому никогда не заечал, что и объектные методы могут вызываться как статичные - просто в этом случае будут естественно ошибки, если ещё использовать $this-> внутри таких функций

bruder
19-04-2008, 17:53
в этом случае будут естественно ошибки, если ещё использовать $this-> внутри таких функций »

а.. тогда все понятно. Какой тогда тут нафиг namespace, никаких внутриклассовых переменных. Практически тоже самое что функция вне класса. Отлично, почерпнул для себя очень много интересного, можно даже мини FAQ составить для начинающих :) Спасибо всем

Sham
19-04-2008, 21:45
где можно подробно почитать о "::" »
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