2014-11-25 2 views
2

Читая это documentation of the Silex PHP micro-framework,Как класс может быть массивом и объектом одновременно?

В разделе

служба теперь будет зарегистрирован в заявке, и метод преобразования будет использоваться в качестве преобразователя:

Код

$app['converter.user'] = $app->share(function() { 
    return new UserConverter(); 
}); 

$app->get('/user/{user}', function (User $user) { 
    // ... 
})->convert('user', 'converter.user:convert'); 

$app является arra y + объект одновременно. Или предположим, что он начинается как массив, но получает назначенный объект. Это меня смущает: $app['converter.user'] =.

Как это работает?

ответ

3

Использование интерфейса PHP Iterator, а также интерфейс ArrayAccess позволит PHP знать, что ваш класс можно рассматривать как массив. Одним из простых способов сделать это будет расширение от класса ArrayObject.

По существу, что происходит с этими интерфейсами, так это то, что у вас есть приватная переменная и методы доступа к этой переменной. Интерфейсы позволяют PHP знать, что эти методы существуют, и что он действительно может рассматривать класс как массив.

Теперь, если Silex использует этот метод или нет, я не могу комментировать. Тем не менее, именно так вы бы создали класс PHP, к которому также можно получить доступ как массив

+0

@DanFromGermany это smore как '$ app-> offSetGet (" converter.user ")' – Victory

+0

После прочтения 'ArrayAccess' все получилось Чисто. благодаря – DanFromGermany

2

$app не является массивом и объектом. Это просто объект, доступ к которому можно получить через индекс или с помощью оператора ->.

Чтобы ответить на ваш второй вопрос, это возможно путем перегрузки, которую вы можете прочитать here.

Смежные вопросы