- PHPはPHP: Hypertext Preprocessorを表します
- PHPファイルにはテキスト、HTML、JavaScriptコード、PHPコードを含めることができます
- PHPコードはサーバー上で実行され、結果は純粋なHTML形式でブラウザに返されます
- PHPファイルのデフォルトの拡張子は「.php」です
PHPでできること
- PHPは動的なページコンテンツを生成できます
- PHPはサーバー上のファイルの作成、開く、読み取り、書き込み、閉じるができます
- PHPはフォームデータを収集できます
- PHPはCookieを送受信できます
- PHPはデータベース内のデータを追加、削除、変更できます
- PHPはユーザーがウェブサイト上の一部のページにアクセスするのを制限できます
- PHPはデータを暗号化できます
インストール
サーバーがPHPをサポートしていない場合は、次の操作が必要です:
- Webサーバーをインストールする
- PHPをインストールする
- データベース(例:MySQL)をインストールする
公式PHPサイト(PHP.net)にPHPのインストール手順があります:http://php.net/manual/en/install.php
統合開発環境としてはWAMPを推奨します:http://www.wampserver.com/
PHP基本構文
PHPスクリプトはドキュメント内の任意の場所に配置できます。
PHPスクリプトは<?phpで始まり、?>で終わります:
<!DOCTYPE html> <html> <body> <h1>我的第一个 PHP 页面</h1> <?php echo "Hello World!"; // 这是一行注释 /* 这是 多行 注释 */ ?> </body> </html>
PHPの各コード行はセミコロンで終了する必要があります
ブラウザにテキストを出力する2つの基本命令:echoとprint。
PHP変数
変数は$記号で始まり、その後に変数名が続きます
PHPには変数を宣言するコマンドはありません。
変数は最初に値を代入したときに作成されます:
PHPは弱い型付けの言語です
PHPは変数の値に基づいて、自動的に変数を正しいデータ型に変換します。
強い型付けのプログラミング言語では、変数を使用する前に変数の型と名前を宣言(定義)する必要があります。
PHP変数のスコープ
PHPには4つの異なる変数スコープがあります:
- local
- global
- static
- parameter
ローカルスコープとグローバルスコープ
すべての関数の外部で定義された変数はグローバルスコープを持ちます。関数以外では、グローバル変数はスクリプトの任意の部分からアクセスできます。関数内でグローバル変数にアクセスするには、globalキーワードを使用する必要があります。
PHP関数内で宣言された変数はローカル変数であり、関数内でのみアクセスできます:
<?php
$x=5; // 全局变量
function myTest()
{
$y=10; // 局部变量
echo "<p>测试变量在函数内部:<p>";
echo "变量 x 为: $x";
echo "<br>";
echo "变量 y 为: $y";
}
myTest();
echo "<p>测试变量在函数外部:<p>";
echo "变量 x 为: $x";
echo "<br>";
echo "变量 y 为: $y";
?>
関数内で関数外に定義されたグローバル変数を呼び出すには、関数内の変数の前にglobalキーワードを付ける必要があります:
<?php
$x=5;
$y=10;
function myTest()
{
global $x,$y;
$y=$x+$y;
}
myTest();
echo $y; // 输出 15
?>
PHPはすべてのグローバル変数を$GLOBALS[index]という名前の配列に格納します。indexには変数名が格納されます。この配列は関数内でアクセスでき、グローバル変数を直接更新するためにも使えます。
<?php
$x=5;
$y=10;
function myTest()
{
$GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y'];
}
myTest();
echo $y;
?>
Static(静的)スコープ
関数の実行が完了すると、そのすべての変数は通常削除されます。しかし、特定のローカル変数を削除したくない場合があります。その場合は使用できますstaticキーワード
<?php
function myTest()
{
static $x=0;
echo $x;
$x++;
}
myTest();
myTest();
myTest();
?>
パラメータのスコープ
パラメータは、呼び出し元のコードから関数に値を渡すためのローカル変数です。
パラメータは関数宣言の一部としてパラメータリストで宣言されます:
<?php
function myTest($x)
{
echo $x;
}
myTest(5);
?>
PHPのecho文とprint文
- echo - 1つまたは複数の文字列を出力できます
- print - 1つの文字列のみ出力でき、戻り値は常に1です
ヒント:echoの出力速度はprintより速く、echoには戻り値がなく、printには戻り値1があります。
echoとprintはどちらも言語構造であり、使用時に括弧を付けなくても、括弧を付けても構いません:echoまたはecho()、printまたはprint()。
<?php echo "<h2>PHP is fun!</h2>"; echo "Hello world!<br>"; echo "I'm about to learn PHP!<br>"; echo "This", " string", " was", " made", " with multiple parameters."; print "<h2>PHP is fun!</h2>"; print "Hello world!<br>"; print "I'm about to learn PHP!"; ?>
次の例では、echoコマンドを使用して変数と文字列を出力する方法を示します:
<?php
$txt1="Learn PHP";
$txt2="example.com";
$cars=array("Volvo","BMW","Toyota");
echo $txt1;
echo "<br>";
echo "Study PHP at $txt2"; //php 双引号内部可包含变量
echo "My car is a {$cars[0]}"; //用大括号 显式的指定这是变量
$txt1="Learn PHP";
$txt2="example.com";
$cars=array("Volvo","BMW","Toyota");
print $txt1;
print "<br>";
print "Study PHP at $txt2";
print "My car is a {$cars[0]}";
?>
PHP5のデータ型
String(文字列)、Integer(整数)、Float(浮動小数点数)、Boolean(ブール値)、Array(配列)、Object(オブジェクト)、NULL(null値)。
文字列
任意のテキストを一重引用符と二重引用符で囲むことができます:
<?php $x = "Hello world!"; echo $x; echo "<br>"; $x = 'Hello world!'; //单引号 包括字符串字面量 双引号包含的字符串 可包含变量 echo $x; ?>
整数
次の例では、さまざまな数字をテストします。 PHPvar_dump()関数は変数のデータ型と値を返します:
?php $x = 5985; var_dump($x); echo "<br>"; $x = -345; // 负数 var_dump($x); echo "<br>"; $x = 0x8C; // 十六进制数 var_dump($x); echo "<br>"; $x = 047; // 八进制数 var_dump($x); ?>
浮動小数点数
<?php $x = 10.365; var_dump($x); echo "<br>"; $x = 2.4e3; var_dump($x); echo "<br>"; $x = 8E-5; var_dump($x); ?>
ブール型
ブール型はTRUEまたはFALSEです。
配列
配列は1つの変数に複数の値を格納できます
<?php
$cars=array("Volvo","BMW","Toyota");
var_dump($cars);
?>
オブジェクト
PHPでは、オブジェクトは宣言する必要があります。
まず、classキーワードを使用してクラスオブジェクトを宣言する必要があります。クラスはプロパティとメソッドを含むことができる構造です。
次にクラス内でデータ型を定義し、インスタンス化したクラスでそのデータ型を使用します:
<?php
class Car
{
var $color;
function Car($color="green") {
$this->color = $color;
}
function what_color() {
return $this->color;
}
}
function print_vars($obj) {
foreach (get_object_vars($obj) as $prop => $val) {
echo "\t$prop = $val\n";
}
}
// instantiate one object
$herbie = new Car("white");
// show herbie properties
echo "\herbie: Properties\n";
print_vars($herbie);
?>
NULL値
NULL値は変数に値がないことを示します。NULLはデータ型がNULLの値です。
<?php $x="Hello world!"; $x=null; var_dump($x); ?>
定数
定数は単純な値の識別子です。この値はスクリプト内で変更できません。(定数名には$修飾子を付ける必要はありません。)
注意:定数はスクリプト全体で使用できます。
定数を設定するには、define()関数を使用します。関数の構文は次のとおりです:
define(string constant_name, mixed value, case_sensitive = true)
この関数には3つのパラメータがあります:
- constant_name:必須パラメータ、定数名、つまり識別子です。
- value:必須パラメータ、定数の値です。
- case_sensitive:オプションのパラメータで、大文字小文字を区別するかどうかを指定します。trueに設定すると区別しません。
次の例では、大文字小文字を区別する定数を作成します。定数値は"Welcome to example.com!"です:
<?php
define("GREETING", "Welcome to example.com!");
echo GREETING;
?>
文字列関数と文字列連結
<?php
$txt1="Hello world!";
$txt2="What a nice day!";
echo $txt1 . " " . $txt2; // 字符串连接运算符 .
echo strlen("Hello world!"); //获取字符串长度
echo strpos("Hello world!","world"); //获取子串位置
//字符串中第一个字符的位置是 0
?>
演算子
<?php
//其他运算符略..
//逻辑运算符 ! && || and or xor
//数组运算符 合并: + 比较:== != === !==
$x = array("a" => "red", "b" => "green");
$y = array("c" => "blue", "d" => "yellow");
$z = $x + $y; // $x 和 $y 数组合并
var_dump($z);
var_dump($x == $y);
var_dump($x === $y);
var_dump($x != $y);
var_dump($x <> $y);
var_dump($x !== $y);
?>
フロー制御文(JSと同じ)
<?php
$t=date("H");
if ($t<"20")
{
echo "Have a good day!";
}
$t=date("H");
if ($t<"20")
{
echo "Have a good day!";
}
else
{
echo "Have a good night!";
}
$t=date("H");
if ($t<"10")
{
echo "Have a good morning!";
}
else if ($t<"20")
{
echo "Have a good day!";
}
else
{
echo "Have a good night!";
}
$favcolor="red";
switch ($favcolor)
{
case "red":
echo "Your favorite color is red!";
break;
case "blue":
echo "Your favorite color is blue!";
break;
case "green":
echo "Your favorite color is green!";
break;
default:
echo "Your favorite color is neither red, blue, or green!";
}
//循环
$i=1;
while($i<=5)
{
echo "The number is " . $i . "<br>";
$i++;
}
$i=1;
do
{
$i++;
echo "The number is " . $i . "<br>";
}
while ($i<=5);
for ($i=1; $i<=5; $i++)
{
echo "The number is " . $i . "<br>";
}
$x=array("one","two","three");
foreach ($x as $value)
{
echo $value . "<br>";
}
?>
配列
<?php
$cars=array("Volvo","BMW","Toyota"); //数组定义 数值数组
echo "I like " . $cars[0] . ", " . $cars[1] . " and " . $cars[2] . "."; //访问数组元素
//数组长度count()
$cars=array("Volvo","BMW","Toyota");
echo count($cars); //count() 函数用于返回数组的长度
//遍历数值数组
$cars=array("Volvo","BMW","Toyota");
$arrlength=count($cars);
for($x=0;$x<$arrlength;$x++)
{
echo $cars[$x];
echo "<br>";
}
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");//定义关联数组
echo "Peter is " . $age['Peter'] . " years old.";
//遍历关联数组
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
foreach($age as $x=>$x_value)
{
echo "Key=" . $x . ", Value=" . $x_value;
echo "<br>";
}
?>
配列のソート
PHP - 配列ソート関数
- sort() - 配列を昇順に並べ替える
- rsort() - 配列を降順に並べ替える
- asort() - 連想配列の値に基づいて、配列を昇順に並べ替える
- ksort() - 連想配列のキーに基づいて、配列を昇順に並べ替える
- arsort() - 連想配列の値に基づいて、配列を降順に並べ替える
- krsort() - 連想配列のキーに基づいて、配列を降順に並べ替える
//sort()
$cars=array("Volvo","BMW","Toyota");
sort($cars);
$clength=count($cars);
for($x=0;$x<$clength;$x++)
{
echo $cars[$x];
echo "<br>";
}
//rsort()
$cars=array("Volvo","BMW","Toyota");
rsort($cars);
//asort() arsort() 关联数组排序 value
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
asort($age);
arsort($age);
//ksort() krsort() 关联数组排序 key
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
ksort($age);
krsort($age);
?>
スーパーグローバル変数
PHPにはいくつかのスーパーグローバル変数(superglobals)が定義されており、これらはスクリプトのすべてのスコープで使用できることを意味します。
- $GLOBALS
- $_SERVER
- $_REQUEST
- $_POST
- $_GET
- $_COOKIE
- $_FILES
- $_ENV
- $_SESSION
$GLOBALはすべての変数を含むグローバルな複合配列です。変数の名前が配列のキーになります。
<?php
$x = 75;
$y = 25;
function addition()
{
$GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y'];
}
addition();
echo $z;
?>
$_SERVERは、ヘッダー情報(header)、パス(path)、スクリプトの位置(script locations)などの情報を含む配列です。この配列の項目はWebサーバーによって作成されます。すべてのサーバーがすべての項目を提供するとは限りません;
<?php echo $_SERVER['PHP_SELF']; // /try/demo_source/demo_global_server.php echo "<br>"; echo $_SERVER['SERVER_NAME']; // example.com echo "<br>"; echo $_SERVER['HTTP_HOST']; // www.example.com echo "<br>"; echo $_SERVER['HTTP_REFERER']; //来由 echo "<br>"; echo $_SERVER['HTTP_USER_AGENT']; //浏览器 echo "<br>"; echo $_SERVER['SCRIPT_NAME']; // /try/demo_source/demo_global_server.php //另外$_SERVER对象还包括 SERVER_ADDR, SERVER_PROTOCOL ,REQUEST_METHOD..等属性 ?>
$_REQUESTはHTMLフォームから送信されたデータを収集するために使用されます。
<html> <body> <form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>"> Name: <input type="text" name="fname"> <input type="submit"> </form> <?php $name = $_REQUEST['fname']; echo $name; ?> </body> </html>
$_POSTはフォームデータの収集に広く使用されており、HTMLのformタグでこの属性を指定します:"method="post"
<html> <body> <!--页面post给自己--> <form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>"> Name: <input type="text" name="fname"> <input type="submit"> </form> <?php $name = $_POST['fname']; echo $name; ?> </body> </html>
$_GETもフォームデータの収集に広く使用されており、HTMLのformタグでこの属性を指定します:"method="get"。
$_GETはURLで送信されたデータも収集できます。
<html> <body> <a href="test_get.php.html">Test $GET</a> </body> </html> //test_get.php <html> <body> <?php echo "Study " . $_GET['subject'] . " at " . $_GET['web']; ?> </body> </html>
PHPの関数
PHPの真の力はその関数に由来します。
PHPには、1000以上の組み込み関数が用意されています。
<html>
<body>
<?php
function writeName()
{
echo "Kai Jim Refsnes";
}
echo "My name is ";
writeName();
//函数传参
function writeName($fname,$punctuation)
{
echo $fname . " Refsnes" . $punctuation . "<br>";
}
echo "My name is ";
writeName("Kai Jim",".");
echo "My sister's name is ";
//函数返回值
function add($x,$y)
{
$total=$x+$y;
return $total;
}
echo "1 + 16 = " . add(1,16);
?>
</body>
</html>
マジック変数
8つのマジック定数があり、その値はコード内の位置によって変わります。
- _LINE__
ファイル内の現在の行番号。 - FILE
ファイルの完全パスとファイル名。インクルードされたファイル内で使用された場合は、インクルードされたファイルのファイル名を返します。 - DIR
ファイルが存在するディレクトリ。インクルードされたファイル内で使用された場合は、インクルードされたファイルが存在するディレクトリを返します。 - FUNCTION
関数名(PHP 4.3.0 で追加)。PHP 5 以降、この定数は関数が定義されたときの名前(大文字小文字を区別)を返します。PHP 4 では、この値は常に小文字でした。
<?php
function test() {
echo '函数名为:' . __FUNCTION__ ;
}
test();
?>
- CLASSクラス名(PHP 4.3.0 で追加)。PHP 5 以降、この定数はクラスが定義されたときの名前(大文字小文字を区別)を返します。
PHP 4 では、この値は常に小文字でした。クラス名には、宣言されたスコープ(例: Foo\Bar)が含まれます。注意:PHP 5.4 以降、CLASStrait にも作用します。trait メソッド内で使用された場合、CLASSその trait メソッドを呼び出したクラスの名前です。
<?php
class test {
function _print() {
echo '类名为:' . __CLASS__ . "<br>";
echo '函数名为:' . __FUNCTION__ ;
}
}
$t = new test();
$t->_print();
?>
- TRAITTrait の名前(PHP 5.4.0 で追加)。PHP 5.4.0 以降、PHP ではコード再利用の方法として trait が実装されています。
Trait 名には、宣言されたスコープ(例: Foo\Bar)が含まれます。
基底クラスから継承したメンバーは、挿入された SayWorld Trait の MyHelloWorld メソッドによって上書きされます。その動作は MyHelloWorld クラスで定義されたメソッドと一致します。優先順位は、現在のクラスのメソッドが trait メソッドを上書きし、trait メソッドが基底クラスのメソッドを上書きします。
<?php
class Base {
public function sayHello() {
echo 'Hello ';
}
}
trait SayWorld {
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
class MyHelloWorld extends Base {
use SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
?>
- METHODクラスのメソッド名(PHP 5.0.0 で追加)。このメソッドが定義されたときの名前(大文字小文字を区別)を返します。
<?php
function test() {
echo '函数名为:' . __METHOD__ ;
}
test();
?>
- NAMESPACE現在の名前空間の名前(大文字小文字を区別)。この定数はコンパイル時に定義されます(PHP 5.3.0 で追加)。
<?php namespace MyProject; echo '命名空间为:"', __NAMESPACE__, '"'; // 输出 "MyProject" ?>
名前空間
PHP の名前空間(namespace)は PHP 5.3 で追加されました。C# や Java を学んだことがあれば、名前空間は新しいものではありません。しかし、PHP では依然として非常に重要な意味を持ちます。
PHP の名前空間は、次の 2 種類の問題を解決できます。
- ユーザーコードと PHP 内部のクラス/関数/定数との間の名前の衝突。
- エイリアス(または短い)名前を作成し、ソースコードの可読性を向上させます。
デフォルトでは、すべての定数、クラス、関数名はグローバル空間に置かれます。これは PHP が名前空間をサポートする前と同じです。
ファイルに名前空間が含まれる場合、他のすべてのコードより前に名前空間を宣言する必要があります。
< ?php
// 定义代码在 'MyProject' 命名空间中
namespace MyProject;
// ... 代码 ...
//也可以在同一个文件中定义不同的命名空间代码
namespace MyProject1;
// MyProject1 命名空间中的PHP代码
namespace MyProject2;
// MyProject2 命名空间中的PHP代码
// 另一种语法
namespace MyProject3 {
// MyProject3 命名空间中的PHP代码
}
?>
名前空間を宣言する前に合法なコードは、ソースファイルのエンコーディングを定義する declare 文だけです。空白文字を含むすべての非 PHP コードは、名前空間の宣言より前に出現できません。
<?php
declare(encoding='UTF-8'); //定义多个命名空间和不包含在命名空间中的代码
namespace MyProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
namespace { // 全局代码
session_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}
?>
次のコードでは構文エラーが発生します。
<html> <?php namespace MyProject; // 命名空间前出现了“<html>” 会致命错误 - 命名空间必须是程序脚本的第一条语句 ?>
サブ名前空間
<?php
namespace MyProject\Sub\Level; //声明分层次的单个命名空间
//创建了常量 MyProject\Sub\Level\CONNECT_OK,
//类 MyProject\Sub\Level\Connection
//和函数 MyProject\Sub\Level\Connect。
const CONNECT_OK = 1;
class Connection { /* ... */ }
function Connect() { /* ... */ }
?>
名前空間の使用
PHP の名前空間内のクラス名は、次の 3 つの方法で参照できます。
非修飾名、またはプレフィックスを含まないクラス名。例: $a=new foo(); や foo::staticmethod();。現在の名前空間が currentnamespace の場合、foo は currentnamespace\foo として解決されます。foo を使用するコードがグローバルで、いずれの名前空間にも含まれていない場合、foo は foo として解決されます。警告: 名前空間内の関数または定数が定義されていない場合、その非修飾の関数名または定数名はグローバル関数名または定数名として解決されます。~~名前空間プレフィックスなしの参照。デフォルトで現在の名前空間で検索し、次にグローバル名前空間で検索します。
修飾名、またはプレフィックスを含む名前。例: $a = new subnamespace\foo(); や subnamespace\foo::staticmethod();。現在の名前空間が currentnamespace の場合、foo は currentnamespace\subnamespace\foo として解決されます。foo を使用するコードがグローバルで、いずれの名前空間にも含まれていない場合、foo は subnamespace\foo として解決されます。~~相対名前空間プレフィックス付きの(相対パスのような)参照。呼び出しコードが存在する名前空間を自動的に先頭に追加します。
完全修飾名、またはグローバルプレフィックス演算子を含む名前。例: $a = new \currentnamespace\foo(); や \currentnamespace\foo::staticmethod();。この場合、foo は常にコード内のリテラル名(literal name)currentnamespace\foo として解決されます。~~絶対名前空間プレフィックス付きの参照(絶対パスのようなもの)。参照パスが明確であるため、検索は不要です。
file1.php
<?php
namespace Foo\Bar\subnamespace;
const FOO = 1;
function foo() {}
class foo
{
static function staticmethod() {}
}
?>
file2.php
<?php
namespace Foo\Bar;
include 'file1.php';
const FOO = 2;
function foo() {}
class foo
{
static function staticmethod() {}
}
/* 非限定名称 */
foo(); // 解析为函数 Foo\Bar\foo
foo::staticmethod(); // 解析为类 Foo\Bar\foo的静态方法staticmethod。
echo FOO; // resolves to constant Foo\Bar\FOO
/* 限定名称 */
subnamespace\foo(); // 解析为函数 Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // 解析为类 Foo\Bar\subnamespace\foo,
// 以及类的方法 staticmethod
echo subnamespace\FOO; // 解析为常量 Foo\Bar\subnamespace\FOO
/* 完全限定名称 */
\Foo\Bar\foo(); // 解析为函数 Foo\Bar\foo
\Foo\Bar\foo::staticmethod(); // 解析为类 Foo\Bar\foo, 以及类的方法 staticmethod
echo \Foo\Bar\FOO; // 解析为常量 Foo\Bar\FOO
?>
名前空間内からグローバルクラス、関数、定数にアクセスする:
<?php
namespace Foo;
function strlen() {}
const INI_ALL = 3;
class Exception {}
$a = \strlen('hi'); // 调用全局函数strlen
$b = \INI_ALL; // 访问全局常量 INI_ALL
$c = new \Exception('error'); // 实例化全局类 Exception
?>
名前空間と動的言語機能
PHP の名前空間の実装は、言語自体の動的な特徴の影響を受けます。そのため、次のコードを名前空間に変換する場合は、要素に動的にアクセスします。
//example.php
<?php
class classname
{
function __construct()
{
echo __METHOD__,"\n";
}
}
function funcname()
{
echo __FUNCTION__,"\n";
}
const constname = "global";
$a = 'classname';
$obj = new $a; // prints classname::__construct
$b = 'funcname';
$b(); // prints funcname
echo constant('constname'), "\n"; // prints global
?>
<?php
namespace namespacename;
class classname
{
function __construct()
{
echo __METHOD__,"\n";
}
}
function funcname()
{
echo __FUNCTION__,"\n";
}
const constname = "namespaced";
include 'example1.php';//全局命名空间和某个命名空间有相同类 函数 和 常量 分别区别访问
$a = 'classname';
$obj = new $a; // prints classname::__construct
$b = 'funcname';
$b(); // prints funcname
echo constant('constname'), "\n"; // prints global
/* note that if using double quotes, "\\namespacename\\classname" must be used */
$a = '\namespacename\classname';
$obj = new $a; // prints namespacename\classname::__construct
$a = 'namespacename\classname';
$obj = new $a; // also prints namespacename\classname::__construct
$b = 'namespacename\funcname';
$b(); // prints namespacename\funcname
$b = '\namespacename\funcname';
$b(); // also prints namespacename\funcname
echo constant('\namespacename\constname'), "\n"; // prints namespaced
echo constant('namespacename\constname'), "\n"; // also prints namespaced
?>
namespaceキーワードと__NAMESPACE__定数
<?php namespace MyProject; echo '"', __NAMESPACE__, '"'; // 输出 "MyProject" ?>
<?php echo '"', __NAMESPACE__, '"'; // 输出 "" ?>
__NAMESPACE__ を使用した名前の動的作成
<?php
namespace MyProject;
function get($classname)
{
$a = __NAMESPACE__ . '\\' . $classname;
return new $a;
}
?>キーワード namespace を使用すると、現在の名前空間またはサブ名前空間内の要素に明示的にアクセスできます。これはクラス内の self 演算子に相当します。
<?php namespace MyProject; use blah\blah as mine; // see "Using namespaces: importing/aliasing" blah\mine(); // calls function blah\blah\mine() namespace\blah\mine(); // calls function MyProject\blah\mine() namespace\func(); // calls function MyProject\func() namespace\sub\func(); // calls function MyProject\sub\func() namespace\cname::method(); // calls static method "method" of class MyProject\cname $a = new namespace\sub\cname(); // instantiates object of class MyProject\sub\cname $b = namespace\CONSTANT; // assigns value of constant MyProject\CONSTANT to $b ?>
PHP では、エイリアスは演算子 use によって実現されます。以下は、可能な 3 つのインポート方法をすべて使用した例です。
- use 演算子を使用したインポート/エイリアスの使用
<?php namespace foo; use My\Full\Classname as Another; // 下面的例子与 use My\Full\NSname as NSname 相同 use My\Full\NSname; // 导入一个全局类 use \ArrayObject; $obj = new namespace\Another; // 实例化 foo\Another 对象 $obj = new Another; // 实例化 My\Full\Classname 对象 NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func $a = new ArrayObject(array(1)); // 实例化 ArrayObject 对象 // 如果不使用 "use \ArrayObject" ,则实例化一个 foo\ArrayObject 对象 ?>
- 1 行に複数の use 文を含める
<?php use My\Full\Classname as Another, My\Full\NSname; $obj = new Another; // 实例化 My\Full\Classname 对象 NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func ?> <p>导入操作是在编译执行的,但动态的类名称、函数名称或常量名称则不是。</p> <ol> <li>导入和动态名称</li> </ol> <pre> <?php use My\Full\Classname as Another, My\Full\NSname; $obj = new Another; // 实例化一个 My\Full\Classname 对象 $a = 'Another'; $obj = new $a; // 实际化一个 Another 对象 ?>
- インポートと動的名前
<?php use My\Full\Classname as Another, My\Full\NSname; $obj = new Another; // 实例化一个 My\Full\Classname 对象 $a = 'Another'; $obj = new $a; // 实际化一个 Another 对象 ?>
さらに、インポート操作は非修飾名と修飾名にのみ影響します。完全修飾名は決定されているため、インポートの影響を受けません。
- インポートと完全修飾名
<?php use My\Full\Classname as Another, My\Full\NSname; $obj = new Another; // instantiates object of class My\Full\Classname $obj = new \Another; // instantiates object of class Another $obj = new Another\thing; // instantiates object of class My\Full\Classname\thing $obj = new \Another\thing; // instantiates object of class Another\thing ?>
名前空間の使用:グローバル関数/定数へのフォールバック
名前空間内で、PHP が非修飾のクラス、関数、または定数名に遭遇した場合、その名前を解決するために異なる優先戦略を使用します。
- クラス名は常に現在の名前空間内の名前に解決されます(見つからない場合はエラーになります)。したがって、システム内部または名前空間に含まれていないクラス名にアクセスする場合は、完全修飾名を使用する必要があります。
- 関数と定数については、現在の名前空間に関数または定数が存在しない場合、PHP はグローバル空間の関数または定数を使用します。
<?php
namespace A\B\C;
class Exception extends \Exception {}
$a = new Exception('hi'); // $a 是类 A\B\C\Exception 的一个对象
$b = new \Exception('hi'); // $b 是类 Exception 的一个对象
$c = new ArrayObject; // 致命错误, 找不到 A\B\C\ArrayObject 类
?>
グローバル空間
名前空間が定義されていない場合、すべてのクラスと関数の定義はグローバル空間に置かれます。これは PHP が名前空間の概念を導入する前と同じです。名前の前にプレフィックス \ を付けると、その名前がグローバル空間の名前であることを示します。その名前が他の名前空間にある場合でも同様です。
<?php
namespace A\B\C;
/* 这个函数是 A\B\C\fopen */
function fopen() {
/* ... */
$f = \fopen(...); // 调用全局的fopen函数
return $f;
}
?>
名前空間の順序 略..
PHPファイル処理
ファイルを開く
$file = fopen($fname, mode) //ファイル名、オープンモード
- r 読み取り専用。ファイルの先頭から開始します。
- r+ 読み取り/書き込み。ファイルの先頭から開始します。
- w 書き込み専用。ファイルを開いて内容を空にします。ファイルが存在しない場合は、新しいファイルを作成します。
- w+ 読み取り/書き込み。ファイルを開いて内容を空にします。ファイルが存在しない場合は、新しいファイルを作成します。
- a 追記。ファイルを開いてファイルの末尾に書き込みます。ファイルが存在しない場合は、新しいファイルを作成します。
- a+ 読み取り/追記。ファイルの末尾に書き込むことで、ファイルの内容を保持します。
- x 書き込み専用。新しいファイルを作成します。ファイルがすでに存在する場合は、FALSE とエラーを返します。
- x+ 読み取り/書き込み。新しいファイルを作成します。ファイルがすでに存在する場合は、FALSE とエラーを返します。
注記:fopen() 関数が指定されたファイルを開けない場合、0 (false) を返します。
<?php
//打开文件
$file = fopen("welcome.txt", "r") or exit("Unable to open file!");
//Output a line of the file until the end is reached
//是否到达文件末尾
while(!feof($file))
{
echo fgets($file). "<br>"; //逐行读取文件
//echo fgetc($file); //逐字符读取
}
//关闭文件
fclose($file);
?>
Filesystem 関数
- basename() はパス内のファイル名部分を返します。
- chgrp() はファイルのグループを変更します。
- chmod() はファイルのモードを変更します。
- chown() はファイルの所有者を変更します。
- clearstatcache() はファイルステータスのキャッシュをクリアします。
- copy() はファイルをコピーします。
- delete() は unlink() または unset() を参照してください。
- dirname() はパス内のディレクトリ名部分を返します。
- disk_free_space() はディレクトリの利用可能な空き容量を返します。
- disk_total_space() はディレクトリのディスク総容量を返します。
- diskfreespace() は disk_free_space() のエイリアスです。
- fclose() は開いているファイルを閉じます。
- feof() はファイルポインタがファイルの末尾にあるかどうかを調べます。
- fflush() は開いているファイルにバッファリングされた出力をフラッシュします。
- fgetc() は開いているファイルから文字を返します。
- fgetcsv() は開いているファイルから 1 行を解析し、CSV フィールドを検証します。
- fgets() は開いているファイルから 1 行を返します。
- fgetss() は開いているファイルから 1 行を返し、HTML および PHP タグを除去します。
- file() はファイルを配列に読み込みます。
- file_exists() はファイルまたはディレクトリが存在するかどうかを調べます。
- file_get_contents() はファイルを文字列に読み込みます。~~ファイルの内容を取得する
- file_put_contents() は文字列をファイルに書き込みます。~~ファイルの内容を書き込む
- fileatime() はファイルの最終アクセス時刻を返します。
- filectime() はファイルの最終変更時刻を返します。
- filegroup() はファイルのグループ ID を返します。
- fileinode() はファイルの inode 番号を返します。
- filemtime() はファイル内容の最終変更時刻を返します。
- fileowner() はファイルのユーザー ID(所有者)を返します。
- fileperms() はファイルのパーミッションを返します。
- filesize() はファイルサイズを返します。
- filetype() はファイルタイプを返します。
- flock() はファイルをロックまたは解放します。
- fnmatch() は指定されたパターンに基づいてファイル名または文字列をマッチングします。
- fopen() はファイルまたは URL を開きます。
- fpassthru() は開かれたファイルからEOF(ファイルの末尾)までデータを読み取り、出力バッファに結果を書き込みます。
- fputcsv() は行を CSV としてフォーマットし、開かれたファイルに書き込みます。
- fputs() は fwrite() のエイリアスです。
- fread() は開かれたファイルを読み取ります。
- fscanf() は指定されたフォーマットに従って入力を解析します。
- fseek() は開かれたファイル内で位置を移動します。
- fstat() は開かれたファイルに関する情報を返します。
- ftell() は開かれたファイル内の現在位置を返します。
- ftruncate() は開かれたファイルを指定された長さに切り詰めます。
- fwrite() は開かれたファイルに書き込みます。
- glob() は指定されたパターンに一致するファイル名/ディレクトリを含む配列を返します。
- is_dir() はファイルがディレクトリかどうかを判定します。
- is_executable() はファイルが実行可能かどうかを判定します。
- is_file() はファイルが通常のファイルかどうかを判定します。
- is_link() はファイルがリンクかどうかを判定します。
- is_readable() はファイルが読み取り可能かどうかを判定します。
- is_uploaded_file() はファイルが HTTP POST でアップロードされたものかどうかを判定します。
- is_writable() はファイルが書き込み可能かどうかを判定します。
- is_writeable() は is_writable() のエイリアスです。
- lchgrp() はシンボリックリンクのグループ所有権を変更します。
- lchown() はシンボリックリンクのユーザー所有権を変更します。
- link() はハードリンクを作成します。
- linkinfo() はハードリンクに関する情報を返します。
- lstat() はファイルまたはシンボリックリンクに関する情報を返します。
- mkdir() はディレクトリを作成します。
- move_uploaded_file() はアップロードされたファイルを新しい場所に移動します。
- parse_ini_file() は設定ファイルを解析します。
- parse_ini_string() は設定文字列を解析します。
- pathinfo() はファイルパスに関する情報を返します。
- pclose() は popen() によって開かれたプロセスを閉じます。
- popen() はプロセスを開きます。
- readfile() はファイルを読み取り、出力バッファに書き込みます。
- readlink() はシンボリックリンクのターゲットを返します。
- realpath() は絶対パス名を返します。
- realpath_cache_get() はキャッシュエントリを返します。
- realpath_cache_size() はキャッシュサイズを返します。
- rename() はファイルまたはディレクトリの名前を変更します。
- rewind() はファイルポインタの位置を巻き戻します。
- rmdir() は空のディレクトリを削除します。
- set_file_buffer() は開かれたファイルのバッファサイズを設定します。
- stat() はファイルに関する情報を返します。
- symlink() はシンボリックリンクを作成します。
- tempnam() は一意の一時ファイルを作成します。
- tmpfile() は一意の一時ファイルを作成します。
- touch() はファイルのアクセス時刻と変更時刻を設定します。
- umask() はファイルのパーミッションを変更します。
- unlink() はファイルを削除します。
PHP JSON
- json_encode は変数を JSON エンコードします
- json_decode は JSON 形式の文字列をデコードして PHP 変数に変換します
- json_last_error は最後に発生したエラーを返します
string json_encode ( $value [, $options = 0 ] )
パラメータ
value: エンコードする値。この関数は UTF-8 エンコードされたデータに対してのみ有効です。
options: 以下の定数で構成されるバイナリマスク: JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_NUMERIC_CHECK,JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_FORCE_OBJECT
<?php
$arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
echo json_encode($arr);
class Emp {
public $name = "";
public $hobbies = "";
public $birthdate = "";
}
$e = new Emp();
$e->name = "sachin";
$e->hobbies = "sports";
$e->birthdate = date('m/d/Y h:i:s a', "8/5/1974 12:20:03 p");
$e->birthdate = date('m/d/Y h:i:s a', strtotime("8/5/1974 12:20:03"));
echo json_encode($e);
?>
mixed json_decode ($json [,$assoc = false [, $depth = 512 [, $options = 0 ]]])
パラメータ
json_string: デコードする JSON 文字列。UTF-8 エンコードされたデータである必要があります
assoc: このパラメータが TRUE の場合は配列を返し、FALSE の場合はオブジェクトを返します。
depth: 再帰の深さを指定する整数型のパラメータ
options: バイナリマスク。現在は JSON_BIGINT_AS_STRING のみサポートしています。
<?php
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json));
var_dump(json_decode($json, true));
?>
その他のチュートリアル
より詳細なチュートリアルは以下を参照してください:PHP チュートリアル