PHP5:常量vs静态
在类的上下文中,静态变量位于类作用域(而不是对象)作用域上,但与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.
公共,受保护和私人在常量(总是公开的)方面无关紧要;它们仅对类变量有用,包括静态变量。
- 公共静态变量可以通过ClassName :: $ variable在任何地方访问。
- 受保护的静态变量可以通过定义类或通过ClassName :: $ variable扩展类访问。
- 私有静态变量只能由定义的类通过ClassName :: $ variable访问。
编辑:需要注意的是PHP 7.1.0 introduced support for specifying the visibility of class constants这是非常重要的。
将类方法或属性声明为静态使得它们无需实例化类即可访问。
类常量就像普通常量一样,在运行时不能改变。这也是你使用const for的唯一原因。
私有,公共和受保护的访问修饰符描述谁可以访问哪个参数/方法。
公共意味着所有其他对象都可以访问。私有意味着只有实例化的类才能访问。 受保护意味着实例化的类和派生类可以访问。
常量只是一个常量,即在声明后您不能更改它的值。
静态变量可以在没有创建类的实例的情况下访问,因此可以在类的所有实例之间共享。
此外,可以存在在被声明仅一次(在函数的第一次执行)和之间的函数调用可存储其值的功能的静态局部变量,例如:
function foo()
{
static $numOfCalls = 0;
$numOfCalls++;
print("this function has been executed " . $numOfCalls . " times");
}
最后一点应该做的是const常常是静态的和公共的。这意味着你可以从类中访问常量,如下所示:
class MyClass
{
const MYCONST = true;
public function test()
{
echo self::MYCONST;
}
}
从类之外,你会获得这样的:
echo MyClass::MYCONST;
是那个声明是真的吗?那“const总是静态和公开的”? – 2015-01-14 22:47:25
这不再是事实。从PHP 7.1开始,类常量可以声明为private或protected。参见[RFC](https://wiki.php.net/rfc/class_const_visibility) – DisgruntledGoat 2016-01-14 16:00:51
所以回顾一下上@马特伟大的答案:
在大多数情况下,您将需要私有/受保护的静态属性,因此常量不是一个选项。
如果您需要的财产是公开可用但未更改的,则常数是正确的选择。
实施例:
class User{
private static $PASSWORD_SALT = "[email protected]~#asd1";
...
}
class Product{
const INTEREST = 0.10;
...
}
在谈到类继承可以通过使用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"
这里的事情,我迄今为止了解到静态成员,常量变量和访问修饰符(私有,公共和受保护)。 恒
定义
喜欢这个名字说,一个常变量的值不能changed.Constants从正常的变量不同,因为你不使用$符号来声明或使用它们。
该值必须是常量表达式,而不是(例如)变量,属性,数学运算的结果或函数调用。
注意:该变量的值不能是关键字(例如self,父母 和静态)。
声明PHP中的常量
<?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
?>
静态访问
定义
静态关键字可用于声明类,成员函数或变量。类中的静态成员是全局的,也可以使用self关键字进行访问。将类属性或方法声明为静态使它们无需实例化即可访问的类。声明为静态的属性无法通过实例化的类对象进行访问(尽管可以使用静态方法)。如果没有使用可见性声明(public,private,protected),那么该属性或方法将被视为已声明为public。因为可以在没有创建对象实例的情况下调用静态方法。
注意:伪变量$这是不可用声明的方法 内部作为static.Static属性无法通过 对象使用箭头操作者访问 - >
作为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";
?>
公共,私有,保护(A.K.A访问修饰符)
之前阅读下面的定义,请阅读这篇文章关于封装。它会帮助你理解的概念更深入
Tutorials point link about encapsulation
定义
使用公营,私营,您可以控制对类中成员的访问。宣布公开的类成员可以随处访问。声明保护的成员只能在类本身以及继承类和父类中访问。声明为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
}
}
?>
访问公共,私有和受保护成员例如
公共变量的可被访问并且从类 外面或里面的类修改。但是您只能从类内部访问私有和受保护的变量和函数,您不能修改类之外的受保护或公共成员的值。
<?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文档有关的知名度Visibility Php Doc
参考文献:php.net
我希望你理解的概念。感谢您的阅读:) :)有一个好的
我更喜欢使用'self :: $变量'为受保护的静态和私有静态变量,因为我更喜欢保持在其本身只提到一次类名课程开始。 – Lukman 2009-11-06 16:08:45
是的,好的一点,我忽略了提及self关键字可以用在类内引用。上面提供的例子是在类定义之外执行的,在这种情况下,必须使用类名。 – 2009-11-06 16:50:11
很好的答案,非常接近接受。请你澄清一点:“公共,受保护和私人在常量方面无关紧要” - 为什么?常量默认情况下都是公共的吗?所有私人? – 2009-11-08 22:24:21