【发布时间】:2009-11-17 07:56:48
【问题描述】:
PHP 中是否存在局部变量、私有变量、静态变量和公共变量之类的东西?如果是这样,您能否提供每个示例以及它们的范围如何在类内外以及内部函数中演示?
【问题讨论】:
-
+ 静态、私有、公共、类适用于 C++ 而不是 C。
PHP 中是否存在局部变量、私有变量、静态变量和公共变量之类的东西?如果是这样,您能否提供每个示例以及它们的范围如何在类内外以及内部函数中演示?
【问题讨论】:
我不了解 C++,但 PHP 是如何工作的:
对于函数范围:
<?php
$b = 6;
function testFunc($a){
echo $a.'-'.$b;
}
function testFunc2($a){
global $b;
echo $a.'-'.$b;
}
testFunc(3);
testFunc2(3);
?>
输出是
3-
3-6
函数内部的代码只能使用 global 关键字访问函数外部的变量。见http://php.net/manual/en/language.variables.scope.php
关于类:
<?php
class ExampleClass{
private $private_var = 40;
public $public_var = 20;
public static $static_var = 50;
private function classFuncOne(){
echo $this->private_var.'-'.$this->public_var; // outputs class variables
}
public function classFuncTwo(){
$this->classFuncOne();
echo $private_var.'-'.$public_var; // outputs local variable, not class variable
}
}
$myobj = new ExampleClass();
$myobj->classFuncTwo();
echo ExampleClass::$static_var;
$myobj->classFuncOne(); // fatal error occurs because method is private
?>
输出将是:
40-20
-
50
致命错误:从第 22 行 C:\xampp\htdocs\scope.php 中的上下文 '' 调用私有方法 ExampleClass::classFuncOne()
需要注意的一点:PHP 没有变量初始化,尽管变量被称为已设置或未设置。当一个变量被设置时,它已经被赋予了一个值。您可以使用unset 删除变量及其值。未设置的变量等价于 false,如果将其与所有错误输出一起使用,您将看到 E_NOTICE 错误。
【讨论】:
在 PHP 中有静态、本地、私有、公共和受保护的类变量。
然而,在 PHP OOP 实现中有些不同:the manual 会帮助你:
属性或方法的可见性 可以通过前缀定义 带有关键字 public 的声明, 受保护或私有。
此外,请查看static keyword documentation。
您可以在此处阅读有关普通变量及其范围的更多信息:http://php.net/manual/en/language.variables.scope.php:
在大多数情况下,所有 PHP 变量只有一个作用域。
我希望这些链接能够比我更好地向您解释它;-)
【讨论】:
是的,PHP 5 在课堂上包括 static variables 和 visibility。
class MyClass
{
public static $my_static = 'foo';
public $public = 'Public';
protected $protected = 'Protected';
private $private = 'Private';
public function staticValue() {
return self::$my_static;
}
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj = new MyClass();
echo $obj->public; // Works
echo $obj->protected; // Fatal Error
echo $obj->private; // Fatal Error
$obj->printHello(); // Shows Public, Protected and Private
【讨论】: