В PHP 5, в чем разница между использованием const
и static
?
Когда каждый уместен? И какую роль играют public
, protected
и private
- если таковая имеется?
В PHP 5, в чем разница между использованием const
и static
?
Когда каждый уместен? И какую роль играют public
, protected
и private
- если таковая имеется?
В контексте класса статические переменные находятся в области видимости класса (не объекта), но в отличие от const, их значения могут быть изменены.
class ClassName {
static $my_var = 10; /* defaults to public unless otherwise specified */
const MY_CONST = 5;
}
echo ClassName::$my_var; // returns 10
echo ClassName::MY_CONST; // returns 5
ClassName::$my_var = 20; // now equals 20
ClassName::MY_CONST = 20; // error! won't work.
Публичный, защищенный и частный не имеют значения с точки зрения контентов (которые всегда являются публичными); они полезны только для переменных класса, включая статические переменные.
Изменение: Важно отметить, что PHP 7.1.0 представил поддержку для определения видимости констант класса.
Один последний момент, который должен быть сделан, состоит в том, что константа всегда статична и общедоступна. Это означает, что вы можете получить доступ к const из класса, например:
class MyClass
{
const MYCONST = true;
public function test()
{
echo self::MYCONST;
}
}
Извне класса вы получите доступ к нему следующим образом:
echo MyClass::MYCONST;
Константа - это просто константа, т.е. вы не можете изменить ее значение после объявления.
Статическая переменная доступна без создания экземпляра класса и поэтому разделяется между всеми экземплярами класса.
Кроме того, в функции, которая объявляется только один раз (при первом выполнении функции), может быть локальная переменная static и может сохранять ее значение между вызовами функций, например:
function foo()
{
static $numOfCalls = 0;
$numOfCalls++;
print("this function has been executed " . $numOfCalls . " times");
}
Говоря о наследовании классов, вы можете различать константу или переменную в разных областях, используя ключевые слова self
и static
. Проверьте этот пример, который иллюстрирует, как получить доступ к чему:
class Person
{
static $type = 'person';
const TYPE = 'person';
static public function getType(){
var_dump(self::TYPE);
var_dump(static::TYPE);
var_dump(self::$type);
var_dump(static::$type);
}
}
class Pirate extends Person
{
static $type = 'pirate';
const TYPE = 'pirate';
}
А затем сделайте:
$pirate = new Pirate();
$pirate::getType();
или же:
Pirate::getType();
Выход:
string(6) "person"
string(6) "pirate"
string(6) "person"
string(6) "pirate"
Другими словами, self::
относится к статическому свойству и константе из той же области, в которой он вызывается (в данном случае суперклассу Person
), тогда как static::
будет обращаться к свойству и константе из области во время выполнения (так в этот случай в Pirate
подклассе).
Подробнее о позднем статическом связывании читайте здесь на php.net.
Также проверьте ответ на другой вопрос здесь и здесь.
Объявление метода или свойства класса как статичного делает их доступными без необходимости создания экземпляра класса.
Константа класса похожа на нормальную константу, она не может быть изменена во время выполнения. Это также единственная причина, по которой вы когда-либо будете использовать const для.
Частные, общедоступные и защищенные - это модификаторы доступа, которые описывают, кто может получить доступ к этому параметру/методу.
Public означает, что все другие объекты получают доступ. Частный означает, что доступ только к экземпляру класса. Защищенный означает, что доступный класс и производные классы получает доступ.
Напомним, @Matt отличный ответ:
если нужное свойство не должно быть изменено, то правильным выбором будет константа
если нужное свойство разрешено изменять, используйте вместо него статический
Пример:
class User{
private static $PASSWORD_SALT = "[email protected]~#asd1";
...
}
class Product{
const INTEREST = 0.10;
...
}
Изменение: важно отметить, что PHP 7.1.0 представил поддержку для определения видимости констант класса.
Вот что я узнал до сих пор о статических членах, постоянных переменных и модификаторах доступа (закрытых, общедоступных и защищенных). Constant
Определение
Как и имя, значения константной переменной не могут быть изменены. Константы отличаются от обычных переменных тем, что вы не используете символ $для объявления или использования.
Значение должно быть константным выражением, а не (например) переменной, свойством, результатом математической операции или вызовом функции.
Примечание. Значение переменной не может быть ключевым словом (например, self, parent и статические).
Объявление константы в php
<?php
class constantExample{
const CONSTANT = 'constant value'; //constant
}
?>
Постоянная область видимости является глобальной и может быть доступна с использованием ключевого слова self
<?php
class MyClass
{
const CONSTANT = 'constant value';
function showConstant() {
echo self::CONSTANT . "\n";
}
}
echo MyClass::CONSTANT . "\n";
$classname = "MyClass";
echo $classname::CONSTANT . "\n"; // As of PHP 5.3.0
$class = new MyClass();
$class->showConstant();
echo $class::CONSTANT."\n"; // As of PHP 5.3.0
?>
Static
Определение
Статическое ключевое слово может быть использовано для объявления класса, функции-члена или переменной. Элементы-члены в классе являются глобальными и могут быть доступны с использованием собственного ключевого слова. Определение свойств класса или методов как статических делает их доступными без необходимости создания экземпляра класса. Свойство, объявленное как статическое, не может быть доступно с помощью экземпляра объекта класса (хотя может использоваться статический метод). Если не используется декларация видимости (public, private, protected), свойство или метод будут обрабатываться так, как если бы они были объявлены как public. Поскольку статические методы могут быть вызваны без экземпляра созданного объекта.
Примечание: псевдопеременная $this недоступна внутри метода объявлен как static.Static свойства не могут быть доступны через объект с помощью оператора стрелки →
Начиная с PHP 5.3.0, можно ссылаться на класс, используя переменную. Значение переменной не может быть ключевым словом (например, self, parent и static).
Пример статического свойства
<?php
class Foo
{
public static $my_static = 'foo'; //static variable
public static function staticValue() { //static function example
return self::$my_static; //return the static variable declared globally
}
}
?>
Доступ к примерам статических свойств и функций
<?php
print Foo::$my_static . "\n";
$foo = new Foo();
print $foo->staticValue() . "\n";
print $foo->my_static . "\n"; // Undefined "Property" my_static
print $foo::$my_static . "\n";
$classname = 'Foo';
print $classname::$my_static . "\n"; // As of PHP 5.3.0
print Bar::$my_static . "\n";
$bar = new Bar();
print $bar->fooStatic() . "\n";
?>
Открытый, закрытый, защищенный (модификаторы доступа A.K.A)
Прежде чем читать определение ниже, прочитайте эту статью об инкапсуляции. Это поможет вам глубже понять концепцию
Учебная ссылка на ссылку об инкапсуляции
Определение
Используя закрытые, общедоступные, защищенные ключевые слова, вы можете контролировать доступ к членам класса. К членам класса, объявленным публичными, можно получить доступ во всех странах. Доступ к элементам, объявленным защищенными, может быть доступен только внутри самого класса и наследуемых и родительских классов. Участникам, объявленным как private, может быть доступен только класс, который определяет член.
Пример
<?php
class Example{
public $variable = 'value'; // variable declared as public
protected $variable = 'value' //variable declared as protected
private $variable = 'value' //variable declared as private
public function functionName() { //public function
//statements
}
protected function functionName() { //protected function
//statements
}
private function functionName() { //private function
//statements
}
}
?>
Доступ к публичному, закрытому и защищенному примерам членов
Доступна и изменена общедоступная переменная извне класса или внутри класса. Но вы можете получить доступ к закрытым и защищенным переменным и функциям только изнутри класса. Вы не можете изменить значение защищенных или открытых элементов вне класса.
<?php
class Example{
public $pbVariable = 'value';
protected $protVariable = 'value';
private $privVariable = 'value';
public function publicFun(){
echo $this->$pbVariable; //public variable
echo $this->$protVariable; //protected variable
echo $this->privVariable; //private variable
}
private function PrivateFun(){
//some statements
}
protected function ProtectedFun(){
//some statements
}
}
$inst = new Example();
$inst->pbVariable = 'AnotherVariable'; //public variable modifed from outside
echo $inst->pbVariable; //print the value of the public variable
$inst->protVariable = 'var'; //you can't do this with protected variable
echo $inst->privVariable; // This statement won't work , because variable is limited to private
$inst->publicFun(); // this will print the values inside the function, Because the function is declared as a public function
$inst->PrivateFun(); //this one won't work (private)
$inst->ProtectedFun(); //this one won't work as well (protected)
?>
Для получения дополнительной информации прочитайте эту документацию php о видимости Видимость Php Doc
Ссылки: php.net
Надеюсь, вы поняли концепцию. Спасибо за чтение:):) Имейте хороший