El mié., 12 feb. 2020 23:01, Rowan Tommins <[email protected]>
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.