gpt4 book ai didi

php - 从类中导入和别名静态方法

转载 作者:行者123 更新时间:2023-12-02 17:04:12 25 4
gpt4 key购买 nike

我正在尝试为实用程序/帮助程序类的静态方法起别名,documentation没有给出任何关于静态方法的信息,并且使用那些定义的静态方法对静态方法不起作用(看起来如此)。

假设我有这个类:

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'];

}

}

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

<?php

echo \App\Helpers\HTTP::extract_path_from_url( 'http://example.com/test' );

上面那一个有效

但试图给它起别名:

<?php

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

echo extract_path( 'http://example.com/test' );

会输出

Fatal error: Uncaught Error: Call to undefined function App\Helpers\HTTP\extract_path_from_url()

甚至:

<?php

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

echo extract_path( 'http://example.com/test' );

显示这个奇怪的错误:

Parse error: syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM)

这可能吗?

问候,

最佳答案

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

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

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

 use NamespaceOne\Someclass;
use NamespaceTwo\Someclass as SecondClass;

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

 Someclass::method()

会是模棱两可的。

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

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

throw new NoFile();
throw new FileSize();
throw new FileType();

可以这样做:

use App\Exceptions as E;

throw new E\NoFile();
throw new E\FileSize();
throw new E\FileType();

这不仅更短,而且更易于维护,如果您更改 namespace ,您只需更改别名即可,然后一切都很好。所以简而言之,它并不是真正为您想要使用它的目的而设计的。

包裹起来

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

if(!function_exists('extract_path_from_url')){
function extract_path_from_url($url){
return \App\Helpers\HTTP::extract_path_from_url($url);
}
}

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

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

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

  class HTTP {
public static function regester_fuctions(){
require 'http_functions.php'
}
}

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

只是一些想法,享受吧!

关于php - 从类中导入和别名静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52570323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com