2009-11-06 63 views
139

在PHP5中,使用conststatic有什么区别?什么时候适合? publicprotectedprivate发挥什么作用 - 如果有的话。PHP5:常量vs静态

回答

151

在类的上下文中,静态变量位于类作用域(而不是对象)作用域上,但与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这是非常重要的。

+24

我更喜欢使用'self :: $变量'为受保护的静态和私有静态变量,因为我更喜欢保持在其本身只提到一次类名课程开始。 – Lukman 2009-11-06 16:08:45

+3

是的,好的一点,我忽略了提及self关键字可以用在类内引用。上面提供的例子是在类定义之外执行的,在这种情况下,必须使用类名。 – 2009-11-06 16:50:11

+0

很好的答案,非常接近接受。请你澄清一点:“公共,受保护和私人在常量方面无关紧要” - 为什么?常量默认情况下都是公共的吗?所有私人? – 2009-11-08 22:24:21

3

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

类常量就像普通常量一样,在运行时不能改变。这也是你使用const for的唯一原因。

私有,公共和受保护的访问修饰符描述谁可以访问哪个参数/方法。

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

9

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

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

此外,可以存在在被声明仅一次(在函数的第一次执行)和之间的函数调用可存储其值的功能的静态局部变量,例如:

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

最后一点应该做的是const常常是静态的和公共的。这意味着你可以从类中访问常量,如下所示:

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

从类之外,你会获得这样的:

echo MyClass::MYCONST; 
+1

是那个声明是真的吗?那“const总是静态和公开的”? – 2015-01-14 22:47:25

+6

这不再是事实。从PHP 7.1开始,类常量可以声明为private或protected。参见[RFC](https://wiki.php.net/rfc/class_const_visibility) – DisgruntledGoat 2016-01-14 16:00:51

2

所以回顾一下上@马特伟大的答案:

  • 在大多数情况下,您将需要私有/受保护的静态属性,因此常量不是一个选项。

  • 如果您需要的财产是公开可用但未更改的,则常数是正确的选择。

实施例:

class User{ 
    private static $PASSWORD_SALT = "[email protected]~#asd1"; 
    ... 
} 

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

在谈到类继承可以通过使用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" 
2

这里的事情,我迄今为止了解到静态成员,常量变量和访问修饰符(私有,公共和受保护)。

定义

喜欢这个名字说,一个常变量的值不能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访问修饰符)

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

Link 1 wikipedia

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

我希望你理解的概念。感谢您的阅读:) :)有一个好的