在PHP中,从类方法内部包含访问属性

在PHP中,从类方法内部包含访问属性,php,class,scope,Php,Class,Scope,如何使类属性可用于同一类方法中包含的其他文件 // file A.php class A { private $var = 1; public function go() { include('another.php'); } } 在另一个文件中: // this is another.php file // how can I access class A->var? echo $var; // this can't be right

如何使类属性可用于同一类方法中包含的其他文件

// file A.php
class A
{
    private $var = 1;

    public function go()
    {
        include('another.php');
    }
}
在另一个文件中:

// this is another.php file
// how can I access class A->var?
echo $var; // this can't be right
考虑到范围,这是可能的吗。如果var是一个数组,那么我们可以使用extract,但如果var不是,我们可以将它包装在一个数组中有更好的方法吗

谢谢

编辑

好的,澄清一下另一个.php实际上是另一个文件。基本上,在上面的示例中,我们有两个文件A.php,其中包含类A和另一个.php,这是另一个执行某些操作的文件/脚本


回答:我的坏。。。我包括index.php中的另一个.php。。我认为范围界定仍然适用。。谢谢大家。

您已将
$var
定义为私有,这意味着
$var
只能由成员函数访问。如果需要访问
$var
,请将其公开,或从成员函数返回。您应该从中了解有关可见性的更多信息

Edit:让您的情况变得有趣的是,您正在从成员函数调用
include
include
将继承调用它的范围。因此,从技术上讲,您可以从
other.php
调用
$this->var
。但是,我强烈反对这种做法。如果
other.php
包含在其他任何地方,则会出现错误。请,请不要这样做。这是糟糕的编程实践

如果确实需要,请将这些行添加到
A.php

$obj = new A();
$obj->go();    // this will call another.php, which will echo "$this->var"
然后将
other.php
更改为:

echo $this->var;
它将起作用;您将获得正确的输出。请注意,如果不声明类A的实例,这将失败(例如,
A::go()
A->go()
,等等都将失败)。在PHP中,这是一种非常糟糕的方式

但如果用更好的方式做事,可以公开变量:

class A {
    public $var = 1;  //note, it is public!
    public function go() {
        include('another.php');
    }
}
$obj = new A();
echo $obj->var; //woot!
或者,保持它的私密性(这是更好的OOP):

您的问题似乎是,“当在方法中包含的文件中时,如何访问私有实例成员?”对吗

在示例代码中,在方法中包含一个文件

方法只是函数。与PHP的所有其他区域一样,包含的文件将继承整个当前范围。这意味着include可以在该方法中查看范围内的所有内容。包括
$this

换句话说,您将访问include文件中的属性,就像从函数本身内部访问它一样,如
$this->var


例如,使用PHP交互式shell:

[charles@lobotomy /tmp]$ cat test.php
<?php
echo $this->var, "\n";

[charles@lobotomy /tmp]$ php -a
Interactive shell

php > class Test2 { private $var; public function __construct($x) { $this->var = $x; } public function go() { include './test.php'; } }
php > $t = new Test2('Hello, world!');
php > $t->go();
Hello, world!
php > exit
[charles@lobotomy /tmp]$ php --version
PHP 5.4.4 (cli) (built: Jun 14 2012 18:31:18)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
    with Xdebug v2.2.0rc1, Copyright (c) 2002-2012, by Derick Rethans
[charles@lobotomy/tmp]$cat test.php

我不认为公开它有什么区别,因为另一个.php实际上是另一个文件。不在同一个文件A.php上,因此范围不适用。@Jojo:是的,它确实有区别。文件的位置与文件无关scope@cegfaultphp是另一个文件。它在一个实例上执行,特别是在它的方法go上。php实际上是另一个文件。基本上,在上面的示例中,我们有两个文件A.php,其中包含类A,另一个文件是另一个执行某些操作的文件/脚本。@Jojo:重要的不是它是另一个文件,而是您将该文件包含在一个成员函数中。我已经更新了我的答案来解决这个问题。@cegfault这是您这样做时将得到的结果:致命错误:在****\other.php中不在对象上下文中时使用$this。。。请让我们摆脱糟糕的编程实践。加载模板视图通常是在方法上完成的,因此糟糕的编程实践完全取决于它的使用方式。-1,您提供了代码,但没有解释任何内容。这是什么?它和上面有什么不同?做出了哪些改变?为什么?谢谢你知道我做错了什么。下次我会好好解释的,谢谢……好吧,我刚试过,致命错误:在****\other.php第3行的对象上下文中不使用$this,您使用的是什么php版本?我在上面提供了一个实例来演示它是如何工作的。。。。但这就是为什么我不建议依赖于这种行为:正如我在回答中所说,如果您在其他任何地方包含另一个.php,那么您将得到一个错误
 class A
{
    public $var = 1;

    public function go()
    {
        include('another.php');
    }
}

$objA = new A();

$objA->go();
[charles@lobotomy /tmp]$ cat test.php
<?php
echo $this->var, "\n";

[charles@lobotomy /tmp]$ php -a
Interactive shell

php > class Test2 { private $var; public function __construct($x) { $this->var = $x; } public function go() { include './test.php'; } }
php > $t = new Test2('Hello, world!');
php > $t->go();
Hello, world!
php > exit
[charles@lobotomy /tmp]$ php --version
PHP 5.4.4 (cli) (built: Jun 14 2012 18:31:18)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
    with Xdebug v2.2.0rc1, Copyright (c) 2002-2012, by Derick Rethans