PHP 5'te, kullanma arasındaki fark nedir const
ve static
?
Her biri ne zaman uygundur? Ve hangi roller public
, protected
ve private
oyun - Varsa?
PHP 5'te, kullanma arasındaki fark nedir const
ve static
?
Her biri ne zaman uygundur? Ve hangi roller public
, protected
ve private
oyun - Varsa?
Yanıtlar:
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.
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 .
$
mu? static $my_var = 10;
tanımında
static
. Çü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.
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;
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");
}
Sınıf mirası hakkında konuşurken, self
ve static
anahtar 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 Pirate
alt 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 .
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.
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.
Öğ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
@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 .
self::$variable
Korumalı 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.