2016-12-06 1 views
0

Я новичок в PHP. Я просто пытаюсь понять пространство имен PHP и застрял в следующей точке изменения имени класса, я имею в виду эту статью под названием How to use PHP namespace. И ссылался на следующий код на этой странице.В чем разница между именем класса как MyClass и namespace Myclass в PHP?

<?php 
namespace App\Lib1; 

class MyClass { 
    public function WhoAmI() { 
     return __METHOD__; 
    } 
} 

$c = __NAMESPACE__ . '\\MyClass'; 
$m = new $c; 
echo $m->WhoAmI(); // outputs: App\Lib1\MyClass::WhoAmI 
?> 

В приведенном выше коде, я думаю, они создали объект, как,

$c = __NAMESPACE__ . '\\MyClass'; 
$m = new $c; 

Я думаю, объект может быть создан простой в вышеописанном случае, как,

$m = new MyClass(); 

А на той же странице, в другом коде объект был создан с использованием кода,

$m = new namespace\MyClass; 

Теперь, если я сравниваю все три выше, я нахожу два метода создания имени класса 1. $m = new MyClass(); и 2. $m = namespace\MyClass;. Мне интересно, в чем разница и цель использования $m = namespace\MyClass;? Очень благодарен в Advance.

ответ

1

Самое большое преимущество использования пространств имен в PHP - это когда у вас несколько классов с тем же именем. Без namespacing разработчику нужно будет беспокоиться о том, что, создав класс MyClass, есть тысячи других сторонних библиотек, которые также могут иметь MyClass.

Предположим, вы хотели создать класс под названием DateTime. Если вы просто написали функцию без пространства имен, это противоречило бы классу DateTime PHP. Объявив пространство имен, вы разделите свой код.

<?php 

$myObject = DateTime(); // This statement creates an object using PHP's implementation of DateTime 

namespace Foo\DateTime; 
use Foo\DateTime as DateTime; 

$myObject = DateTime(); // This statement will use the custom class from the Foo\DateTime namespace 

$myObject = PHP\DateTime(); // This statement will use PHP's class even though you're using the Foo\DateTime namespace 

?> 

Второе преимущество для краткости кода. Если вы используете пространство имен Foo \ DateTime, показанное выше, вам не нужно использовать полное имя при создании пользовательских объектов из вашего класса. Это полезно, когда вам нужно создать большое количество экземпляров вашего пользовательского класса.

При использовании имен, как это так, вы можете записать его в качестве псевдонима вместо полного имени:

use Foo\DateTime as DateTime; 
$myObject = new DateTime(); 

Без использования пространств имен, вы должны создать объект, как это так, если вы хотите использовать класс DateTime вместо класса DateTime PHP:

$myObject = Foo\DateTime(); 
1

Я полагаю, нет каких-либо существенных различий между:

$m = new MyClass(); и $m = new namespace\MyClass;

Это может помочь вам явно указать, какой из двух классов с одинаковыми именами вы используете:

<?php 
namespace Foo; 

class MyClass { 
    public function WhoAmI() { 
     return __METHOD__; 
    } 
} 
?> 

<?php 
namespace Bar; 

class MyClass { 
    public function WhoAmI() { 
     return __METHOD__; 
    } 
} 
?> 

<?php 
namespace Bar; 
use Foo; 

$obj1 = new MyClass; 
var_dump($obj1->WhoAmI()); //Bar\MyClass::WhoAmI 

$obj2 = new namespace\MyClass; 
var_dump($obj2->WhoAmI()); //Bar\MyClass::WhoAmI 

$obj3 = new Foo\MyClass; 
var_dump($obj3->WhoAmI()); //Foo\MyClass::WhoAmI 

В этом случае лучше использовать aliasing.

+0

Да, это правда, оба дают одинаковый выход. Спасибо за ссылку, я имею в виду эту ссылку и пытаюсь понять всю систему, опубликует после вас комментарий. благодаря – codenext

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