سؤال

في 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.

الجمهور، المحمي، والخاصة غير ذات صلة من حيث consts (التي هي دائما عامة)؛ إنها مفيدة فقط لمتغيرات الصف، بما في ذلك المتغير الثابت.

  • يمكن الوصول إلى المتغيرات الثابتة العامة في أي مكان عبر اسم Classname :: متغير $.
  • يمكن الوصول إلى المتغيرات الثابتة المحمية عن طريق الفئات المحددة أو تمديد الفئات عبر ClassName :: متغير $.
  • يمكن الوصول إلى المتغيرات الثابتة الخاصة فقط من خلال الفئة المحددة عبر ClassName :: متغير $.

تحرير: من المهم أن نلاحظ ذلك قدم PHP 7.1.0 الدعم لتحديد رؤية الثوابت الصف.

نصائح أخرى

إحدى النقطة الأخيرة التي ينبغي أن تكون مصنوعة هي أن كونس ثابتا دائما ثابتا وعامة. هذا يعني أنه يمكنك الوصول إلى CONST من داخل الفصل مثل ذلك:

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

من خارج الفصل، يمكنك الوصول إليها مثل هذا:

echo MyClass::MYCONST;

مستمر هو مجرد ثابت، أي لا يمكنك تغيير قيمتها بعد الإعلان.

ثابتة متغير يمكن الوصول إليه دون إنشاء مثيل لفئة وبالتالي مشترك بين جميع مثيلات الفصل.

أيضا، يمكن أن يكون هناك ثابتة المتغير المحلي في وظيفة تم الإعلان عنها مرة واحدة فقط (في التنفيذ الأول وظيفة) ويمكن تخزين قيمتها بين مكالمات الوظيفة، مثال:

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 superclass)، في حين static:: سيتم الوصول إلى العقار والمستمر من النطاق في وقت التشغيل (لذلك في هذه الحالة في Pirate الفئة الفرعية).

اقرأ أكثر في وقت متأخر ثابت الملزمة هنا على php.net.
تحقق أيضا من الإجابة على سؤال آخر هنا و هنا.

تعلن طريقة الفصل أو الممتلكات كمثابت يجعلها يمكن الوصول إليها دون الحاجة إلى إنشاء مثيل للفئة.

ثابت فئة هو تماما مثل ثابت طبيعي، لا يمكن تغييره في وقت التشغيل. هذا هو أيضا السبب الوحيد الذي ستستخدمه CONST.

القطاع الخاص والجمهور والحماية هي معدلات الوصول التي تصف من يمكنه الوصول إلى المعلمة / الطريقة.

يعني الجمهور أن جميع الكائنات الأخرى يحصل الوصول إليها. الخاص يعني أن فئة النسخة المفوية فقط يحصل الوصول إليها. المحمية تعني أن فئة الفنسبة والفئات المشتقة يحصل الوصول إليها.

إليكم الأشياء التي تعلمتها حتى الآن عن الأعضاء الثابتة والمتغيرات المستمرة ومعدات الوصول (خاصة وعامة ومحمية).مستمر

تعريف

مثل الاسم يقول إن قيم متغير ثابت لا يمكن تغييرها. تختلف المحتالات من المتغيرات عن المتغيرات العادية التي لا تستخدمها رمز $ لإعلانها أو استخدامها.

يجب أن تكون القيمة تعبيرا ثابتا، وليس (على سبيل المثال) متغير أو خاصية أو نتيجة عملية رياضية أو مكالمة دالة.

ملاحظة: لا يمكن أن تكون قيمة المتغير كلمة رئيسية (مثل الذات، والوالد والثابتة).

إعلان ثابت في فب

<?php
class constantExample{

   const CONSTANT = 'constant value'; //constant

 }
?>

نطاق ثابت عالمي ويمكن الوصول إليه باستخدام كلمة رئيسية

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

?>

ثابتة

تعريف

يمكن استخدام الكلمة الأساسية الثابتة لإعلان الفئة أو وظيفة العضو أو المتغير. يمكن الوصول إلى الأعضاء في الفصل العالميين باستخدام كلمة أساسية ذاتية وكذلك خصائص الفئة أو الأساليب كثبات يمكن الوصول إليها دون الحاجة إلى إنشاء مثيل للفئة وبعد لا يمكن الوصول إلى خاصية معلنة كثبات كائن فئة مفهوم مثيل (على الرغم من أن الطريقة الثابتة يمكن). إذا لم يتم استخدام إعلان الرؤية (عامة، خاصة، محمية)، فسيتم التعامل مع العقار أو الطريقة كما لو تم الإعلان عنها كعلوم عام. لأن الأساليب الثابتة غير صالحة للاستقرار دون مثيل الكائن الذي تم إنشاؤه.

ملاحظة: $ غير المتغير $ هذا غير متوفر داخل الأسلوب المعلن أنه لا يمكن الوصول إلى الخصائص الثابتة.

اعتبارا من PHP 5.3.0، من الممكن الرجوع إلى الفصل باستخدام متغير. لا يمكن أن تكون قيمة المتغير كلمة رئيسية (مثل الذات، الوالد والثابتة).

خاصية ثابت مثال

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

 ?>

العامة، الخاصة، المحمية (معدلات الوصول التي تم أيضا الوصول إليها)

قبل قراءة التعريف أدناه، اقرأ هذه المقالة حول التغليف. سوف تساعدك على فهم المفهوم أكثر عمقا

رابط 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.

أتمنى أن تفهم المفهوم. شكرا على القراءة :) :) هل لديك واحدة جيدة

للاصلاص على Matt Great Answer:

  • إذا لم يتغير الممتلكات التي تحتاج إليها، فلا ينبغي تغييرها، فستكون ثابتا هو الاختيار الصحيح

  • إذا سمح للمطرف الذي تحتاج إلى تغييره، فاستخدم ثابتا بدلا من ذلك

مثال:

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

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

تحرير: من المهم أن نلاحظ ذلك قدم PHP 7.1.0 الدعم لتحديد رؤية الثوابت الصف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top