【问题标题】:Is there a magic method to access a non-static property statically?是否有一种神奇的方法可以静态访问非静态属性?
【发布时间】:2015-05-25 12:29:20
【问题描述】:

我希望这不是一个愚蠢的问题,但我真的找不到答案。

我有一些带有单例函数的全局类。 主要是关于小的配置参数。

class myConfig{
   protected $strQuote = '"';
   protected $path_delimiter = '\\';

   public function __get($name){
        return $this->$name; // after checking if it exist etc.
   }

   public static function getMe(){
        // do the singleton magic
        return $oInstance;
   }

}

这很好用:

$quote = myConfig::getMe()->strQuote;

这也是:

$oConf = myConfig::getMe();
$quote = $oConf->strQuote;
$delim = $oConf->path_delimiter;

但大多数情况下只需要 1 个小参数,我想将其表述为:

$quote = myConfig::$strQuote;

因为一切都是神奇的方法,但我找不到任何方法来解决这个问题。 我尝试过静态 __get() 和 __callstatic()。但无法让它工作。

将属性声明为静态不是一种选择。因为该类将主要用作实例。


更新解决方法

我刚刚想到了一个肮脏的解决方法。我不确定它是否太脏了。

$quote = myConfig::strQuote();

$quote = myConfig::get_strQuote();

然后用 __callStatic() 处理

这太脏了吗?

【问题讨论】:

  • 不,如果有......那将是非常不合逻辑的......静态引用永远无法知道类的具体实例或实例
  • 这个问题不应该被否决,只要努力理解/解决问题,就没有错误的问题。
  • 但是……为什么会有 __callStatic() 而不是 __getStatic()...?我不明白为什么我们可以使用各种魔术方法,但不是为了这个。我错过了什么?
  • @MarkBaker 这是真的。但因此我对此类课程使用单例。所以它只有一个实例,并且是全局使用的
  • 看来我不是第一个提出这个要求的人 :( stackoverflow.com/questions/1279382/… 功能请求来自 2009 年......

标签: php oop static getter-setter magic-function


【解决方案1】:

不要使用静态变量,只需将 $strQuote 设为常量变量即可。然后您可以在与静态变量相同的庄园中访问它。 const STR_QUOTE = "'"; 然后你可以在类中以self::STR_QUOTE 访问它,并在外部使用类名。

【讨论】:

  • 感谢您的回答。在这种情况下,这可能会有所帮助。但我也有可以改变的参数。
  • 如果关键是要有一个单例实例,你不需要 php.ini 中的静态访问器方法。您只需要在全局空间中声明实例。然后,您可以使用其他命名空间中的 global 关键字访问它。 php.net/manual/en/language.variables.scope.php
  • 全局和单例并不是最佳实践。我更喜欢单例而不是全局,因为我认为全局更糟。为了获得更干净的代码,我希望我可以使用 __getStatic() 之类的东西。
  • 好吧,如果你的心是单身,上面的 sn-p 是否缺少一些代码,因为你的静态访问器方法缺少一些逻辑。在这里查看单例示例phptherightway.com/pages/Design-Patterns.html
  • 感谢您的提示。我没有在我的问题中写那部分,因为我认为这会使示例太长。单身人士工作得很好。抱歉没有提及
猜你喜欢
  • 2013-02-13
  • 2012-03-30
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多