【问题标题】:Returning a static Class in PHP在 PHP 中返回一个静态类
【发布时间】:2011-09-09 07:58:41
【问题描述】:

我正在做一个后端项目。我需要用另一个静态对象返回一个静态对象:

Class this_is_a_very_long_class_name
{
    public static function call()
    {
        return self;
    }

    public static function script_link($link)
    {
        //doing stuff here...
    }
}

Class Main
{
    public static function view()
    {
        // trying to return View object
        return this_is_a_very_long_class_name::call();
    }
}

我正在尝试这样使用它:

Main::view()::script_link('Some script');

那我该怎么做呢?

P.S.:我不是在寻找其他解决方案。我正在寻找我所问的答案。

【问题讨论】:

  • 为什么?...为什么不直接使用正确的静态类呢? View::script_link('Some script'); 听起来您只是要创建不必要的依赖项..
  • 静态对象是矛盾的。静态方法和属性与对象或 OOP 无关。
  • PS:您可能过度使用静态类。您可能应该只使用普通类,否则您的所有代码都将具有硬耦合。
  • +1 各位...这就是 OOP 解决的问题多于解决的问题。

标签: php static-classes


【解决方案1】:

你不需要那个。

使用

View::script_link();

这也是错误和误导view()->script_link,因为 script_link 是静态的

附录

如果你的问题是你的类名长度,我建议你为此创建简单的包装器。

function createLink($string){
 return VERY_LONG_CLASS_NAME_HELLO_PHP_NAMESPACE::script_link($string);
}

这样你只需要createLink();

【讨论】:

  • 是的,我知道,但我有很多名字很长的类。我想这样联系他们。
【解决方案2】:

在 php 5.3 中:return new View();(而不是 return View::self;)。
手动:http://php.net/manual/en/language.oop5.basic.php#example-159

【讨论】:

  • 这是创建一个新实例。我不想创建实例。只想到达静态对象。
  • 您无法返回View::self。如果要返回对对象的引用,则必须创建实例。顺便说一句,你在那里所做的一切都是非常糟糕的代码。阅读:misko.hevery.com/code-reviewers-guide
【解决方案3】:

在 php 5.2 中使用ReflectionClass

【讨论】:

    【解决方案4】:

    我认为您在通话中的语法是错误的。由于它是静态的,因此您 尝试 执行的操作看起来像这样:

    Main::view()::script_link('Some script');
    

    除非这会给你一个语法错误。此外,由于它是静态的,因此您无需返回任何内容。您应该进行两次单独的调用:

    Main::view();
    View::script_link("Some script");
    

    说“我需要返回一个静态对象”是没有意义的。如果定义了类,则静态对象存在并且可以访问。

    【讨论】:

      【解决方案5】:

      你只需要一个变量来保存类,因为直接调用是无效的语法 示例:

      Class Main
      {
          public static function view($type)
          {
              // return some class
              switch ($type) {
                  case "View 2": 
                      return View2;
                      break;
                  default:
                      return View;
              }
          }
      }
      
      $v = Main::view("normal view");
      $v::script_link('test');
      

      【讨论】:

        【解决方案6】:

        您是否正在寻找后期静态绑定的功能? PHP 5.3 支持。见这里:http://php.net/manual/en/language.oop5.late-static-bindings.php

        【讨论】:

        • 这如何回答这个问题?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-24
        • 1970-01-01
        • 2015-09-06
        • 2022-01-27
        • 1970-01-01
        • 1970-01-01
        • 2013-11-14
        相关资源
        最近更新 更多