PHP 5: Sabit ve Statik


Yanıtlar:


187

Bir sınıf bağlamında, statik değişkenler sınıf kapsamı (nesne değil) kapsamı üzerindedir, ancak bir sabitin aksine, değerleri değiştirilebilir.

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.

Kamu, korunan ve özel (her zaman kamuya açık olan) consts açısından önemsizdir; yalnızca statik değişken dahil sınıf değişkenleri için kullanışlıdır.

  • genel statik değişkenlere ClassName :: $ değişkeni üzerinden her yerden erişilebilir.
  • korumalı statik değişkenlere tanımlayıcı sınıf veya sınıfları genişleterek ClassName :: $ değişkeni üzerinden erişilebilir.
  • özel statik değişkenlere yalnızca tanımlayıcı sınıf tarafından ClassName :: $ değişkeni üzerinden erişilebilir.

Düzenleme: PHP 7.1.0'ın sınıf sabitlerinin görünürlüğünü belirlemek için destek sağladığını unutmamak önemlidir .


27
self::$variableKorumalı statik ve özel statik değişkenler için kullanmayı tercih ederim, çünkü sınıfın en başında olan sınıf adını sadece bir kez kendi içinde tutmayı tercih ederim.
Lukman

3
Evet, iyi bir nokta, sınıfın kendisinden referans alırken self anahtar kelimesinin kullanılabileceğinden bahsetmeyi ihmal ettim. Yukarıda verdiğim örnekler sınıf tanımının dışında gerçekleştirildi, bu durumda sınıf adı kullanılmalıdır.
Matt Huggins

Büyük cevap, kabul etmeye çok yakın. Lütfen bir noktayı açıklığa kavuşturabilir misiniz: "Kamusal, korumalı ve özel, devlet açısından önemsiz" - Neden? Varsayımlar varsayılan olarak herkese açık mıdır? hepsi özel mi?
Chris Jacob

1
statik bir var a gerek yok $mu? static $my_var = 10;tanımında
Daniel W.

Eski iş parçacığı, ama bir şey eklemek istiyorum: değişkenler singleton ve özyinelemeli işlevler de çok yararlı olduğunu açıklayan php.net/manual/en/… , göz atınstatic . Çünkü değeri değiştirebiliyorsunuz ancak değişken sadece bir kez başlatılacak. Teklitonun nasıl oluşturulacağı hakkında daha fazla açıklama için stackoverflow.com/questions/203336/… adresine bakın . Benim için bunlar statik değişkenleri tercih ettiğim bazı durumlar.
Erik van de Ven

20

Yapılması gereken son bir nokta, bir sabitin her zaman statik ve halka açık olmasıdır. Bu, const'a sınıf içinden şu şekilde erişebileceğiniz anlamına gelir:

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

Sınıf dışından şu şekilde erişirsiniz:

echo MyClass::MYCONST;

1
bu beyan doğru mu? "const her zaman statik ve halka açıktır"?
apil.tamang

7
Bu artık doğru değil. PHP 7.1'den itibaren sınıf sabitleri özel veya korumalı olarak bildirilebilir. Bakınız RFC
Hoşnutsuz Keçi

11

Sabit sadece bir sabittir, yani bildirdikten sonra değerini değiştiremezsiniz.

Statik değişken, bir sınıf örneği oluşturmadan erişilebilir ve bu nedenle bir sınıfın tüm örnekleri arasında paylaşılır.

Ayrıca, bir işlevde yalnızca bir kez bildirilen (bir işlevin ilk yürütülmesinde) ve işlev çağrıları arasında değerini depolayabilen statik bir yerel değişken olabilir, örneğin:

function foo()
{
   static $numOfCalls = 0;
   $numOfCalls++;
   print("this function has been executed " . $numOfCalls . " times");
}

7

Sınıf mirası hakkında konuşurken, selfve staticanahtar kelimeler kullanarak farklı kapsamlardaki sabit veya değişken arasında ayrım yapabilirsiniz . Aşağıdakilere nasıl erişileceğini gösteren bu örneği kontrol edin:

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';
}

Ve sonra yapın:

$pirate = new Pirate();
$pirate::getType();

veya:

Pirate::getType();

Çıktı:

string(6) "person" 
string(6) "pirate" 
string(6) "person" 
string(6) "pirate"

Başka bir deyişle self::, statik özelliği ve çağrıldığı kapsamın sabitini (bu örnekte Personüst sınıf) ifade ederken static::, çalışma süresinde özelliğe ve sabitin kapsamından erişir (bu durumda Piratealt sınıfta).

Geç statik bağlama hakkında daha fazla bilgiyi burada php.net adresinde bulabilirsiniz .
Ayrıca burada ve burada başka bir sorunun cevabını kontrol edin .


4

Sınıf yönteminin veya özelliğinin statik olarak bildirilmesi, sınıfın somutlaştırılmasına gerek kalmadan bunları erişilebilir kılar.

Sınıf sabiti normal bir sabite benzer, çalışma zamanında değiştirilemez. Bu da const'u kullanmanızın tek nedenidir.

Özel, genel ve korumalı, kimin hangi parametreye / yönteme erişebileceğini tanımlayan erişim değiştiricilerdir.

Genel, diğer tüm nesnelerin erişebileceği anlamına gelir. Özel, yalnızca somutlaştırılmış sınıfın erişebileceği anlamına gelir. Korumalı, örneklenen sınıfın ve türetilmiş sınıfların eriştiği anlamına gelir.


2

Statik üyeler, sabit değişkenler ve erişim değiştiricileri (özel, genel ve korumalı) hakkında şimdiye kadar öğrendiğim şeyler. sabit

Tanım

Adın dediği gibi, sabit bir değişkenin değerleri değiştirilemez.Kurumsallar normal değişkenlerden farklıdır, bildirmek veya kullanmak için $ sembolünü kullanmazsınız.

Değer, sabit bir ifade olmalıdır (örneğin) bir değişken, bir özellik, bir matematiksel işlemin sonucu veya bir işlev çağrısı olmamalıdır.

Not: Değişkenin değeri bir anahtar kelime olamaz (ör. Öz, üst ve statik).

Php sabit bildirme

<?php
class constantExample{

   const CONSTANT = 'constant value'; //constant

 }
?>

Constant'ın kapsamı geneldir ve kendi kendine bir anahtar kelime kullanılarak erişilebilir

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

?>

Statik

Tanım

Statik anahtar kelime sınıfı, üye işlevini veya değişkeni bildirmek için kullanılabilir.Sınıftaki statik üyelere genel olarak kendi kendine bir anahtar kelime kullanılarak da erişilebilir. . Statik olarak bildirilen bir özelliğe, örneklenmiş bir sınıf nesnesiyle erişilemez (ancak statik bir yöntem olabilir). Görünürlük bildirimi (genel, özel, korumalı) kullanılmazsa, özellik veya yöntem, herkese açık olarak bildirilmiş gibi değerlendirilir.

Not: $ sözde değişkeni statik olarak bildirilen yöntemde kullanılamaz.Statik özelliklere ok operatörü kullanılarak nesne üzerinden erişilemez ->

PHP 5.3.0'dan itibaren, bir değişken kullanarak sınıfa başvurmak mümkündür. > Değişkeninin değeri bir anahtar kelime olamaz (ör. Öz, üst ve statik).

Statik özellik örneği

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

?>

Statik özelliklere ve işlevlere erişme örneği

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

 ?>

Genel, özel, korumalı (AKA erişim değiştiricileri)

Aşağıdaki tanımı okumadan önce, Kapsülleme ile ilgili bu Makaleyi okuyun.Bu konsepti daha derinlemesine anlamanıza yardımcı olacaktır.

Bağlantı 1 wikipedia

Öğreticiler kapsülleme ile ilgili bağlantıyı gösteriyor

Tanım

Özel, herkese açık, korunan anahtar kelimeler kullanarak bir sınıftaki üyelere erişimi kontrol edebilirsiniz. Herkese açık ilan edilen sınıf üyelerine her yerden erişilebilir. Korumalı olduğu bildirilen üyelere yalnızca sınıfın kendisinde, devralınan ve üst sınıflar tarafından erişilebilir. Özel olarak beyan edilen üyelere yalnızca üyeyi tanımlayan sınıf tarafından erişilebilir.

Misal

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

} 
 ?> 

Herkese açık, özel ve korunan üyelere erişim örneği

Genel değişkenlere sınıfın dışından veya sınıfın içinden erişilebilir ve değiştirilebilir. Ancak özel ve korumalı değişkenlere ve işlevlere yalnızca sınıf içinden erişebilirsiniz, korumalı veya Herkese açık üyelerin sınıf dışındaki değerlerini değiştiremezsiniz.

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

  ?>

Daha fazla bilgi için görünürlük hakkında bu php belgelerini okuyun Görünürlük Php Doc

Kaynaklar: php.net

Umarım kavramı anlarsın. Okuduğunuz için teşekkürler :) :) İyi bir tane var


2

@Matt harika cevabını özetlemek gerekirse:

  • İhtiyacınız olan mülk değiştirilmemesi gerekiyorsa, sabit doğru seçimdir

  • İhtiyacınız olan mülkün değiştirilmesine izin veriliyorsa, bunun yerine statik kullanın

Misal:

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

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

Düzenleme: PHP 7.1.0'ın sınıf sabitlerinin görünürlüğünü belirlemek için destek sağladığını unutmamak önemlidir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.