我想用PHP巩固我的知识。但大多数时候我无法理解范围。我不确定何时在我的函数上使用$ this和global declaration关键字。
这只是一个示例类,我省略了__construct()
class myClass{
public myVariable;
public function1() {
$this->myVariable=1;
}
public function2(){
global $myVariable;
$myVariable=1;
}
}
在函数内部分配预先声明的变量时,哪一个是最好的方法?我在某种程度上被PHP主要出版商的不同书籍搞糊涂了。我不确定我是在问正确的问题还是以某种方式相关的问题。
答案 0 :(得分:1)
首先,这不是有效的PHP,正如Jared Farrish已经说过的那样。它是public $myvar
而不是public myvar
。变量名始终以$
开头。
在类中声明变量时:
<?php
class A
{
private $var;
}
如果通过$this
访问,该变量将自动在所有方法中可用(除非方法是静态的,但这是另一个故事)。所以这会奏效:
<?php
class A
{
private $var;
public function foo () {
// This works
$this->var = 1;
// This is a completely different thing and does not change
// the contents of A::$var
$var = 1;
}
}
现在global
完全不同了。在PHP中,你不能这样做:
<?php
$global_a = 123;
function myfunc ()
{
// You wont actually change the value of $global_a with this
$global_a = 1234;
}
echo $global_a; // still 123
您认为这样可行,但全局变量不会自动提供给函数。这是global
的来源:
<?php
$global_a = 123;
function myfunc ()
{
global $global_a;
$global_a = 1234;
}
echo $global_a; // now it will be 1234
我建议您read about variable scope in PHP,然后您可以继续to OOP in PHP。
PHP是一种非常古怪的语言。仅仅因为以某种方式在大多数语言中工作的东西并不意味着它可以在PHP中工作。大多数时候,它不会。所以最好尽可能地教育自己。
希望这有帮助
答案 1 :(得分:0)
哪一个最好通常取决于具体情况。一般来说,最好避免全局变量,因为它们会带来风险,因为它们不确切知道它们的用途。
如果变量特定于该类的实例,则使用类变量是一个不错的选择。 (不过,你必须在前面添加一个$
。即,public $myVariable;
)。
如果变量仅与类外的函数和实例相关,则最好将其作为参考传递。这是通过在参数空间中的&
之前添加$
来完成的。即:
public function3(&$myVariable) {
$myVariable = 1;
}
或者只是返回您想要的值并将其设置在函数外部。即,:
class MyClass {
public function3() {
return 1;
}
}
$myObject = new MyClass();
$myVariable = $myObject->function4();
答案 2 :(得分:0)
尽量避免传递全局变量,因为有很多充分的理由:
重复使用部分脚本: 如果某个函数依赖于全局变量,则在不同的上下文中使用该函数几乎是不可能的。另一个问题是你不能使用该功能,并在另一个脚本中使用它。
解决错误更加困难: 跟踪全局变量比非全局变量要困难得多。
现在你的问题:
在函数内部分配预先声明的变量时,哪一种是最好的方法?
您可以在函数
按价值
$firstVar = 1;
function abc($firstVar){
echo $firstVar ; // will give you 1
}
参考
function abc(&$firstVar){
$firstVar = 3; // this will give utility to change that variable even
echo $firstVar ; // will give you 3
}
现在在哪里使用$ this变量:
$ this用于引用当前对象。 例如:
class abc{
private $firstVar;
function abc(){
$this->firstVar = 2;
}
}