SlideShare une entreprise Scribd logo
1  sur  15
PHP
スーパーグローバル変数
①
2021/02/26
TaKo
表1. 3種類のスコープについて概要
概要
ローカルスコープ 宣言された関数内でのみ使用可能
グローバルスコープ
宣言されたスクリプト内で使用可能
関数内で使用するには`global`キーワードが必要
スーパーグローバル
PHPによって自動で定義される特別な変数
どこでも使用可能
関数内で使用する際に`global`キーワードが不要
変数のスコープ
スーパグローバル変数の種
類
表2. 9種のスーパーグローバル変数について概要
変数名 概要
$GLOBALS 現在グローバルスコープに定義されているすべての変数への参照
$_GET URLパラメータでスクリプトに渡された変数とその値を格納
$_POST HTTP POSTメソッドからスクリプトに渡された変数とその値が格納
$_COOKIE スクリプトに渡されたcookieの情報が格納
$_REQUEST
$_GET, $_POST ,$_COOKIEの内容をまとめた連想配列
*デフォルトでは$_COOKIEは非表示
$_SERVER WEBサーバが生成するヘッダ情報やスクリプトへのパスなどの情報
$_SESSION セッションに紐づいたデータなどを格納
$_FILES POSTメソッドでアップロードされたファイルの情報を格納
$_ENV 環境変数をまとめた連想配列
$GLOBALS
現在グローバルスコープに定義されているすべての変数への参照
<?php
$GGG_TEST_GGG = 'global scope';
function test_method() {
$LLL_TEST_LLL = 'local scope';
}
echo "<pre>";
var_dump($GLOBALS);
echo "</pre>";
グローバル変数
ローカル変数
$GLOBALSの中身を出力
array(9) {
["_GET"]=>
array(0) {
}
...略...
["GGG_TEST_GGG"]=>
string(12) "global scope"
...略...
Output
スーパーグローバル変数が
ずらずら表示されて...
自分で定義したグローバル変数とその値が格納され
ている
ローカル変数は表示されない
$_GET
URLパラメータ(GET通信)でスクリプトに渡された変数とその値が格納
<?php
echo '<pre>';
var_dump($_GET);
echo '</pre>';
$_GETの中身を出力
array(2) {
["get_value"]=>
string(2) "10"
["id"]=>
string(4) "test"
}
Output
URLで渡された値が
格納されている
全部string型で格納
http://URL?get_value=10&id=test
GET_test.php
$_POST
HTTP POSTメソッドからスクリプトに渡された変数とその値が格納
<?php
echo '<pre>';
var_dump($_POST);
echo '</pre>';
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Test</title>
</head>
<body>
<form method="POST" action="">
<p>氏名:<input type="text" name="name" value=""></p>
<p><input type="submit" name="submit" value="送信"></p>
</form>
</body>
</html>
$_POSTの中身を出力
Output
dddと入力して送信
した結果
$_COOKIE
HTTP cookie からスクリプトに渡されたcookieの情報が格納
<?php
session_start();
echo '<pre>';
var_dump($_COOKIE);
echo '</pre>';
$_COOKIEの中身を出力
array(1) {
["<session_name>"]=>
string(50) "< session-id >"
}
Output
$_REQUEST
$_GET, $_POST ,$_COOKIEの内容をまとめた連想配列
*デフォルトでは$_COOKIEは非表示
<?php
session_name("REQUEST_TEST_SESSION_ID");
session_start();
echo '<pre>';
var_dump($_REQUEST);
echo '</pre>';
?>
...省略...
$_REQUESTの中身を出力
Output
`ddd`と入力して送信した結果
http://host.name/path/to/REQUEST_test.php
?get_value=10&id=tset
$_REQUEST
$_REQUESTに$_COOKIEを含める設定
request_order = "GP"
↓の内容に書き換える
request_order = "GPC"
request_order
• $_REQUESTにどのスーパーグローバル変数を含めるか
の設定
• 設定が空白の場合、variables_orderの設定値に従う
• わざわざ設定する場面は少ない??
G:$_GET
P:$_POST
C:$_COOKIE
/etc/php.ini
*variables_orderについては次回
まとめ
• スーパーグローバル変数は、PHPが自動で用意する特別な変数
• スクリプト内のどこでも使用可能で、関数内でも`global`キーワードが不要
表3. 今回紹介したスーパーグローバル変数5種
変数名 概要
$GLOBALS 現在グローバルスコープに定義されているすべての変数への参照
$_GET URLパラメータ(GET通信)でスクリプトに渡された変数とその値が格納
$_POST HTTP POSTメソッドからスクリプトに渡された変数とその値が格納
$_COOKIE スクリプトに渡されたcookieの情報が格納
$_REQUEST
$_GET, $_POST ,$_COOKIEの内容をまとめた連想配列
*デフォルトでは$_COOKIEは非表示
おまけ
依存関係にある各種ツールなどのソースに散見
Drupal core内でも様々なファイル(半分くらいTEST関連?)で使用されている
使いこなせたら、開発者(PHPer)としての幅が広がりそう?
Drupalソース内の$GLOBALS
grep -r "$GLOBALS" path/to/DRUPAL_ROOT/
以下のコマンドでざっくりと調査
*DRUPAL_ROOTまでのパスは省略 *コマンドの実行結果を一部抜粋
/core/authorize.php: 'base_url' => $GLOBALS['base_url'],
/core/includes/common.inc: return $GLOBALS['base_path'];
/core/includes/install.inc:
_drupal_rewrite_settings_global($GLOBALS[$setting], $data);
/core/lib/Drupal/Core/Config/ConfigFactory.php:
$config->setSettingsOverride($GLOBALS['config'][$name]);
/core/lib/Drupal/Core/Test/FunctionalTestSetupTrait.php:
unset($GLOBALS['config']);
おまけ
依存関係にある各種ツールなどのソースに少量の記述。ほぼコメント内
Drupal core内ではおおよそTEST関連?のソースで少量記述。ほぼコメント内
Drupalではほぼ使われてない?
Drupalソース内の$_GET
grep -r "$_GET" path/to/DRUPAL_ROOT/
以下のコマンドでざっくりと調査
*DRUPAL_ROOTまでのパスは省略 *コマンドの実行結果を一部抜粋
/vendor/guzzlehttp/psr7/src/ServerRequest.php:
->withQueryParams($_GET)
/core/modules/system/tests/src/Functional/Routing/DestinationTest.php: // Test
$_GET['destination'].
/core/tests/Drupal/Tests/Core/Security/RequestSanitizerTest.php:
$_GET = $request->query->all();
おまけ
$_GETよりさらに記述が少なく、Symfonyなどの依存関係のあるツールと
TEST関連?のソースのみ、他はほぼコメント
Drupalでは$_GET, $_POSTはほとんど使われてなさそう?
Drupalソース内の$_POST
grep -r "$_POST" path/to/DRUPAL_ROOT/
以下のコマンドでざっくりと調査
*DRUPAL_ROOTまでのパスは省略 *コマンドの実行結果を一部抜粋
/vendor/symfony/http-foundation/Request.php:
$_POST = $this->request->all();
/core/tests/Drupal/Tests/Core/Form/FormBuilderTest.php:
$_POST['foo'] = 'bar';
/core/tests/Drupal/Tests/Core/Security/RequestSanitizerTest.php:
$_POST = $request->request->all();
おまけ
$_POSTと同じくらい記述が少なく、Symfonyなどの依存関係のあるツールと
TEST関連?のソースのみ、他はほぼコメント
SymfonyでGET,POST,COOKIEが独自の変数に格納されてる...。
Drupalソース内の$_COOKIE
grep -r "$_COOKIE" path/to/DRUPAL_ROOT/
以下のコマンドでざっくりと調査
*DRUPAL_ROOTまでのパスは省略 *コマンドの実行結果を一部抜粋
./drupal/vendor/symfony/http-foundation/Request.php:
* It overrides $_GET, $_POST, $_REQUEST, $_SERVER, $_COOKIE.
./drupal/vendor/symfony/http-foundation/Request.php:
$_COOKIE = $this->cookies->all();
./drupal/vendor/symfony/http-foundation/Request.php:
$request = ['g' => $_GET, 'p' => $_POST, 'c' => $_COOKIE];
おまけ
$_POSTよりさらに記述が少ない
おおよそSymfonyとTEST関連?のソースのみ、他はほぼコメント
$_REQUESTは、前のスライドのように独自の変数に置き換えるのが一般的?
Drupalソース内の$_REQUEST
grep -r "$_REQUEST" path/to/DRUPAL_ROOT/
以下のコマンドでざっくりと調査
*DRUPAL_ROOTまでのパスは省略 *コマンドの実行結果を一部抜粋
/vendor/symfony/http-foundation/Request.php:
$_REQUEST = [[]];
/vendor/symfony/http-foundation/Request.php:
$_REQUEST[] = $request[$order];
/vendor/symfony/http-foundation/Request.php:
$_REQUEST = array_merge(...$_REQUEST);

Contenu connexe

Plus de iPride Co., Ltd.

AWS (Amazon Web Services) を勉強してみる その3 2024/03/01の勉強会で発表されたものです。
AWS (Amazon Web Services) を勉強してみる その3 2024/03/01の勉強会で発表されたものです。AWS (Amazon Web Services) を勉強してみる その3 2024/03/01の勉強会で発表されたものです。
AWS (Amazon Web Services) を勉強してみる その3 2024/03/01の勉強会で発表されたものです。iPride Co., Ltd.
 
AWS (Amazon Web Services) を勉強してみる おさらい 2024/02/16の勉強会で発表されたものです。
AWS (Amazon Web Services) を勉強してみる おさらい 2024/02/16の勉強会で発表されたものです。AWS (Amazon Web Services) を勉強してみる おさらい 2024/02/16の勉強会で発表されたものです。
AWS (Amazon Web Services) を勉強してみる おさらい 2024/02/16の勉強会で発表されたものです。iPride Co., Ltd.
 
可用性・セキュリティを考慮して AWSでDrupalを構築する 2024/02/09の勉強会で発表されたものです。
可用性・セキュリティを考慮して AWSでDrupalを構築する 2024/02/09の勉強会で発表されたものです。可用性・セキュリティを考慮して AWSでDrupalを構築する 2024/02/09の勉強会で発表されたものです。
可用性・セキュリティを考慮して AWSでDrupalを構築する 2024/02/09の勉強会で発表されたものです。iPride Co., Ltd.
 
AWSで全てのパブリックIPv4アドレスが有料になった件について 2024/02/09の勉強会で発表されたものです。
AWSで全てのパブリックIPv4アドレスが有料になった件について 2024/02/09の勉強会で発表されたものです。AWSで全てのパブリックIPv4アドレスが有料になった件について 2024/02/09の勉強会で発表されたものです。
AWSで全てのパブリックIPv4アドレスが有料になった件について 2024/02/09の勉強会で発表されたものです。iPride Co., Ltd.
 
AWS CDKを使おうとしたら普通に悪戦苦闘した話 2024/02/02の勉強会で発表されたものです。
AWS CDKを使おうとしたら普通に悪戦苦闘した話 2024/02/02の勉強会で発表されたものです。AWS CDKを使おうとしたら普通に悪戦苦闘した話 2024/02/02の勉強会で発表されたものです。
AWS CDKを使おうとしたら普通に悪戦苦闘した話 2024/02/02の勉強会で発表されたものです。iPride Co., Ltd.
 
AWS (Amazon Web Services) を勉強してみる 2024/01/26の勉強会で発表されたものです
AWS (Amazon Web Services) を勉強してみる 2024/01/26の勉強会で発表されたものですAWS (Amazon Web Services) を勉強してみる 2024/01/26の勉強会で発表されたものです
AWS (Amazon Web Services) を勉強してみる 2024/01/26の勉強会で発表されたものですiPride Co., Ltd.
 
AWS SAM入門 2024/01/26の勉強会で発表されたものです【アイ・プライド】
AWS SAM入門  2024/01/26の勉強会で発表されたものです【アイ・プライド】AWS SAM入門  2024/01/26の勉強会で発表されたものです【アイ・プライド】
AWS SAM入門 2024/01/26の勉強会で発表されたものです【アイ・プライド】iPride Co., Ltd.
 
Drupalでフォームの代わりにSPA (React) を表示させる話 2023/12/15の勉強会で発表されたものです。
Drupalでフォームの代わりにSPA (React) を表示させる話 2023/12/15の勉強会で発表されたものです。Drupalでフォームの代わりにSPA (React) を表示させる話 2023/12/15の勉強会で発表されたものです。
Drupalでフォームの代わりにSPA (React) を表示させる話 2023/12/15の勉強会で発表されたものです。iPride Co., Ltd.
 
ChatGPTを用いてCDKを勉強
ChatGPTを用いてCDKを勉強ChatGPTを用いてCDKを勉強
ChatGPTを用いてCDKを勉強iPride Co., Ltd.
 
OpenID Connectについて
OpenID ConnectについてOpenID Connectについて
OpenID ConnectについてiPride Co., Ltd.
 
画像生成AIの問題点
画像生成AIの問題点画像生成AIの問題点
画像生成AIの問題点iPride Co., Ltd.
 
MVCになぞらえて理解するReact
MVCになぞらえて理解するReactMVCになぞらえて理解するReact
MVCになぞらえて理解するReactiPride Co., Ltd.
 
AIについて学んだこと ~ 生成AIとは? ~
AIについて学んだこと ~ 生成AIとは? ~AIについて学んだこと ~ 生成AIとは? ~
AIについて学んだこと ~ 生成AIとは? ~iPride Co., Ltd.
 
ゼロトラストについて学んだこと
ゼロトラストについて学んだことゼロトラストについて学んだこと
ゼロトラストについて学んだことiPride Co., Ltd.
 
Recoilライブラリを 触ってみる
Recoilライブラリを 触ってみるRecoilライブラリを 触ってみる
Recoilライブラリを 触ってみるiPride Co., Ltd.
 
ReactでuseEffect()を減らしたい話
ReactでuseEffect()を減らしたい話ReactでuseEffect()を減らしたい話
ReactでuseEffect()を減らしたい話iPride Co., Ltd.
 
AIについて学んだこと ~ AIとは? ~
AIについて学んだこと ~ AIとは? ~AIについて学んだこと ~ AIとは? ~
AIについて学んだこと ~ AIとは? ~iPride Co., Ltd.
 
単一責任の原則について
単一責任の原則について単一責任の原則について
単一責任の原則についてiPride Co., Ltd.
 

Plus de iPride Co., Ltd. (20)

AWS (Amazon Web Services) を勉強してみる その3 2024/03/01の勉強会で発表されたものです。
AWS (Amazon Web Services) を勉強してみる その3 2024/03/01の勉強会で発表されたものです。AWS (Amazon Web Services) を勉強してみる その3 2024/03/01の勉強会で発表されたものです。
AWS (Amazon Web Services) を勉強してみる その3 2024/03/01の勉強会で発表されたものです。
 
AWS (Amazon Web Services) を勉強してみる おさらい 2024/02/16の勉強会で発表されたものです。
AWS (Amazon Web Services) を勉強してみる おさらい 2024/02/16の勉強会で発表されたものです。AWS (Amazon Web Services) を勉強してみる おさらい 2024/02/16の勉強会で発表されたものです。
AWS (Amazon Web Services) を勉強してみる おさらい 2024/02/16の勉強会で発表されたものです。
 
可用性・セキュリティを考慮して AWSでDrupalを構築する 2024/02/09の勉強会で発表されたものです。
可用性・セキュリティを考慮して AWSでDrupalを構築する 2024/02/09の勉強会で発表されたものです。可用性・セキュリティを考慮して AWSでDrupalを構築する 2024/02/09の勉強会で発表されたものです。
可用性・セキュリティを考慮して AWSでDrupalを構築する 2024/02/09の勉強会で発表されたものです。
 
AWSで全てのパブリックIPv4アドレスが有料になった件について 2024/02/09の勉強会で発表されたものです。
AWSで全てのパブリックIPv4アドレスが有料になった件について 2024/02/09の勉強会で発表されたものです。AWSで全てのパブリックIPv4アドレスが有料になった件について 2024/02/09の勉強会で発表されたものです。
AWSで全てのパブリックIPv4アドレスが有料になった件について 2024/02/09の勉強会で発表されたものです。
 
AWS CDKを使おうとしたら普通に悪戦苦闘した話 2024/02/02の勉強会で発表されたものです。
AWS CDKを使おうとしたら普通に悪戦苦闘した話 2024/02/02の勉強会で発表されたものです。AWS CDKを使おうとしたら普通に悪戦苦闘した話 2024/02/02の勉強会で発表されたものです。
AWS CDKを使おうとしたら普通に悪戦苦闘した話 2024/02/02の勉強会で発表されたものです。
 
AWS (Amazon Web Services) を勉強してみる 2024/01/26の勉強会で発表されたものです
AWS (Amazon Web Services) を勉強してみる 2024/01/26の勉強会で発表されたものですAWS (Amazon Web Services) を勉強してみる 2024/01/26の勉強会で発表されたものです
AWS (Amazon Web Services) を勉強してみる 2024/01/26の勉強会で発表されたものです
 
AWS SAM入門 2024/01/26の勉強会で発表されたものです【アイ・プライド】
AWS SAM入門  2024/01/26の勉強会で発表されたものです【アイ・プライド】AWS SAM入門  2024/01/26の勉強会で発表されたものです【アイ・プライド】
AWS SAM入門 2024/01/26の勉強会で発表されたものです【アイ・プライド】
 
Drupalでフォームの代わりにSPA (React) を表示させる話 2023/12/15の勉強会で発表されたものです。
Drupalでフォームの代わりにSPA (React) を表示させる話 2023/12/15の勉強会で発表されたものです。Drupalでフォームの代わりにSPA (React) を表示させる話 2023/12/15の勉強会で発表されたものです。
Drupalでフォームの代わりにSPA (React) を表示させる話 2023/12/15の勉強会で発表されたものです。
 
ChatGPTを用いてCDKを勉強
ChatGPTを用いてCDKを勉強ChatGPTを用いてCDKを勉強
ChatGPTを用いてCDKを勉強
 
OpenID Connectについて
OpenID ConnectについてOpenID Connectについて
OpenID Connectについて
 
画像生成AIの問題点
画像生成AIの問題点画像生成AIの問題点
画像生成AIの問題点
 
AI入門
AI入門AI入門
AI入門
 
MVCになぞらえて理解するReact
MVCになぞらえて理解するReactMVCになぞらえて理解するReact
MVCになぞらえて理解するReact
 
AIについて学んだこと ~ 生成AIとは? ~
AIについて学んだこと ~ 生成AIとは? ~AIについて学んだこと ~ 生成AIとは? ~
AIについて学んだこと ~ 生成AIとは? ~
 
OAuth2.0について
OAuth2.0についてOAuth2.0について
OAuth2.0について
 
ゼロトラストについて学んだこと
ゼロトラストについて学んだことゼロトラストについて学んだこと
ゼロトラストについて学んだこと
 
Recoilライブラリを 触ってみる
Recoilライブラリを 触ってみるRecoilライブラリを 触ってみる
Recoilライブラリを 触ってみる
 
ReactでuseEffect()を減らしたい話
ReactでuseEffect()を減らしたい話ReactでuseEffect()を減らしたい話
ReactでuseEffect()を減らしたい話
 
AIについて学んだこと ~ AIとは? ~
AIについて学んだこと ~ AIとは? ~AIについて学んだこと ~ AIとは? ~
AIについて学んだこと ~ AIとは? ~
 
単一責任の原則について
単一責任の原則について単一責任の原則について
単一責任の原則について
 

PHP:スーパーグローバル変数1