大家好:
我又來問問題QQ,子類別的建構子呼叫父類別的方法為什麼無法顯示值
但是子類別的方法呼叫父類別的方法卻可以
主要是因為如果多個子類別就要一直呼叫 GetUserData() 判斷有無值
所以想說在控制器中的建構子直接先呼叫 GetUserData() 判斷有無值,但好像不行..
謝謝
class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
public function GetUserData()
{
$UID=session()->get('UID');
if(is_null($UID))
{
return false;
}
$User=$UID;
return $User;
}
}
class DataController extends Controller
{
public function __construct() {
echo $this->GetUserData(); //無法輸出值
exit;
}
public function Roomnumdata()
{
echo $this->GetUserData(); //可以輸出值
exit;
}
}
寫法蠻奇特的。
__construct 有優先執行的特性。
所以一般要在其建構上使用父類別的東西。最好還是用
parent::sayHello()
的方式來處理。
不過,其實正常來說。這邊理論上也該能取到才對。
所以我會偏向你用了 exit 而導致不正常處理。
這邊先給你幾項建議。
在物件處理的應用上,請盡量不要用 exit 處理。
因為它有時會影響到你的物件連動性的處理。
如果是框架類的更會造成麻煩。
再來..你有一段寫法倒是讓我覺得算很奇怪的寫法。
if(is_null($UID))
{
return null;
}
這裏判斷NULL然後回傳NULL??
感覺有點多此一舉的做法。
一般會做這樣的判斷是為了要回傳其它值。如空文字值或0數值等等。
但如果本身要回傳NULL了?那判斷它的意義在哪??
這點有點搞不太懂。
浩大您好:
我有修改return false
主要判斷是否有登入
登入=>Logincontroller function A存session()->put('UID',$IdNo);
網頁資料解析=>DataController function B 從extends的Controller中function GetUserData { session()->get('UID',$IdNo);} 取得登入的值
只是我每做一個function,就要判斷一次有無登入,才想到建構子方式,但好像建構子無法得到session值,需要Middleware(中介層?)
基本上的確會建議你用 Middleware 來處理。
SESSION是一個很神奇的變數。
在運行流程上,有時SESSION PUT的當下。GET是拿不到改變值的。
不過這個是存在 $_SESSION 原生PHP時代的事。
早期在同一之程式碼
用如下的程式碼
session_start();
$_SESSION['test'] = 'test';
echo $_SESSION['test'];//這邊並不一定可以拿到 test
一般改良的做法是
session_start();
$test = 'test';
$_SESSION['test'] = $test;
echo $test;
也就是用變數來記錄。SESSION則用變動去變動但不直接取用。
而在你的 session() 的應用上。我並不確定是否也有利用到第二種方式。
如果及PUT及GET都還是使用第一種方法的話。
這樣的確會拿不到改變值的。
且正常來說,一般物件應用上。也最好不要直接這樣應用。
最好還是採用導向式的方式來處理。
也多多利用注入的方式來處理。
浩大好@ @
1.一般改良的做法是 那邊如果釋放session echo 好像還是對顯示test
2.session()->get('UID',$IdNo); 發現blade可以直接取用..這樣好像就沒問題
3.如果未來想要登入就讓使用者身分分別導不同頁面是否也是用Middleware
謝謝
http://n.sfs.tw/content/index/10582
或許,
使用parent::看看
建構子呼叫父類別函數應該是不會有問題的
<?php
class IamParent {
public function sayHello(){
return true;
}
}
class IamChild extends IamParent {
function __construct(){
echo $this->sayHello()?"HELLO":"Error";
}
public function testFunc(){
return $this->sayHello()?"HELLO":"Error";
}
}
$obj = new IamChild;
echo "<p style='color: red;'>".$obj->testFunc()."</p>";
?>
我猜,你的問題會不會是在 session()->get('UID') 這上面
在建構子時還不存在,所以無法輸出值