PHP5: const против статического

в PHP5, в чем разница между использованием const и static? Когда каждое подходящее? И какую роль играет public, protected и private играть - если таковые имеются.

7 ответов


в контексте класса статические переменные находятся в области класса (а не объекта), но в отличие от 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.

Public, protected и private не имеют значения с точки зрения const (которые всегда являются общедоступными); они полезны только для переменных класса, включая статическую переменную.

  • общедоступные статические переменные могут быть доступны в любом месте через ClassName::$variable.
  • можно получить доступ к защищенным статическим переменным определяющим классом или расширяющими классами через переменную ClassName::$.
  • частные статические переменные могут быть доступны только определяющему классу через переменную ClassName::$.

Edit: важно отметить, что PHP 7.1.0 представил поддержку для указания видимости констант класса.


последний момент, который следует сделать, заключается в том, что const всегда статичен и общедоступен. Это означает, что вы можете получить доступ к const из класса вот так:

class MyClass
{
     const MYCONST = true;
     public function test()
     {
          echo self::MYCONST;
     }
}

из-за пределов класса вы получите доступ к нему следующим образом:

echo MyClass::MYCONST;

постоянный - это просто константа, т. е. вы не можете изменить ее значение после объявления.

Static переменная доступна без создания экземпляра класса и, следовательно, совместно используется всеми экземплярами класса.

кроме того, может быть 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"

объявление метода или свойства класса как статического делает их доступными без необходимости создания экземпляра класса.

константа класса похожа на обычную константу, ее нельзя изменить во время выполнения. Это также единственная причина, по которой вы когда-либо будете использовать const.

Private, public и protected-модификаторы доступа, описывающие, кто может получить доступ к какому параметру / методу.

Public означает, что все остальные объекты получает доступ. Private означает, что только экземпляр класса получает доступ. Защищенный означает, что экземпляр класса и производные классы получает доступ.


Итак, чтобы резюмировать на @Matt отличный ответ:

  • в большинстве ситуаций вам понадобится частное / защищенное статическое свойство, поэтому константы не являются опцией.

  • если свойство, которое вам нужно, должно быть общедоступным, но не изменено, константа A является правильным выбором.

пример:

class User{
    private static $PASSWORD_SALT = "ASD!@~#asd1";
    ...
}

class Product{
    const INTEREST = 0.10;
    ...
}

вот то , что я узнал до сих пор о статических членах,постоянных переменных и модификаторах доступа(частных, публичных и защищенных). постоянный

определение

как имя говорит, что значения постоянной переменной не могут быть изменены.Константы отличаются от нормальных переменных тем, что вы не используете символ $ для их объявления или использования.

значение должно быть постоянным выражением, а не (например) переменной, свойством, результатом математической операции или вызова функции.

Примечание: значение переменной не может быть ключевым словом (например, 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

определение

ключевое слово Static можно использовать для объявления класса, функции-члена или переменная.Статические члены в классе глобальны, также можно получить доступ с помощью ключевого слова self.Объявление свойств и методов класса статическими позволяет обращаться к ним без создания экземпляра класса. Свойство, объявленное статическим, не может быть доступно с экземпляром объекта класса (хотя статический метод может). Если объявление видимости (public, private, protected) не используется, то свойство или метод будет рассматриваться как если бы он был объявлен как public.Потому что статические методы вызываться без экземпляра созданного объекта.

Примечание : псевдо-переменная $This не доступна внутри метода объявлено как статическое.Статические свойства не могут быть доступны через объект с помощью оператора стрелки ->

начиная с 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";

 ?>

Public, private, protected (A. K. модификаторы доступа)

прежде чем читать определение ниже, прочитайте эту статью об инкапсуляции .Это поможет вам понять концепцию более глубоко

ссылка 1 Википедия

учебники указывают ссылку о инкапсуляция

определение

используя частные , открытые, защищенные ключевые слова, вы можете управлять доступом к членам класса. Члены класса, объявленные общедоступными, могут быть доступны везде. Члены, объявленные защищенными, могут быть доступны только внутри самого класса и наследуемыми и родительскими классами. Члены, объявленные как частные, могут быть доступны только классу, определяющему член.

пример

 <?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

Я надеюсь, вы поняли концепцию. Спасибо за чтение:):) имейте хороший