Saya memposting beberapa pertanyaan sebelumnya mengenai penggunaan Namespaces di PHP dan dari apa yang saya dapatkan, contoh kode yang saya miliki di bawah ini seharusnya bekerja.
Namun saya mendapatkan error ketika saya mencoba menggunakan Namespace di PHP seperti ini. Berikut adalah kesalahan pertama ketika menjalankan kode di bawah ini...
Fatal error: Class 'Controller' not found in E:\Controllers\testing.php on line 6
E:\Controller\testing.php File
<?php
use \Controller;
include('testcontroller.php');
$controller = new Controller;
$controller->show();
?>
E:\Controller\testcontroller.php File
<?php
use \Library\Registry;
namespace Controller
{
class Controller
{
public $registry;
function __construct()
{
include('E:\Library\Registry.class.php');
$this->registry = new Registry;
}
function show()
{
echo $this->registry;
echo '<br>Registry was ran inside testcontroller.php<br>';
}
}
}
?>
E:\Library\Registry.class.php File
<?php
namespace Library\Registry
{
class Registry
{
function __construct()
{
return 'Registry.class.php Constructor was ran';
}
}
}
?>
Seperti yang Anda lihat, saya mencoba membuatnya sesederhana mungkin hanya untuk membuat bagian Namespace bekerja. Saya telah mencoba variasi yang berbeda dan sepertinya tidak dapat mengetahuinya.
Ketika Anda meletakkan kelas Controller
di namespace Controller
, maka Anda harus mereferensikannya seperti itu:
$controller = new Controller\Controller();
\Controller
akan menjadi kelas di namespace global (default), yaitu seolah-olah Anda tidak menggunakan namespace sama sekali.
Anehnya saya menemukan bahwa dalam contoh kode saya dari Pertanyaan di atas, jika saya mengubah semua Namespace's
yang didefinisikan menjadi sesuatu seperti MyLibrary
sehingga akan menjadi seperti kode di bawah ini ...
E:\Library\Registry.class.php File
<?php
namespace MyLibrary
{
class Registry
{
function __construct()
{
echo 'Registry.class.php Constructor was ran';
}
}
}
?>
Kemudian ketika saya menggunakan use MyLibrary\Registry;
di file lain, saya dapat mengaksesnya seperti yang saya rencanakan ...
$this->registry = new Registry;
Alasan mengapa hal ini sangat aneh bagi saya adalah ini sekarang membuat nama kelas tampak seperti Namespace
juga. Jadi saya tidak perlu mengatur Namespace menjadi 'MyLibrary\Library' untuk mengakses Registry
sebagai gantinya saya akan melakukannya seperti yang saya tunjukkan dalam jawaban ini untuk dapat mengaksesnya hanya dengan memanggil nama kelas.
Saya harap ini masuk akal dan membantu orang lain. Saya tidak akan menerima ini sebagai jawaban karena saya berharap seseorang dengan pengetahuan yang lebih banyak akan datang dan memposting Jawaban yang lebih baik dengan penjelasan
coba
<?php
use \Library\Registry;
namespace Controller;
class Controller
{
public $registry;
function __construct()
{
include('E:\Library\Registry.class.php');
$this->registry = new Registry;
}
function show()
{
echo $this->registry;
echo '<br>Registry was ran inside testcontroller.php<br>';
}
}
?>
dan
<?php
namespace Library\Registry;
class Registry
{
function __construct()
{
return 'Registry.class.php Constructor was ran';
}
}
?>