импортировать и псевдоним статический метод из класса - PullRequest
0 голосов
/ 29 сентября 2018

Я пытаюсь присвоить псевдоним статическому методу из класса утилит / помощников, документация ничего не дает относительно статических методов, и использование определенных там не работает для статических методов (как это кажется).

Скажем, у меня есть этот класс:

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()

even:

<?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)

Возможно ли это?

С уважением,

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Псевдоним не выполняет магическое преобразование методов в функции, попробуйте вместо этого

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

Также (это должно быть само собой разумеющимся), когда вы используете псевдоним, это влияет только на пространство имен и имя класса, а не на методы класса,Они обычно используются для 1 из 2 вещей.Разрешение конфликтов имен

 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();

Что не только короче, но и проще в обслуживании, если вы измените пространство имен, вы должны изменить его только дляпсевдоним, а затем все хорошо.Короче говоря, он не предназначен для того, для чего вы хотите его использовать.

Оберните его

Вы всегда можете сделать обертку для него:

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

Просто некоторые мысли, наслаждайтесь!

0 голосов
/ 29 сентября 2018

Как сказано в руководстве, вы можете импортировать через use классы, функции и константы.Метод класса (даже статический) не является функцией .

Так, например, у вас есть:

namespace My\Super\NameSpace;

const MY_CONST = 42;

class MyClass { 

    public function do() { /* code */ }  // this is NOT a function
    public static function doStatic() { /* code */ }  // this is NOT a function too

}

function my_function() { /* code */ }  // this is function 

В каком-то другом файле вы можете написать:

namespace YaNamespace;

use const My\Super\NameSpace\MY_CONST;
use My\Super\NameSpace\MyClass;
use function My\Super\NameSpace\my_function as func_alias;

И это все, что вы можете импортировать с помощью use.

...