PHP5: const vs static

在 PHP5中,使用 conststatic有什么区别?

publicprotectedprivate分别在什么时候合适? 如果有的话,它们扮演什么角色?

98932 次浏览

在类的上下文中,静态变量位于类范围(而不是对象)范围中,但与常量不同,它们的值可以更改。

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.

就常量(常量总是公共的)而言,公共、受保护和私有是不相关的; 它们只对类变量(包括静态变量)有用。

  • 公共静态变量可以通过 ClassName: : $variable 在任何地方访问。
  • 可以通过定义类或通过 ClassName: : $variable 扩展类访问受保护的静态变量。
  • 私有静态变量只能由定义类通过 ClassName: : $variable 访问。

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

将类方法或属性声明为 static 可以访问它们,而不需要类的实例化。

类常数就像普通常数一样,不能在运行时更改。这也是您使用 const 的唯一原因。

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

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

Constant 只是一个常量,也就是说,在声明。

静态 变量可以在不创建类实例的情况下访问,因此可以在类的所有实例之间共享。

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

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

最后一点需要说明的是,const 始终是静态的和公共的。这意味着您可以像下面这样从类中访问 const:

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

在课堂之外,你可以这样访问它:

echo MyClass::MYCONST;

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

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

  • 如果允许更改所需的属性,则使用 static

例如:

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


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

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

在讨论类继承时,可以使用 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 上的后期静态绑定
还要检查另一个问题 给你给你的答案。

以下是我到目前为止学到的关于静态成员、常量变量和访问修饰符(private、 public 和 protected)的知识。 不变

定义

就像名字说的,常量变量的值是不能改变的。常量不同于普通变量,因为您不使用 $符号来声明或使用它们。

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

注意: 变量的值不能是一个关键字(例如 self、 father 和静电干扰)。

在 php 中声明常量

<?php
class constantExample{


const CONSTANT = 'constant value'; //constant


}
?>

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 关键字访问。将类属性或方法声明为静态类属性或方法可以访问它们,而不需要类的实例化。声明为 static 的属性不能通过实例化的类对象访问(尽管静态方法可以)。如果没有使用可见性声明(公共、私有、受保护) ,那么属性或方法将被视为声明为公共的。因为静态方法是可调用的,而不需要创建对象的实例。

注意: 伪变量 $this 在方法中不可用 声明为 Static。静态属性不能通过 对象使用箭头运算符->

从 PHP 5.3.0开始,可以使用变量引用该类。变量的值不能是关键字(例如 self、 father 和 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.A 访问修饰符)

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

链接1维基百科

关于封装的教程点链接

定义

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

例子

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


}
?>

访问公共、私有和受保护成员的示例

可以从类外部访问和修改公共变量 或者在教室里。但是只能从类内部访问私有和受保护的变量和函数,不能在类外部修改 protected 或 Public 成员的值。

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

参考文献: Php.net

我希望你能理解这个概念。谢谢你的阅读:) :)祝你愉快