2011-08-28 28 views
3

全部,PHP - 爲什麼「Index.php?action =」未被識別爲「Index.php?」

我正在用PHP構建一個前端控制器。在這裏面,我說:

if (isset($_GET['action'])){ 
     $action=$_GET['action']; 
    } else { 
     $action=''; 
    } 

我遵循與switch語句比控制器是基於$action值稱爲共治:

switch ($action){ 
     case '': 
      require_once('Controller_Welcome.php'); 
      $command=new controller_Welcome(); 
      break; 
     case 'logon': 
      require_once('Controller_Logon.php'); 
      $command=new controller_Logon(); 
      break; 
     default: 
      require_once('Controller_Unknown.php'); 
      $command=new controller_Unknown(); 
      break; 
    } 
$command->execute(); 

這工作得很好。當我啓動應用程序時,URL是http://.../Index.php?,並調用Controller_Welcome.php。如果我點擊登錄菜單項,我會得到http://.../Index.php?action=logon,並調用Controller_Logon.php。如果我手動編輯URL以將...?action=...設置爲某個未知值,我會得到Controller_Unknown.php,這是我的錯誤頁面。所以一切都很好。

我不明白的是,如果我手動更改網址以顯示http://.../Index.php?action=,我會得到錯誤頁面而不是歡迎頁面。爲什麼php不會將以...?action=結尾的網址與開關盒$action='';關聯?

(還有時會發生沒有邏輯上的用戶情況,但是我還是不明白......)

感謝,

JDelage

PS:Var_dumping $action回報string(0) ""

+0

的var_dump($行動);回報什麼? – 2011-08-28 04:05:45

+0

嘗試var_dumping你的變量,也許這不是你想象的那樣。 –

+0

它返回:'string(0)「」' – JDelage

回答

1

當您設置?action=時,您將獲得$_GET['action']null返回值。所以在你的場景中,switch語句將使用默認情況。就像大家所說的,你總是可以使用var_dump來查看返回值。

+1

1 )GET和POST值永遠不會是'null',最壞的情況是它們是空字符串! 2)'null ==''' – deceze

+1

開關不做類型檢查,它相當於if(null ==''){...}'在PHP的常規非類型比較中評估爲true 。 –

0

我認爲行動不是你想象的那樣。這符合我的預期。

for url ending in 'action=' blank is echoed 
for url ending in 'action=anything' anything is echoed 


    var_dump($_GET); 
    $action = $_GET['action']; 

switch ($action){ 
     case '': 
      echo "blank"; 
      break; 
     default: 
      echo $action; 
      break; 
    } 
+0

看到您關於傾銷var的最新評論。我逐字複製了你的代碼,你的switch語句適合我。有沒有什麼方法可以讓你的'Controller_Welcome'出錯,然後重定向到'Controller_Unknown'? – mrtsherman

2

只是一個說明,可能有助於可讀性和進一步的開發工作。看來你的命名約定可能允許多一點「魔術」,爲一種約定優於配置的讓位和代碼避免重複:

define('PATH_CONTROLLERS', 'path/to/controllers/'); 

$action = !empty($_GET['action']) 
    ? $_GET['action'] 
    : 'default'; 

switch($action){ 
    case 'default': 
    case 'welcome': 
    case 'authenticate': 
     $controller_name = "controller_{$action}"; 
     break; 
    default: 
     $controller_name = 'controller_404'; 
     break; 
} 

require PATH_CONTROLLERS . "{$controller_name}.php"; 
$controller = new $controller_name(); 

$controller->execute(); 

考慮:

// index.php 

$action:   'default' 
$controller_name: 'controller_default' 
require():  'path/to/controllers/controller_default.php' 

// index.php?action=authenticate 

$action:   'authenticate' 
$controller_name: 'controller_authenticate' 
require():  'path/to/controllers/controller_authenticate.php' 

// index.php?action=foobar 

$action:   'foobar' 
$controller_name: 'controller_404' 
require():  'path/to/controllers/controller_404.php' 
+0

三元將永遠不會有助於可讀性 –

+2

@Col。 Shrapnel - *嵌套的*三元運算符會發出一個解析錯誤,如果我有我的方式,但你是否建議這實際上*少*可讀? – Dan

+1

我說的不是解析錯誤,而是可讀性。 '如果'陳述總是可以看作簡單的英語,而三元是野蠻的。 '$ action =!empty($ _ GET ['action']'my foot!最欺騙的代碼可能會寫出 –

-1

有與您的其他代碼一起。
這一個工作正常,並拋出Controller_Welcome在空行動

0

你描述的行爲不能被複制。我用下面的,結果也沒有表明你所描述的:

<pre> 
<?php 

if (isset($_GET['action'])){ 
    $action=$_GET['action']; 
} else { 
    $action=''; 
} 

var_dump($action); 
echo "\n"; 
var_dump($_GET); 
echo "\n"; 


switch ($action){ 
    case '': 
     die('empty action</pre>'); 
    case 'logon': 
     die('logon action</pre>'); 
    default: 
     die('unknown action</pre>'); 
    } 
?> 

電話:

http://host.com/test.php?action= 

結果:

string(0) "" 

array(1) { 
    ["action"]=> 
    string(0) "" 
} 

empty action 
+0

你有點遲了答案 –

+0

閱讀答案(及其時間)我明白你的意思;) –

相關問題