访问属性包含在PHP中的类方法中

时间:2012-12-08 05:02:44

标签: 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

考虑到范围,这是否可行。如果var是一个数组,那么我们可以使用extract,但如果var不是,我们可以将它包装在一个数组中。 有更好的方式吗?

谢谢!

修改

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

回答:我的不好......我从index.php中包含了另一个.php ..我看到范围仍然适用..谢谢大家..

3 个答案:

答案 0 :(得分:1)

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

在您的示例代码中,您在方法中包含了一个文件。

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

换句话说,您可以访问包含文件中的属性,就像您从函数本身访问它一样,$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

答案 1 :(得分:0)

您已将$var定义为私有,这意味着$var只能 才能被成员函数访问。如果您需要访问$var,请将其公开,或从成员函数返回。您应该从PHP Manual

了解有关可见性的更多信息

编辑:您的情况有趣的是您从成员函数调用includeinclude将继承调用它的范围。因此,从技术上讲,您可以从$this->var致电another.php。但是,我强烈反对这种做法。如果其他地方包含another.php,您将收到错误消息。请不要这样做。这是一个糟糕的编程实践。

如果你真的必须,请将这些行添加到A.php

$obj = new A();
$obj->go();    // this will call another.php, which will echo "$this->var"

然后将another.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):

class A {
    private $var = 1;  //note, it is private

    //make a public function that returns var:
    public function getVar() {
        return $this->var;
    }

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

$obj = new A();
echo $obj->getVar(); //woot!

答案 2 :(得分:-2)

 class A
{
    public $var = 1;

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

$objA = new A();

$objA->go();