El mié., 12 feb. 2020 23:01, Rowan Tommins <rowan.coll...@gmail.com> escribió:
> On 12/02/2020 21:47, Manuel Canga wrote: > > You is importing function and you are using different. It is the same > > case like: > > > > namespace MyProject; > > > > use Vendor/Controller; > > > > class Controller extends Controller { > > } > > > In that example, you're defining two things of the same type with the > same name, which would be an error; that's not what was happening in my > example. > > In a call like Acme\Global\I18N::translate, or a callable like > ['Acme\Global\I18N', 'translate'], the "translate" part never refers to > a function in the current namespace, or indeed any namespace, only to a > method of that particular class. > > But if you write ['Acme\Global\I18N', translate::function], there's no > way for the engine to know that you wanted a method name rather than a > function name, so it will try to resolve it in the current namespace and > import list. That will either give an error, because there is no > function called translate; or it will give you a fully-qualified name, > which isn't what you wanted, you just wanted the string 'translate' > You're right about my example. This is good example: namespace MyProject; use Vendor\Controller; class MyController extends Controller { ..... } This is an error, if Controller has actually MyProyect namespace. Then, you have two options: 1. Change import 2. Add namespace to class Controller In your example, you has the same options: > 1. Change import 2. Add namespace: ['Acme\Global\I18N',\translate::function] Explain: When you do: [ class, method ] or [ $object, method ]. Method has not namespace, you write it without namespace( like global functions ) then you do the same with ::function. This is [ class, \method::function ] or [ $object, \method::function ] Other example: $class = \MyClass::class; $method = \method::function; $obj = new $class(); $obj->$method(); and... $class = '\MyClass'; $method = 'method'; $obj = new $class(); $obj->$method(); Both are the same, but first is more semantic.