如何在同一个类的方法中为其他包含文件提供类属性?
// 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 ..我看到范围仍然适用..谢谢大家..
答案 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
编辑:您的情况有趣的是您从成员函数调用include
。 include
将继承调用它的范围。因此,从技术上讲,您可以从$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();