在PHP5中,使用const
和static
有什么区别?什么时候适合? public
,protected
和private
发挥什么作用 - 如果有的话。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
我希望你理解的概念。感谢您的阅读:) :)有一个好的
- 1. android-strings.xml vs静态常量
- 2. PHP常量 - 常量VS定义VS静态
- 3. 静态常量Vs定义指令
- 4. 静态变量文件VS辛格尔顿VS静态类VS枚举
- 5. 类中静态常量ODR
- 6. 静态库和常量
- 7. 常量与静态只读
- 8. Java静态VS常规对象
- 9. 模板类的静态const成员变量VS静态常量成员变量的初始化
- 10. 差异静态常量和静态的返回时,一个静态变量
- 11. 静态VS在命名空间的非静态变量
- 12. 静态块VS中的静态变量初始化顺序
- 13. php5扩展主类并使用静态
- 14. 定义Vs的静态常量Vs的NSString的 - 的观点记忆点
- 15. 单身VS与静态变量
- 16. Objective-C静态常量变量
- 17. 引用父变量的静态常量
- 18. mktime VS时间PHP4 VS PHP5
- 19. Android的静态VS非静态问题
- 20. 动态细胞vs静态?
- 21. Java图标常量 - 静态常量是否正常?
- 22. php4 vs php5支持
- 23. 使用静态只读与静态获取器模仿常量
- 24. 如何创建静态NSString常量的静态NSString []?
- 25. 静态的常量成员,静态类和瓶颈
- 26. 静态块vs静态方法 - 初始化静态域
- 27. 代码设计,分配静态常量
- 28. 静态,定义和常量在C
- 29. Spring中注入静态常量的值
- 30. 初始化静态常量空数组
我更喜欢使用'self :: $变量'为受保护的静态和私有静态变量,因为我更喜欢保持在其本身只提到一次类名课程开始。 – Lukman 2009-11-06 16:08:45
是的,好的一点,我忽略了提及self关键字可以用在类内引用。上面提供的例子是在类定义之外执行的,在这种情况下,必须使用类名。 – 2009-11-06 16:50:11
很好的答案,非常接近接受。请你澄清一点:“公共,受保护和私人在常量方面无关紧要” - 为什么?常量默认情况下都是公共的吗?所有私人? – 2009-11-08 22:24:21