iT邦幫忙

0

php 打開子類別頁面會報錯

  • 分享至 

  • xImage

請問我有二個類別 Father 及 Child 都是放在 /class/model 資料夾內,
我有設定自動加載 spl_autoload_register 函數,
各類別定義如下:

/class/model/Father.php
namespace model;
Class Father {
...
}

/class/model/Child.php
namespace model;
Class Child extends \model\Father {
...
}

我打開 Father.php 不會報錯
但打開 Child.php 卻會出現以下錯誤:
Fatal error: Class 'model\Father' not found in ...省略

而如果在其他頁面實例化類別都不會報錯
$Father = new \model\Father();
$Child = new \model\Child();

請問為何子類別 Child 會報錯,而父類別 Father 卻不會?
我要怎麼寫,打開 Child.php 時才不會報錯?
謝謝

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
淺水員
iT邦大師 6 級 ‧ 2021-03-03 16:39:43
最佳解答

我猜你是用 composer autoload 的 psr-4
如果是的話
會不會報錯主要是因為有沒有引用 autoload.php
如果沒有引用的話,php 不知道你的 namespace 要去哪個資料夾找檔案

通常寫 class 並不會直接引用 autoload.php
要測試的話就另外寫一個 php,引用 autoload.php 後再測試

看更多先前的回應...收起先前的回應...
samjam iT邦新手 3 級 ‧ 2021-03-03 16:55:03 檢舉

我是用這個方式

function class_loader($name) {	
	if (class_exists($name) || interface_exists($name)) {
		return;
	}
	$name = str_replace("\\", '/', $name);
	if (file_exists(REQUIRE_ROOT . "/class/{$name}.php")) {
		require(REQUIRE_ROOT . "/class/{$name}.php");
	}
	return;	
}

spl_autoload_register('class_loader');

在其他頁面實例化都沒問題
$Child = new \model\Child();

但直接用瀏覽器打開 /class/model/Child.php 會錯誤
Fatal error: Class 'model\Father' not found in ...省略
不知道為何?

淺水員 iT邦大師 6 級 ‧ 2021-03-03 17:04:31 檢舉

Child.php 應該沒有 spl_autoload_register 那段程式碼吧
所以當他需要 Father 時,不知道要去哪邊找

samjam iT邦新手 3 級 ‧ 2021-03-03 17:17:21 檢舉

對喔,引入那段程式碼後就解決了
謝謝!

淺水員 iT邦大師 6 級 ‧ 2021-03-03 17:44:35 檢舉

我建議是這樣

  • autoload.php:只有 spl_autoload_register 相關的程式碼
  • 主程式:require autoload.php
  • Child.php 跟 Father.php:不引入 autoload.php ,也沒有 spl_autoload_register 相關的程式碼
  • test.php:測試某 class 時使用,require autoload.php,然後 new namespace\someClass 來測試
samjam iT邦新手 3 級 ‧ 2021-03-03 22:25:59 檢舉

好的,非常感謝您。

我要發表回答

立即登入回答