从类中导入静态方法并为其添加别名

arv*_*vil 3 php import alias

我试图从实用程序/帮助程序类中为静态方法添加别名,文档没有提供有关静态方法的任何信息,并且使用那里定义的方法不适用于静态方法(看起来是这样)。

假设我有这门课:

namespace App\Helpers;

class HTTP {

    public static function extract_path_from_url( string $url ) {
        $parsed_url = wp_parse_url( $url );
        if ( ! isset( $parsed_url['path'] ) ) {
            return false;
        }
        return (string) $parsed_url['path'];

    }

}
Run Code Online (Sandbox Code Playgroud)

然后尝试在不同的文件上使用它:

<?php

echo \App\Helpers\HTTP::extract_path_from_url( 'http://example.com/test' );
Run Code Online (Sandbox Code Playgroud)

上面那个有效

但试图给它起别名:

<?php

use \App\Helpers\HTTP\extract_path_from_url as extract_path;

echo extract_path( 'http://example.com/test' );
Run Code Online (Sandbox Code Playgroud)

会输出

Fatal error: Uncaught Error: Call to undefined function App\Helpers\HTTP\extract_path_from_url()
Run Code Online (Sandbox Code Playgroud)

甚至:

<?php

use \App\Helpers\HTTP::extract_path_from_url as extract_path;

echo extract_path( 'http://example.com/test' );
Run Code Online (Sandbox Code Playgroud)

显示这个奇怪的错误:

Parse error: syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM)
Run Code Online (Sandbox Code Playgroud)

这可能吗?

问候,

Art*_*nix 6

别名不会神奇地将方法转换为函数,请尝试这样做

<?php
    use \App\Helpers\HTTP as extract_path;
    echo extract_path::extract_path_from_url( 'http://example.com/test' );
Run Code Online (Sandbox Code Playgroud)

另外(不言而喻)当您使用别名时,这只影响命名空间和类名,而不影响类的方法。这些通常用于两件事中的一件。解决命名冲突

 use NamespaceOne\Someclass;
 use NamespaceTwo\Someclass as SecondClass;
Run Code Online (Sandbox Code Playgroud)

如果这些都没有使用别名,那么使用

 Someclass::method()
Run Code Online (Sandbox Code Playgroud)

会很暧昧。

它们的第二个用途是如果您需要从一个名称空间导入大量类。比如这样:

use App\Exceptions\NoFile;
use App\Exceptions\FileSize;
use App\Exceptions\FileType;

throw new NoFile();
throw new FileSize();
throw new FileType();
Run Code Online (Sandbox Code Playgroud)

可以这样做:

use App\Exceptions as E;

throw new E\NoFile();
throw new E\FileSize();
throw new E\FileType();
Run Code Online (Sandbox Code Playgroud)

这不仅更短,而且更容易维护,如果您更改名称空间,您只需更改别名即可,然后一切都很好。简而言之,它并不是真正适合您想要使用它的用途。

包起来

你总是可以为它做一个包装:

if(!function_exists('extract_path_from_url')){
     function extract_path_from_url($url){
        return \App\Helpers\HTTP::extract_path_from_url($url);
     }
}
Run Code Online (Sandbox Code Playgroud)

然后随心所欲地调用它。从性能角度来看,您确实可以通过包装它来进行额外的调用,但通常包装器使其更易于维护。例如,如果您重命名该方法或类,您可以在包装器中更改它,一切都很好。因此,这两种选择都有争议。

您不必检查该函数是否存在,但根据整个系统的工作方式,这可能不是一个坏主意,因此我将其包含在示例中只是为了完整性。就我个人而言,在这种情况下,我认为将其与类放在同一个文件中没有任何问题,只需记住加载它即可。如果您使用自动加载,则不会包含这些函数,除非您手动加载文件或以其他方式强制其自动加载。当然,假设没有其他东西首先使用该类。

我过去使用过的一种我非常喜欢的方法是创建一个名为http_functions(classname + _functions) 的文件,然后向注册函数的类添加一个静态方法:

  class HTTP {
      public static function register_functions(){
          require 'http_functions.php';
      }
  }
Run Code Online (Sandbox Code Playgroud)

然后,当您调用它时,HTTP::register_functions()它会自动加载HTTP类并包含所有功能包装器。事实上,我在我的超级棒的调试打印类中做了这件事(队列无耻插件)https://github.com/ArtisticPhoenix/Debug

只是一些想法,享受吧!