Какие области видимости есть в php
Блог веб разработки статьи | видеообзоры | исходный код
Область видимости php
Всем привет и рассмотрим следующий код:
$text = "Привет!"; $a = 5; $b = 3; function getTextAndSum()< echo $text."
"; echo $a + $b; > getTextAndSum();
Как и предполагалось функция getTextAndSum вернет нам не совсем корректное значение или совсем ничего.
Почему так происходит? Да потому что глобальные переменные $text, $a, $b будут доступны ко всем подключаемым файлам к этому модулю, но в функциях они увы не доступны. Более того в функция они инициализируются как локальные переменные и использовать их можно только там, пример:
$text = "Привет!"; $a = 5; $b = 3; function getTextAndSum()< $text = "Локальная переменная текст!"; $a = 10; $b = 10; echo $text."
"; echo $a + $b; > getTextAndSum();//Вызов функции /*Вывод глобальных переменных*/ echo "
"; echo $text."
"; echo $a + $b;
Но что если нам необходимо использовать глобальные переменные прямо в функции? Мы можем конечно же сделать так:
$text = "Привет!"; $a = 5; $b = 3; function getTextAndSum($text,$a,$b)< echo $text."
"; echo $a + $b; > getTextAndSum($text,$a,$b);
Передать функции переменные в виде параметров. А если допустим мы хотим изменить глобальную переменную прямо в функции такой метод уже не подойдет. Для этого мы можем воспользоваться ключевым словом global:
$text = "Привет!"; $a = 5; $b = 3; function getTextAndSum()< global $text,$a,$b; echo $text."
"; echo $a + $b; > getTextAndSum();
Как видите глобальные переменные стали доступны внутри функции. Более того мы можем их изменять:
$text = "Привет!"; $a = 5; $b = 3; function getTextAndSum() < global $text,$a,$b; $text = "Новое значение"; $a = 1; $b = 2; >getTextAndSum(); echo $text."
"; echo $a."
"; echo $b."
";
Мы также можем работать с глобальными переменными в функции через глобальный массив $GLOBALS.
$text = "Привет!"; $a = 5; $b = 3; function getTextAndSum()< echo $GLOBALS['text']."
"; echo $GLOBALS['a'] + $GLOBALS['b']; > getTextAndSum();
В массиве $GLOBALS содержаться все глобальные переменные данного контекста. С этим мы более или менее разобрались теперь рассмотрим работу с статическими переменными.
function staticPer() < static $a = 1; echo $a; $a++; >staticPer(); echo "
"; staticPer(); echo "
"; staticPer();
Что мы здесь видим. Функция staticPer вызывается у нас три раза причем при каждом новом вызове ее переменная увеличивается. Дадим краткое определение статическим переменным: Статическая переменная существует только в локальной области видимости функции, но не теряет своего значения, когда выполнение программы выходит из этой области видимости.
Рассмотрим пример с рекурсивным вызовом функции:
function staticPer()< static $a = 1; echo $a++."
"; if((int)$a > staticPer();
мы получили что на подобии цикла вывели числа от 1 до 10.Только не забудьте про условие выхода , иначе произойдет зацикливание.
Вот в принципе и все что я хотел вам рассказать про область видимости переменных. В дополнение к этой статье отлично подойдет Пространство имен в php.
На этом дорогие друзья все, надеюсь данная статья была для вас содержательной и интересной.
Я желаю вам удачи и успеха!
Оцените статью:
Статьи
- localstorage HTML
- Агрегатные функции в SQL
- IN BETWEEN SQL
- html во весь экран
- переменные css
- Vibrate api
- tkinter создание окна
- touch action CSS
- css zoom
Комментарии
Внимание. Комментарий теперь перед публикацией проходит модерацию
Все комментарии отправлены на модерацию
© 2017-2024 webfanat.com Все права защищены.
Запись экрана
Данное расширение позволяет записывать экран и выводит видео в формате webm
Добавить приложение на рабочий стол
#10 – Функции. Область видимости
Функции в PHP выполняют важную роль. Они обеспечивают сокращение кода за счет вынесения его в отдельные места. За урок мы научимся создавать функции и передавать в них значения.
Видеоурок
Функции можно назвать небольшими подпрограммами, куда можно вынести повторяющийся код и обращаться к нему, когда это будет нужно. Функции значительно облегчают построение программ, так как нам не надо копировать однотипный код множество раз, а можно просто воспользоваться одной общей функцией.
Многие путают функции и методы и не понимают отличий между ними. На самом деле отличий нет, так как что методы, что функции являются одним и тем же. Функции что записаны вне классов называют функциями, а функции что записаны внутри классов называются методами.
Точно такая же ситуация обстоит с переменным. В классах переменные называются полями, а вне классов — переменными.
В PHP функции создаются при помощи ключевого слова function . Каждая функция может иметь какие-либо параметры или же не иметь их вовсе. Функции способны что-либо возвращать в ходе выполнения кода, если это требуется.
Создание функции
На основе всех данных наша функция будет выглядеть следующим образом:
function test()
Функция выше не принимает никаких параметров и ничего не возвращает. Она просто пишет слово в консоль. Давайте разнообразим функцию и добавим параметр:
function test($word)
Теперь функция принимает параметр, который будет отображен в консоли.
Если функция должна что-либо вернуть, то прописываем тип данных который будет возвращен. Для возвращения данных используем ключевое слово return :
function test($some_number)
Область видимости
В PHP есть несколько полей видимости: локальная и глобальная. Если записать глобальную переменную, то такая переменная будем видна повсюду и с ней можно работать отовсюду в документе. Если записать локальную переменную, то такая переменная будет видна лишь в той области, где она записана.
Для создания глобальной переменной её необходимо прописать вне функции, класса или же объекта. Для создания локальных переменных вам достаточно поместить переменную в функцию. Переменная в функции будет видна лишь внутри блока с функцией и нигде более.
Если из функции мы хотим получить доступ к переменной записанной вне функции, то необходимо прописывать ключевое слово global :
$some = "Тест"; function getValue() < // echo $some; // Ничего не выведет echo global $some; // Выведет слово "Тест" >
Помимо этого можно создавать статические переменные, которые не будут становиться пустыми при новом их использовании:
function getNewValue() < // Создаем статическую переменную static $count = 0; $count += 4; echo $count; >getNewValue(); // Выведет 4 getNewValue(); // Выведет 8 getNewValue(); // Выведет 12 // и так далее
Весь код будет доступен после подписки на проект!
Какие области видимости есть в php
При использовании переменных и функций следует учитывать области видимости переменных. Область видимости задает область действия, доступности данной переменной.
Переменные в блоках цикла и условных конструкций
Блоки циклов и условных конструкций не образуют отдельной области видимости, и переменные, определенные в этих блоках, мы можем использовать вне этих блоков:
$condition = true; if($condition) < $name = "Tom"; >echo $name; // Tom
$i = 6; switch($i) < case 5: $name = "Tom"; break; case 6: $name = "Bob"; break; default: $name = "Sam"; break; >echo $name; // Bob
Локальные переменные
Локальные переменные создаются внутри функции. К таким переменным можно обратиться только изнутри данной функции. Например:
showName(); echo $name; // так написать нельзя, так как // переменная $name существует // только внутри функции showName( ?>
В данном случае в функции showName() определена локальная переменная $name . Соответственно обратиться в этой переменной мы можем только внутри функции showName() , но не вне ее.
То же самое относится и к параметрам функции: вне функции ее параметры также не существуют.
Статические переменные
На локальные переменные похожи статические. Они отличаются тем, что после завершения работы функции их значение сохраняется. При каждом новом вызове функция использует ранее сохраненное значение. Например:
getCounter(); // counter=1 getCounter(); // counter=2 getCounter(); // counter=3 ?>
Чтобы указать, что переменная будет статической, к ней добавляется ключевое слово static . При трех последовательных вызовах функции getCounter() переменная $counter будет увеличиваться на единицу.
Если бы переменная $counter была обычной нестатической, то при каждом вызове функция getCounter() выводила бы 1.
Как правило, статические переменные служат для создания различных счетчиков, как в примере выше.
Глобальные переменные
Глобальные переменные по умолчанию не доступны внутри функции. Например:
hello(); ?>
Данный код не будет работать, а интрепретатор PHP известит нас, что переменная $name не определена.
Тем не менее мы можем обратиться внутри функции к глобальной переменной. Для этого необходимо использовать ключевое слово global :
hello(); // Hello Tom ?>
Для получения доступа к глобальной переменной в функции с помощью оператора global объявляется переменная с тем же именем:
global $name;
После этого к глобальной переменной $name можно будет обращаться внутри функции. При чем мы можем не только получать ее значение, но и изменить его:
changeName(); echo $name; // Tomas ?>
В качестве альтернативы оператору global для обащения к глобальным переменным мы можем использовать встроенный массив $GLOBALS :
"; // изменяем значение переменной $name $GLOBALS["name"] = "Tomas"; > changeName(); echo "Новое имя: " . $name; ?>
Чтобы обратиться к глобальной переменной $name, применяется выражение $GLOBALS[«name»] — в квадратные скобки передается название переменной (без знака $). Результат работы скрипта:
Старое имя: Tom Новое имя: Tomas
Какие области видимости есть в php
Just a quick note that it’s possible to declare visibility for multiple properties at the same time, by separating them by commas.
18 years ago
Beware: Visibility works on a per-class-base and does not prevent instances of the same class accessing each others properties!
public function debugBar ( Foo $object )
// this does NOT violate visibility although $bar is private
echo $object -> bar , «\n» ;
>
public function setBar ( $value )
// Neccessary method, for $bar is invisible outside the class
$this -> bar = $value ;
>
public function setForeignBar ( Foo $object , $value )
// this does NOT violate visibility!
$object -> bar = $value ;
>
>
$a = new Foo ();
$b = new Foo ();
$a -> setBar ( 1 );
$b -> setBar ( 2 );
$a -> debugBar ( $b ); // 2
$b -> debugBar ( $a ); // 1
$a -> setForeignBar ( $b , 3 );
$b -> setForeignBar ( $a , 4 );
$a -> debugBar ( $b ); // 3
$b -> debugBar ( $a ); // 4
?>
11 years ago
if not overwritten, self::$foo in a subclass actually refers to parent’s self::$foo
class one
protected static $foo = «bar» ;
public function change_foo ( $value )
self :: $foo = $value ;
>
>
class two extends one
public function tell_me ()
echo self :: $foo ;
>
>
$first = new one ;
$second = new two ;
$second -> tell_me (); // bar
$first -> change_foo ( «restaurant» );
$second -> tell_me (); // restaurant
?>
16 years ago
I couldn’t find this documented anywhere, but you can access protected and private member varaibles in different instance of the same class, just as you would expect
class A
protected $prot ;
private $priv ;
public function __construct ( $a , $b )
$this -> prot = $a ;
$this -> priv = $b ;
>
public function print_other ( A $other )
echo $other -> prot ;
echo $other -> priv ;
>
>
class B extends A
>
$a = new A ( «a_protected» , «a_private» );
$other_a = new A ( «other_a_protected» , «other_a_private» );
$b = new B ( «b_protected» , «ba_private» );
$other_a -> print_other ( $a ); //echoes a_protected and a_private
$other_a -> print_other ( $b ); //echoes b_protected and ba_private
$b -> print_other ( $a ); //echoes a_protected and a_private
?>
7 years ago
> Members declared protected can be accessed only within
> the class itself and by inherited classes. Members declared
> as private may only be accessed by the class that defines
> the member.
This is not strictly true. Code outside the object can get and set private and protected members:
$sealed = new Sealed ;
var_dump ( $sealed ); // private $value => string(3) «foo»
call_user_func ( \Closure :: bind (
function () use ( $sealed ) < $sealed ->value = ‘BAZ’ ; >,
null ,
$sealed
));
var_dump ( $sealed ); // private $value => string(3) «BAZ»
?>
The magic lay in \Closure::bind, which allows an anonymous function to bind to a particular class scope. The documentation on \Closure::bind says:
> If an object is given, the type of the object will be used
> instead. This determines the visibility of protected and
> private methods of the bound object.
So, effectively, we’re adding a run-time setter to $sealed, then calling that setter. This can be elaborated to generic functions that can force set and force get object members:
function force_set ( $object , $property , $value ) call_user_func ( \Closure :: bind (
function () use ( $object , $property , $value ) $object -> < $property >= $value ;
>,
null ,
$object
));
>
function force_get ( $object , $property ) return call_user_func ( \Closure :: bind (
function () use ( $object , $property ) return $object ->< $property >;
>,
null ,
$object
));
>
force_set ( $sealed , ‘value’ , ‘quux’ );
var_dump ( force_get ( $sealed , ‘value’ )); // ‘quux’
?>
You should probably not rely on this ability for production quality code, but having this ability for debugging and testing is handy.
1 year ago
Dynamic properties are «public».
class MyClass public function setProperty ( $value ) $this -> dynamicProperty = $value ;
>
>
$obj = new MyClass ();
$obj -> setProperty ( ‘Hello World’ );
echo $obj -> dynamicProperty ; // Outputs «Hello World»
?>
This usage is the same as well:
class MyClass >
$obj = new MyClass ();
$obj -> dynamicProperty = ‘Hello World’ ;
echo $obj -> dynamicProperty ; // Outputs «Hello World»
?>
2 years ago
I see we can redeclare private properties into child class
class A private int $private_prop = 4 ;
protected int $protected_prop = 8 ;
>
class B extends A private int $private_prop = 7 ; // we can redeclare private property.
public function printAll () echo $this -> private_prop ;
echo $this -> protected_prop ;
>
>
$b = new B ;
$b -> printAll (); // show 78
>
?>
- Классы и объекты
- Введение
- Основы
- Свойства
- Константы классов
- Автоматическая загрузка классов
- Конструкторы и деструкторы
- Область видимости
- Наследование
- Оператор разрешения области видимости (::)
- Ключевое слово static
- Абстрактные классы
- Интерфейсы объектов
- Трейты
- Анонимные классы
- Перегрузка
- Итераторы объектов
- Магические методы
- Ключевое слово final
- Клонирование объектов
- Сравнение объектов
- Позднее статическое связывание
- Объекты и ссылки
- Сериализация объектов
- Ковариантность и контравариантность
- Журнал изменений ООП
- Copyright © 2001-2024 The PHP Group
- My PHP.net
- Contact
- Other PHP.net sites
- Privacy policy