2012-07-06 56 views
0

为什么我不能做到这一点:调用第二类静态方法来声明变量的类

class MyClass{ 
    public $dir = 'root/'.Util::getDir(); 

    public function getURL($file){ 
     $fullUrl = $this->dir . $file; 
     return $fullUrl; 
    } 
} 

echo MyClass::getUrl('my.pdf'); 

基本上,问题出在第二行。在类中声明变量时,我无法调用静态方法。

回答

1

你不能这样做,因为语言不支持它。

在PHP5对象模型中,方法是静态的或动态的。你必须选择。同上类属性。

但是,没有什么可以阻止你使用私有类变量,并通过声明__get()来调用静态方法,无论是在类中还是在类外调用对象重载。只要执行isset测试私有变量并调用静态方法在第一次调用。

请记住,您始终可以使用self::构造引用静态属性和方法。

+0

我想知道如果我第一次不能使用__construct方法来设置这个变量,但我不知道构造方法是否会运行,如果类/方法被称为stataically像: 'echo MyClass :: getUrl('my.pdf');' – 2012-07-06 10:51:06

+0

我们刚刚完成了更新。保持静态和非静态方法和属性在你的头脑和编程中分开。如果属性或方法具有特定于对象的上下文或功能,则它不能是静态的。它必须是'$ a-> property'的形式。 V.V.如果它在所有类对象中不变,那么它确实应该是静态的。 – TerryE 2012-07-06 10:57:13

+1

@ user1364793,__construct()在执行'new ClassName()'时运行如果要初始化静态属性,则创建一个静态方法,比如说'setup()'并调用'ClassName :: setup()'作为你的脚本初始化 – TerryE 2012-07-06 14:31:11

0

不要你必须做一些像

class MyClass{ 
    public $dir; 

    public function setDir(){ 
     $this->dir = 'root/'.Util::getDir(); 
    } 
} 
+0

不幸的是,我不能这样做,因为我会静态地调用类MyClass。 问题是,当它的值来自静态方法时,我甚至无法定义$ dir。 – 2012-07-06 10:38:36

+0

嗯,我不认为我可以帮忙,我的大脑需要一些睡眠抱歉。 – 2012-07-06 10:40:43

+0

我已经使用更清晰的例子编辑了我的问题。 – 2012-07-06 10:44:46

1

您在编译分配$目录,你可以在对象初始化

class MyClass{ 
    public $dir; 
    public function __construct(){  
    $this->dir = 'root/'.Util::getDir(); 
    } 
} 

在构造函数中执行此操作时,你会创建该类$this->dir将被设置的实例。

+0

可以在构造函数中调用是的静态方法 – 2012-07-06 10:53:56

+0

但是,如果静态调用MyClass :: getURL()会调用构造函数吗? – 2012-07-06 10:55:13

+1

好的,我错过了point.you不能使用$这在任何静态方法,你为什么不做这个类MyClass { 公共职能getURL($文件){ $ fullUrl ='root /'。Util :: getDir ()。$文件; return $ fullUrl; } }你不能使用其他静态变量并使用self。 – 2012-07-07 13:49:58

1

,你需要将它定义为:

public static $dir= '/some/path/'; 

那么你可以做:

self::$dir; 

在静电功能。

相关问题