iT邦幫忙

0

[php] 建構子呼叫父類別方法

php

大家好:
我又來問問題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;
    }
}
1
㊣浩瀚星空㊣
iT邦超人 1 級 ‧ 2021-09-08 11:44:16
最佳解答

寫法蠻奇特的。

 __construct 有優先執行的特性。

所以一般要在其建構上使用父類別的東西。最好還是用

parent::sayHello()

的方式來處理。

不過,其實正常來說。這邊理論上也該能取到才對。
所以我會偏向你用了 exit 而導致不正常處理。

這邊先給你幾項建議。
在物件處理的應用上,請盡量不要用 exit 處理。
因為它有時會影響到你的物件連動性的處理。
如果是框架類的更會造成麻煩。

再來..你有一段寫法倒是讓我覺得算很奇怪的寫法。

if(is_null($UID))
        {
            return null;
        }

這裏判斷NULL然後回傳NULL??
感覺有點多此一舉的做法。
一般會做這樣的判斷是為了要回傳其它值。如空文字值或0數值等等。
但如果本身要回傳NULL了?那判斷它的意義在哪??
這點有點搞不太懂。

mayyola iT邦研究生 5 級 ‧ 2021-09-08 16:32:50 檢舉

浩大您好:
我有修改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都還是使用第一種方法的話。
這樣的確會拿不到改變值的。

且正常來說,一般物件應用上。也最好不要直接這樣應用。
最好還是採用導向式的方式來處理。
也多多利用注入的方式來處理。

mayyola iT邦研究生 5 級 ‧ 2021-09-09 23:00:51 檢舉

浩大好@ @
1.一般改良的做法是 那邊如果釋放session echo 好像還是對顯示test
2.session()->get('UID',$IdNo); 發現blade可以直接取用..這樣好像就沒問題
3.如果未來想要登入就讓使用者身分分別導不同頁面是否也是用Middleware
謝謝

1
小魚
iT邦大師 1 級 ‧ 2021-09-08 00:17:25

http://n.sfs.tw/content/index/10582
或許,
使用parent::看看

mayyola iT邦研究生 5 級 ‧ 2021-09-08 16:34:28 檢舉

應該是要加中介層比較恰當T_T
謝謝你~

0
迷路
iT邦新手 5 級 ‧ 2021-09-08 08:37:59

建構子呼叫父類別函數應該是不會有問題的

<?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') 這上面
在建構子時還不存在,所以無法輸出值

mayyola iT邦研究生 5 級 ‧ 2021-09-08 16:34:16 檢舉

迷大好:好像是建構子無法直接存取session 需要中介層的樣子@@

我要發表回答

立即登入回答