Несколько вопросов о пространствах имен PHP - PullRequest
2 голосов
/ 28 ноября 2011

Я портирую существующий проект в пространства имен, и в итоге я попал в некоторые стены, и официальная документация мне не помогла. Может быть, вы, ребята, можете! :)

1) Как расширить класс с уровня выше в пространстве имен? Например:

namespace MyProject\Exceptions;

abstract class Handler {

}

namespace MyProject\Exceptions\Handlers;

class Test extends \MyProject\Exceptions\Handler {

}

2) Как использовать пространства имен с функциями, которые ожидают обратные вызовы?

namespace MyProject;

class Main {
    public function __construct() {
        set_error_handler(array('MyProject', 'handleErrors'));
    }

    public function handleErrors() {
        echo "hi";
    }
}

Ответы [ 2 ]

0 голосов
/ 26 июня 2013

Вопрос 1: Нет сокращения для адресации пространства имен «над» вашим текущим пространством имен. Вы должны использовать полный путь, как вы уже сделали выше.

Вопрос 2: Это правда, что вы можете использовать анонимные функции (которые были введены в 5.3), и это часто может быть хорошим выбором:

namespace MyProject;

class Main {
     public function __construct() {
         set_error_handler( function() { 
              echo "hi"; 
         } );
     }
}

Однако не всегда лучше использовать анонимные функции. Функции являются полезной абстракцией по той самой причине, что вы можете вызывать их из разных мест. Анонимные функции - это сокращение для создания функций, которые нужны только один раз.

Если вы хотите использовать обычную неанонимную функцию, обратите внимание, что сначала в приведенном выше примере вы используете метод экземпляра, поэтому вы должны предоставить экземпляр с $ this:

namespace MyProject;

class Main {
     public function __construct() {
         set_error_handler(array($this, 'handleErrors'));
     }

     public function handleErrors() {
         echo "hi";
     }
}

Кроме того, есть случай, когда вы хотите обратиться к статической функции из класса пространства имен. В этом случае синтаксис массива должен включать имя класса. Если имя класса имеет пространство имен, вы должны использовать полный путь к пространству имен, как в исходном коде:

namespace MyProject;

class Main {
    public function __construct() {
        set_error_handler(array('MyProject\Main', 'handleErrors'));
    }

    public static function handleErrors() {
        echo "hi";
    }
}
0 голосов
/ 28 ноября 2011

Точно так же как другие вещи пространства имен. Тем не менее, убедитесь, что вы избежали обратной косой черты!

-edit-

Поскольку мы говорим о «современном PHP» здесь, я настоятельно рекомендую просто передать функцию в качестве обратного вызова, а не использовать свой способ создания обратного вызова. В настоящее время вы можете просто принять функцию и использовать ее в качестве обратного вызова, как вы можете это сделать в других языках программирования, таких как C ++.

namespace Foo;
function Bar($callback) { $callback(); }

// Other file
Foo\Bar(function() {
    // Do something
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...