182

const在 PHP 5 中,使用和 和有什么区别static

什么时候合适?以及扮演什么角色public——如果有的话?protectedprivate

4

7 回答 7

202

在类的上下文中,静态变量位于类范围(而不是对象)范围内,但与 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::$variable 扩展类访问。
  • 私有静态变量只能由定义类通过 ClassName::$variable 访问。

编辑:重要的是要注意PHP 7.1.0 引入了对指定类常量可见性的支持

于 2009-11-06T07:14:27.110 回答
20

应该指出的最后一点是 const 始终是静态的和公共的。这意味着您可以像这样从类中访问 c​​onst:

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

从课堂之外,您可以像这样访问它:

echo MyClass::MYCONST;
于 2010-03-04T01:57:45.590 回答
11

常量只是一个常量,即声明后不能改变它的值。

静态变量无需创建类实例即可访问,因此可在类的所有实例之间共享。

此外,函数中可以有一个静态局部变量,它只声明一次(在函数的第一次执行时),并且可以在函数调用之间存储它的值,例如:

function foo()
{
   static $numOfCalls = 0;
   $numOfCalls++;
   print("this function has been executed " . $numOfCalls . " times");
}
于 2009-11-06T10:49:38.907 回答
10

在谈论类继承时,您可以通过使用selfstatic关键字来区分不同范围内的常量或变量。检查这个例子,它说明了如何访问:

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 上阅读更多关于后期静态绑定的信息还要在这里这里
检查另一个问题的答案。

于 2015-06-24T16:04:43.840 回答
4

将类方法或属性声明为静态使它们无需实例化即可访问。

类常量就像一个普通的常量,它不能在运行时改变。这也是您将永远使用 const 的唯一原因。

Private、public 和 protected 是访问修饰符,描述谁可以访问哪个参数/方法。

公共意味着所有其他对象都可以访问。私有意味着只有实例化的类才能访问。受保护意味着实例化类和派生类可以访问。

于 2009-11-06T07:17:49.817 回答
2

因此,回顾一下@Matt 的好答案:

  • 如果不应该更改您需要的属性,那么常量是正确的选择

  • 如果允许更改您需要的属性,请改用静态

例子:

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

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

编辑:重要的是要注意PHP 7.1.0 引入了对指定类常量可见性的支持

于 2013-12-17T10:06:16.067 回答
2

这是我迄今为止学到的关于静态成员、常量变量和访问修饰符(私有、公共和受保护)的内容。 持续的

定义

就像名字所说的常量变量的值不能改变。常量与普通变量的不同之处在于你不使用 $ 符号来声明或使用它们。

该值必须是常量表达式,而不是(例如)变量、属性、数学运算的结果或函数调用。

注意:变量的值不能是关键字(例如 self、parent 和 static)。

在 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

?>

静止的

定义

静态关键字可用于声明类、成员函数或变量。类中的静态成员是全局的,也可以使用 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";

 ?>

公共、私有、受保护(AKA 访问修饰符)

在阅读下面的定义之前,请阅读这篇关于封装的文章。它将帮助您更深入地理解这个概念

链接 1 维基百科

关于封装的教程点链接

定义

使用 private 、 public 、 protected 关键字,您可以控制对类中成员的访问。声明为 public 的类成员可以在任何地方访问。声明为受保护的成员只能在类本身内以及被继承类和父类访问。声明为私有的成员只能由定义该成员的类访问。

例子

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

  ?>

有关更多信息,请阅读有关可见性 Visibility Php Doc的 php 文档

参考资料:php.net

我希望你理解这个概念。感谢阅读 :) :) 祝你好运

于 2015-08-07T14:16:34.470 回答