Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   [решено] глобальные переменные в php (http://forum.oszone.net/showthread.php?t=105249)

bruder 17-04-2008 22:50 783635

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

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

function b(){

???(n1, n2)

}

Sham 17-04-2008 23:29 783661

PHP код:

//rtm - через $GLOBALS обращайся везде...
$GLOBALS['n1'] = $GLOBALS['n1'] = 2;
//или
global $n1$n2


bruder 18-04-2008 00:15 783678

нет, я хотел сказать как избежать глобальных.

Sham 18-04-2008 01:47 783713

bruder, иначе, рули аргументами (в зависимости от их значения пусть выдает то что нужно)...

vadimiron 18-04-2008 02:10 783722

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

PHP код:

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 783976

вот кстати почему я и задал собстно вопрос. Я в начале написал класс. В фирме сторонники процедурного программирования и говорят что классы громоздки и медленны. Что если несколько функций хотят от класса чтолибо надо создавать новый объект что есть не гут.
PHP код:

function a(){
$ret=new MyFunctionReturnClass();
}  


function 
b(){
$ret=new MyFunctionReturnClass();


Хотя можно наверно объявить его глобальным и передавать ссылкой

PHP код:

$ret=new MyFunctionReturnClass();

function 
a(&$ret){
......


какие тут минусы?

vadimiron 18-04-2008 14:21 784030

Цитата:

Цитата bruder
классы громоздки и медленны »

Маразм!!!! "Громоздки" - если их не понимать. "Медленны" - у меня примерно 120 классов, из которых на каждой странице в среднем 40 подгружены - всё быстро и без проблем.
Весь мир работает с классами, потому что это удобно.

Цитата:

Цитата bruder
надо создавать новый объект что есть не гут. »

Если у вас только не 10 Мб свободной памяти - на современных машинах нет проблем по обработке большого количества объектов

Цитата:

Цитата bruder
Хотя можно наверно объявить его глобальным и передавать ссылкой »

Если уж совсем приспичало именно один раз класс инстанциировать, то почитайте про Singleton - то, что вам нужно

bruder 18-04-2008 15:10 784102

убедительно :) Пойду переписывать на классы. Спасибо за разъяснения

Sham 18-04-2008 20:55 784288

Важно понимать различие ООП в PHP 4- и 5+ версий, т.е. это
Цитата:

Цитата vadimiron
public $n1; »

только для PHP5

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

т.е. необходимо самому прикинуть, что будет лучше... т.е.
Цитата:

Цитата vadimiron
Весь мир работает с классами, потому что это удобно. »

это неправильный подход :)

Sham 19-04-2008 01:07 784510

Цитата:

Цитата bruder
если несколько функций хотят от класса чтолибо надо создавать новый объект »

Заблуждение.

rtm - для этого есть оператор "::"
Код:

class::function();

bruder 19-04-2008 02:13 784548

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

Sham 19-04-2008 03:53 784569

Цитата:

Цитата bruder
Какой смысл тогда делать это с new? »

все это инструментарий программера, ему и решать, как удобнее и оптимальнее... конечно "::" - не ООП в полной мере, скорее удобная фича при наличии объемных классов (чтобы не объявлять класс ради одного метода например)...

bruder 19-04-2008 11:03 784670

а где можно подробно почитать о "::"? Почемуто очень мало про этот оператор написанно

vadimiron 19-04-2008 12:46 784720

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

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

bruder 19-04-2008 13:22 784744

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

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

Myclass::a();

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

vadimiron 19-04-2008 14:19 784784

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

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

bruder 19-04-2008 17:53 784889

Цитата:

Цитата vadimiron
в этом случае будут естественно ошибки, если ещё использовать $this-> внутри таких функций »

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

Sham 19-04-2008 21:45 785076

Цитата:

Цитата bruder
где можно подробно почитать о "::" »

http://www.google.com/search?hl=ru&r...yim&lr=lang_ru
Цитата:

Цитата vadimiron
просто в этом случае будут естественно ошибки, если ещё использовать $this-> внутри таких функций »

PHP код:

self::method();// вместо this
parent::method();// метод из родительского класса 



Время: 15:19.

Время: 15:19.
© OSzone.net 2001-