記事ディレクトリ
と ?>
の間の部分と、タスクの開始タグと終了タグの外側にあるものは、PHP パーサーによって無視されます。 PHP では、短いタグ および
?>
の使用も許可されていますが、これらの使用は推奨されなくなりました。短いタグを使用したい場合は、php.ini で短いタグ構成オプション
short_open_tag の値を true に設定するか、構成オプション
--enable-short-tags# を使用する必要があります。 ## php をコンパイルするとき。 PHP 5.4 以降では、short_open_tag の設定に関係なく、短い形式の echo タグ = が常に認識され、有効になります。
PHP は、
このような開始タグと終了タグもサポートしており、そのようなタグは構成を必要としません。の場合、効果はと同じです。
PHP では ASP スタイル タグ も使用できます。php.ini で
asp_tags
オプションをオンにする必要がありますが、これはお勧めできません。移植性やその他の理由により、このマークアップを使用してください。
ファイルの内容が純粋な PHP コードである場合は、ファイルの末尾にある PHP 終了タグを削除することをお勧めします。これにより、PHP が終了タグの後に誤ってスペースや改行を追加してしまうことを防ぎます。これにより、スクリプト内でスペースを出力する意図がない場合でも、PHP がこれらのスペースの出力を開始します。
[例]
<?phpecho "Hello World";// ... more codeecho "Last statement";// 脚本至此结束,不使用结束标记
PHP コマンド区切り文字PHP 5.2 以前のバージョンでは、インタープリタはファイルのコンテンツ全体を開始タグ
PHP コードは、コマンドを終了するステートメントとして;
で終わります。 PHP スニペットの最後の行はセミコロンで終わる必要はありません。改行がその前にある場合、行の終わりはスニペットの終了タグに含まれます。 [以下は正当な PHP ステートメントです]
<?php echo "This is a test"; ?> <?php echo "This is a test" ?> <?php echo 'We omitted the last closing tag';
ファイル末尾の PHP コード セグメント終了タグは必須ではありません。場合によっては、include を使用する場合は省略した方がよい場合があります。予期される空白はファイルの末尾に表示されず、応答ヘッダーは後で出力することができます。また、出力バッファリングを使用する場合にも便利なので、インクルード ファイルによって生成される不要な空白文字が表示されなくなります。
PHP は、C、C、および Unix シェル スタイル (Perl スタイル) コメントをサポートしています。単一行コメント
// 行末または現在の PHP コード ブロックへのコメントのみ。 複数行のコメント
/* */、
/* で始まり、最初の
*/
が見つかったときに終了します。複数行のコメントは使用できません。埋め込み。複数行のコメントのセット。 定数
PHP では、定数は、一度宣言すると変更できない値です。
定数の宣言と使用 PHP は、define() コマンドを通じて定数を宣言します。形式は次のとおりです:
define("常量名", 常量值);
<?php define("WELCOME", "欢迎来到PHP的世界"); // 定义常量WELCOME echo WELCOME; // 输出常量值?>
PHPの組み込み定数とは、PHPがシステム構築当初に定義したいくつかの値を指します。 。 PHP には多くのシステム組み込み定数が事前定義されており、これらの出力はいつでも呼び出すことができます。
_FILE_
:这个默认常量是文件的完整路径和文件名。若引用文件(include或require),则在引用文件内的该常量为引用文件名,而不是引用它的文件名。_LINE_
:这个默认常量是PHP程序行数。若引用文件(include或require)则在引用文件内的该常量为引用文件的行,而不是引用它的文件行。PHP_VERSION
:这个内置常量是PHP程序的版本。PHP_OS
:这个内置常量是指执行PHP解析器的操作系统名称。TRUE
:代表真值trueFALSE
:代表假值falseE_ERROR
:这个常量指到最近的错误处。E_WARNING
:这个常量指导最近的警告处。E_PARSE
:这个常量指到解析语法有潜在问题处。E_NOTICE
:这个常量为发生不寻常但不一定是错误处。_DIR_
:这个常量为文件所在的目录。该常量在PHP 5.3.0版本中新增。_FUNCTION_
:这个常量为函数的名称。从PHP5开始,此常量返回该函数被定义时的名字,区分大小写。_CLASS_
:这常量为类的名称。从PHP5开始,此常量返回该类被定义时的名字,区分大小写。PHP变量
变量像一个贴有名字标签的空盒子。不同的变量类型对应不同种类的数据,就像不同种类的东西要放入不同种类的盒子。
PHP中的变量声明
PHP中的变量一般以$
作为前缀,然后以字母a~z的大小写或者“_”下划线开头。这是变量的一般表示。
PHP中不需要显式地声明变量,但是定义变量前进行声明并带有注释,是一个好程序员应该养成的习惯。
PHP的赋值有两种:
<?php echo "使用传值方式赋值:<br/>"; // 输出 使用传值方式赋值: $a = "变量的名字为a"; $b = $a; // 将变量$a的值赋给$b,两个变量指向不同内存空间 echo "变量a的值为".$a."<br>"; // 输出变量a的值 echo "变量b的值为".$b."<br>"; // 输出变量b的值 $a = "修改变量a的值"; // 改变变量a的值,变量b的值不受影响 echo "变量a的值为".$a."<br>"; // 输出变量a的值 echo "变量b的值为".$b."<p>"; // 输出变量b的值 echo "使用引用方式赋值:<br>"; // 输出 使用引用方式赋值: $a = "引用赋值测试"; $b = &$a; // 将变量$a的引用赋给$b,两个变量指向同一块内存 echo "变量a的值为".$a."<br>"; // 输出变量a的值 echo "变量b的值为".$b."<br>"; // 输出变量b的值 $a = "修改变量a的值"; /* 改变变量a的内存空间中存储的内容,变量b也指向该空间,b的值也发生变化 */ echo "变量a的值为".$a."<br>"; // 输出变量a的值 echo "变量b的值为".$b."</p><p>"; // 输出变量b的值 ?></p>
运行结果:
可变变量与变量引用
首先来看一个例子:
<?php $value0 = "guest"; // 定义变量$value0并赋值 $$value0 = "customer"; // 再次给变量赋值 echo $guest."<br />"; // 输出变量 $guest = "ib-top.com"; // 定义变量$guest并赋值 echo $guest."\t".$$value0."<br>"; $value1 = "ib-top.cn"; // 定义变量$value1 $value2 = &$value1; // 引用变量并传递变量 echo $value1."\t".$value2."<br>"; //输出变量 $value2 = "冰蓝工作室"; echo $value1."\t".$value2; ?>
运行结果:
【代码分析】
首先,$value0
被赋值guest
。因此,$value0
相当于guest,于是$$value0
相当于$guest
。所以当$$value0
被复制为customer
时,打印$guest
就得到customer
。当$guest
被赋值为ib-top.com
时,打印$$value0
得到的就是ib-top.com
,这就是可变变量。
其次在代码的第二部分里,$value1
被赋值ib-top.cn
,然后通过“&”引用变量$value1
并赋值给$value2
.实际上就是将变量$value1
添加了一个别名$value2
.由于$value2
是别名,因此和$value1
指向同一个变量。因此当$value2
被赋值“冰蓝工作室”后,$value1
和$value2
都得到了新值。
可变变量其实是允许改变一个变量的变量名,允许使用一个变量的值作为另一个变量的名。
变量引用相当于给变量添加了一个别名,使用“&”来引用变量。在计算机内部,两个变量名指向同一个变量。
内置超全局变量(Built-in superglobal variables),在代码中的任意位置都可以访问到。
$GLOBALS
:包含全局变量的数组。$_GET
:包含所有通过GET方法传递给代码的变量的数组。$_POST
:包含所有通过POST方法传递给代码的变量的数组。$_FILES
:包含文件上传变量的数组。$_COOKIES
:包含cookie变量的数组。$_SERVER
:包含服务器环境变量的数组。$_ENV
:包含环境变量的数组。$_REQUEST
:包含用户所有输入内容的数组(包括
G
E
T
、
_GET、
GET、_POST和$_COOKIE)。$_SESSION
:包含会话变量的数组。常量(constants),一旦声明,就是全局性的,可以在函数内外使用。
可以用define()函数来定义常量,在PHP5.3.0后,可以使用const关键字在类定义之外定义常量。一个常量一旦被定义,就不能再改变或者取消定义。
全局变量(global variables),在代码间声明,可在代码间访问,但是不能在函数内访问。
【示例1】
<?php $room = 20; // 定义全局变量 function showrooms() { echo $room; // 函数内部访问全局变量 } showrooms(); // 访问全局变量 echo $room.'间房间。'; ?>
运行结果:
出现上述结果,是因为函数无法访问外部全局变量,但是在代码间可以访问全局变量。
【示例2】
<?php $room = 20; // 定义全局变量 function showrooms() { global $room; // 函数内部调用全局变量 echo $room.'间新房间。<br />'; } showrooms(); // 访问全局变量 echo $room.'间房间。'; ?>
运行结果:
除了使用global在函数内部调用全局变量外,还可以通过“超全局变量”中的$GLOBALS数组进行访问。
【示例3】
<?php $room = 20; // 定义全局变量 function showrooms() { $room = $GLOBALS['room'] // 通过$GLOBALS数组访问全局变量 echo $room.'间新房间。<br />'; } showrooms(); // 访问全局变量 echo $room.'间房间。'; ?>
* 在函数中声明为全局变量的变量就是同名的全局变量。 * 在函数中创建和声明为静态变量的变量在函数外是无法访问的,但这个静态变量的值可以保留。 * 在函数中创建和声明的局部变量在函数外是无法访问的,并且在本函数终止时失效。 * 静态变量
静态变量只是在函数内存在,在函数外无法访问。但是执行后,其值保留,也就是说这一次执行完毕后,静态变量的值保留,下一次再执行此函数,这个值还可以调用。
【示例】
<?php $person = 20; function showpeople(){ static $person = 5; $person++; echo '再增加一位,将会有'.$person.'位static人员。<br />'; } showpeople(); echo $person.' 人员。<br>'; showpeople(); ?>
运行效果:
void unset (变量)
其中,变量类型为局部变量,则变量被销毁;如果变量类型为全局变量,则变量不会被销毁。
【示例】
<?php function xiaohui() { global $b; // 函数内使用global关键字声明全局变量$b unset ($b); // 使用unset()销毁不再使用的变量$b } $b = '冰蓝工作室'; // 函数外声明全局变量 xiaohui(); // 调用函数 echo $b; // 查看全局变量是否发生变化 ?>
运行效果:
数据类型
PHP支持9种原始数据类型。
四种标量类型
三种复合类型:
两种特殊类型:
如果想查看某个表达式的值和类型,用var_dump()函数。如果只是想得到一个易读懂的类型的表达方式用于调试,用gettype()函数。要检验某个类型,不要用gettype(),而用is_type函数。
【示例】
<?php $a_bool = TRUE; // 布尔值 boolean$a_str = "foo"; // 字符串 string$a_str2 = 'foo'; // 字符串 string$an_int = 12; // 整型 integer$a_float = 3.14; // 浮点型 floatecho gettype($a_bool); // 输出: booleanecho gettype($a_str); // 输出: stringecho gettype($a_str2); // 输出: stringecho gettype($an_int); // 输出: integerecho gettype($a_float); // 输出: double// 如果是整型,就加上4if (is_int($an_int)) { $an_int += 4;}// 如果 $bool 是字符串,就打印出来// 未打印任何信息if (is_string($a_bool)) { echo "String: $a_bool";}?>
Boolean布尔类型
标量类型。表达了真值,可以为TRUE或FALSE。
Integer整型
整型值可以使用十进制,十六进制,八进制或二进制表示,前面可以加上可选的符号(- 或者 +)。
二进制表达的 integer 自 PHP 5.4.0 起可用。
要使用八进制表达,数字前必须加上 0(零)。要使用十六进制表达,数字前必须加上 0x。要使用二进制表达,数字前必须加上 0b。
integer 语法的结构形式是:
decimal: [1-9][0-9]*
| 0
hexadecimal : 0[xX][0-9a-fA-F]+
octal: 0[0-7]+
binary: 0b[01]+
integer: [±]?decimal
| [±]?hexadecimal
| [±]?octal
| [±]?binary
整型数的字长和平台有关,尽管通常最大值是大约二十亿(32 位有符号)。64 位平台下的最大值通常是大约 9E18,除了 Windows 下 PHP 7 以前的版本,总是 32 位的。 PHP 不支持无符号的 integer。Integer 值的字长可以用常量 PHP_INT_SIZE来表示,自 PHP 4.4.0 和 PHP 5.0.5后,最大值可以用常量 PHP_INT_MAX 来表示,最小值可以在 PHP 7.0.0 及以后的版本中用常量 PHP_INT_MIN 表示。
PHP 7 以前的版本里,如果向八进制数传递了一个非法数字(即 8 或 9),则后面其余数字会被忽略。PHP 7 以后,会产生 Parse Error。
如果给定的一个数超出了 integer 的范围,将会被解释为 float。同样如果执行的运算结果超出了 integer 范围,也会返回 float。
PHP 中没有整除的运算符。1/2 产生出 float 0.5。值可以舍弃小数部分,强制转换为 integer,或者使用 round() 函数可以更好地进行四舍五入。
浮点型
浮点型(也叫浮点数 float,双精度数 double 或实数 real)可以用以下任一语法定义:
<?php $a = 1.234;$b = 1.2e3;$c = 7E-10;?>
浮点数的字长和平台相关,尽管通常最大值是 1.8e308 并具有 14 位十进制数字的精度(64 位 IEEE 格式)。
浮点数的精度有限。尽管取决于系统,PHP 通常使用 IEEE 754 双精度格式,则由于取整而导致的最大相对误差为 1.11e-16。非基本数学运算可能会给出更大误差,并且要考虑到进行复合运算时的误差传递。
此外,以十进制能够精确表示的有理数如 0.1 或 0.7,无论有多少尾数都不能被内部所使用的二进制精确表示,因此不能在不丢失一点点精度的情况下转换为二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999999991118…。
所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数。
NaN
某些数学运算会产生一个由常量 NAN 所代表的结果。此结果代表着一个在浮点数运算中未定义或不可表述的值。任何拿此值与其它任何值(除了 TRUE)进行的松散或严格比较的结果都是 FALSE。
由于 NAN 代表着任何不同值,不应拿 NAN 去和其它值进行比较,包括其自身,应该用 is_nan() 来检查。
字符串型
一个字符串string就是由一系列的字符组成,其中每个字符等同于一个字节,PHP只支持256的字符集,因此不支持Unicode。
一个字符串最大可以达到2GB。
字符串型(string)的数据是表示在引号之间的。引号分为双引号("")和单引号(’’)。双引号几乎可以包含所有的字符,但是在其中的变量显示变量的值,而不是变量的变量名,而有些特殊字符加上""符号就可以了;单引号内的字符是直接表示出来的。
第三种表达字符串的方法是用heredoc语法结构:必须在该行的第一列,而且标识符的命名也要像其它标签一样遵守PHP命名规则:只能包含字母、数字和下划线,并且必须以字母和下划线作为开头。
要注意的是结束标识符这行除了可能有一个分号(;)外,绝对不能包含其它字符。也就是说结束标识符不能缩进,分号的前后也不能有任何空白或制表符。更重要的是结束标识符的前面必须是个被本地操作系统认可的换行,而结束标识符(可能其后有个分号)之后也必须紧跟一个换行。
Heredoc结构不能用来初始化类的属性。自PHP 5.3起,此限制仅对heredoc包含变量时有效。
heredoc结构就像是没有使用双引号的双引号字符串,在heredoc结构中单引号不用转义,并且变量将被替换为变量值。
示例
<?php $str = <<<EODExample of string spanning multiple lines using heredoc syntax.EOD;/* 含有变量的更复杂示例 */class foo{ var $foo; var $bar; function __construct() { $this->foo = 'Foo'; $this->bar = array('Bar1', 'Bar2', 'Bar3'); }}$foo = new foo();$name = 'MyName';echo foo. Now, I am printing some {$foo->bar[1]}. This should print a capital 'A': \x41EOT;?>
以上代码会输出:
My name is "MyName". I am printing some Foo. Now, I am printing some Bar2. This should print a capital 'A': A
也可以把Heredoc结构用在函数参数中来传递数据:
<?phpvar_dump (array(<<<EODfoobar!EOD));?>
以上代码会输出
array(1) { [0]=> string(7) "foobar!" }
在PHP5.3.0以后,也可以用Heredoc结构来初始化静态变量和类的属性和常量:
<?php // 静态变量function foo(){ static $bar = <<<LABELNothing in here...LABEL;}// 类的常量、属性class foo{ const BAR = <<<FOOBARConstant exampleFOOBAR; public $baz = <<<FOOBARProperty exampleFOOBAR;}?>
自PHP5.3.0起还可以在Heredoc结构中用双引号来声明标识符:
<?phpecho <<<"FOOBAR"Hello world!FOOBAR;?>
第四种表示方式是Nowdoc结构,与Heredoc结构类似,使用标记 heredoc结构类似于双引号字符串,Nowdoc结构类似于单引号字符串,因此nowdoc中不进行解析操作。这种结构很适合用于嵌入PHP代码或其它大段文本而无需对其中的特殊字符进行转义。
示例
<?php $str = <<<'EOD'Example of string spanning multiple lines using heredoc syntax.EOD;/* 含有变量的更复杂示例 */class foo{ var $foo; var $bar; function __construct() { $this->foo = 'Foo'; $this->bar = array('Bar1', 'Bar2', 'Bar3'); }}$foo = new foo();$name = 'MyName';echo foo. Now, I am printing some {$foo->bar[1]}. This should print a capital 'A': \x41EOT;?>
以上代码会输出
My name is "$name". I am printing some $foo->foo. Now, I am printing some {$foo->bar[1]}. This should print a capital 'A': \x41
Nowdoc结构是在PHP5.3.0中加入的。
** 变量解析 **
当字符串用双引号或 heredoc 结构定义时,其中的变量将会被解析。
共有两种语法规则:一种简单规则,一种复杂规则。简单的语法规则是最常用和最方便的,它可以用最少的代码在一个 string 中嵌入一个变量,一个 array 的值,或一个 object 的属性。
复杂规则语法的显著标记是用花括号包围的表达式。
简单语法
当 PHP 解析器遇到一个美元符号($)时,它会和其它很多解析器一样,去组合尽量多的标识以形成一个合法的变量名。可以用花括号来明确变量名的界线。
示例
<?php $juice = "apple";echo "He drank some $juice juice.".PHP_EOL;// Invalid. "s" is a valid character for a variable name, but the variable is $juice.echo "He drank some juice made of $juices.";?>
以上代码输出如下
同样,一个array索引或一个object属性也可以被解析。
示例
<?php $juices = array("apple", "orange", "koolaid1"=>"purple");echo "He drank some $juices[0] juice.".PHP_EOL;echo "He drank some $juices[1] juice.".PHP_EOL;echo "He drank some juice made of $juice[0]s.".PHP_EOL; //Won't workecho "He drank some $juices[koolaid1] juice.".PHP_EOL;class people { public $john = "John Smith"; public $jane = "Jame Smith"; public $robert = "Robert Paulsen"; public $smith = "Smith";}$people = new people();echo "$people->john drank some $juices[0] juice.".PHP_EOL;echo "$people->john then said hello to $people->jane.".PHP_EOL;echo "$people->john's wife greeted $people->robert.".PHP_EOL;echo "$people->robert greeted the two $people->simths."; //Won't work?>
以上代码输出如下
复杂(花括号)语法
复杂语法不是因为其语法复杂而得名,而是因为它可以使用复杂的表达式。只需简单地像在 string 以外的地方那样写出表达式,然后用花括号 { 和 } 把它括起来即可。由于 { 无法被转义,只有 $ 紧挨着 { 时才会被识别。可以用 {$ 来表达 {$。
示例
<?php // 显示所有错误error_reporting(E_ALL);$great = 'fantastic';// 无效,输出:This is { fantastic}echo "This is { $great}";// 有效,输出:This is fantasticecho "This is {$great}";echo "This is ${great}";// 有效echo "This square is {$square->width} 00 centimeters broad.";// 有效,只有通过花括号语法才能正确解析带引号的键名echo "This works:{$arr['key']}";// 有效 echo "This works:{$arr[4][3]}";// 这是错误的表达式,因为就像$foo[bar]的格式在字符串以外也是错的一样。// 换句话说,只有在PHP能找到常量foo的前提下才会正常工作;这里会产生一个E_NOTICE(undefined constant)级别的错误。echo "This is wrong:{$arr[foo][3]}";// 有效,当在字符串中使用多重数组时,一定要用括号将它括起来echo "This works:{$arr['foo'][3]}";echo "This works too:{$obj->values[3]->name}";echo "This is the value of the var named $name: {${$name}}";echo "This is the value of the var named by the return value of getName():{${$getName()}}";echo "This is the value of the var named by the return value of \$object->getName():{${$object->getName()}}";// 无效,输出:This is the return value of getName():{getName()}echo "This is the return value of getName():{getName()}";
还可以在字符串中用这种语法通过变量来调用类的属性。
示例
<?phpclass foo { var $bar = "I am bar.";}$foo = new foo();$bar = 'bar';$baz = array('foo', 'bar', 'baz', 'quux');echo "{$foo->$bar}\n";echo "{$foo->{$baz[1]}}\n";?>
函数、方法、静态类变量和类常量只有在 PHP 5 以后才可在 {$} 中使用。然而,只有在该字符串被定义的命名空间中才可以将其值作为变量名来访问。只单一使用花括号 ({}) 无法处理从函数或方法的返回值或者类常量以及类静态变量的值。
<?php // 显示所有错误error_reporting(E_ALL);class beers { const softdrink = 'rootbeer'; public static $ale = 'ipa';}$rootbeer = 'A & W';$ipa = 'Alexander Keith\'s';//有效, 输出: I'd like an A & Wecho "I'd like an {${beers::softdrink}}\n";//也有效,输出:I'd like an Alexander Kerith's echo "I'd like an {${beers::$ale}}\n";?>
存取和修改字符串中的字符
string 中的字符可以通过一个从 0 开始的下标,用类似 array 结构中的方括号包含对应的数字来访问和修改,比如 $str[42]。可以把 string 当成字符组成的 array。函数 substr() 和 substr_replace() 可用于操作多于一个字符的情况。
string也可以用花括号访问,比如 s t r 42 , 效 果 和 str{42},效果和 str42,效果和str[42]一样
用超出字符串长度的下标写入将会增加字符串长度并以空格填充。非整数类型下标会被转换为整数。非法下标类型将会产生一个E_NOTICE级别的错误。用负数下标写入字符串时会产生一个E_NOTICE级别的错误,用负数下标读取字符串时返回空字符串。写入时只用到了赋值字符串的第一个字符,用空字符串赋值则赋给的值是NULL字符。
PHP的字符串在内部是字节组成的数组,因此用花括号访问或修改字符串对多字节字符集很不安全。仅应对单字节编码例如ISO-8859-1的字符进行此类操作。
自 PHP 5.4 起字符串下标必须为整数或可转换为整数的字符串,否则会发出警告。之前类似 “foo” 的下标会无声地转换成 0。
用 [] 或 {} 访问任何其它类型(不包括数组或具有相应接口的对象实现)的变量只会无声地返回 NULL。 PHP 5.5 增加了直接在字符串原型中用 [] 或 {} 访问字符的支持。
数组型
数组(array)是PHP变量的集合,是按照“键”与“值”的对应关系组织数据的。数组的键值既可以是整数,也可以是字符串。数组不显式声明键值的默认情况下,数组元素的键值从零开始。
PHP中的数组实际上是一个有序映射。映射是一种把values关联到keys的类型。
可以使用list()函数或array()函数来创建数组,也可以直接进行赋值。
示例
<?php $arr = array // 定义数组并赋值(0 => 15,2 => 1E+05,1 => "PHP数组语法",);for ($i = 0; $i ";}?>
以上代码中用"=>"为数组元素赋值,数组的下标只是存储的标识,没有任何意义,数组元素的排列以加入的先后顺序为准。
可以用 array() 语言结构来新建一个数组。它接受任意数量用逗号分隔的 键(key) => 值(value)对。最后一个数组单元之后的逗号可以省略。通常用于单行数组定义中,例如常用 array(1, 2) 而不是 array(1, 2, )。对多行数组定义通常保留最后一个逗号,这样要添加一个新单元时更方便。
自 5.4 起可以使用短数组定义语法,用 [] 替代 array()。
示例
<?php $arr = array("foo" => "bar","bar" => "foo",);// 自PHP5.4起$arr = ["foo" => "bar","bar" => "foo",];?>
其中key 可以是 integer 或者 string。value 可以是任意类型。
关于key还有如下转换规则:
如果在数组定义中多个单元都使用了同一个键名,则只使用了最后一个,之前的都被覆盖了。
示例
<?php $arr = array(1 => "a","1" => "b",1.5 => "c",true => "d",);var_dump($arr);?>
以上代码会输出:
array(1) { [1]=> string(1) "d" }
因为以上代码中的所有键名都被强制转换为1,则每一个新单元都会覆盖前一个的值。
PHP 数组可以同时含有 integer 和 string 类型的键名,因为 PHP 实际并不区分索引数组和关联数组。
如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是该值加一。如果指定的键名已经有了值,则该值会被覆盖。
key 为可选项。如果未指定,PHP 将自动使用之前用过的最大 integer 键名加上 1 作为新的键名。
数组元素的访问
数组单元可以通过 array[key] 语法来访问。
方括号和花括号可以互换使用来访问数组单元(例如 $array[42] 和 $array{42} 在上例中效果相同)。
自 PHP 5.4 起可以用直接对函数或方法调用的结果进行数组解引用,在此之前只能通过一个临时变量。
自 PHP 5.5 起可以直接对一个数组原型进行数组解引用。
示例
<?phpfunction getArray() { return array(1, 2, 3);}// PHP5.4$secondElement = getArray()[1]// PHP5.4之前$tmp = getArray();$secondElement = $tmp[1];// 或者list(, $secondElement) = getArray();?>
试图访问一个未定义的数组键名与访问任何未定义变量一样:会导致 E_NOTICE 级别错误信息,其结果为 NULL。
数组元素值的修改与新建
可以显式的指定数组的下标来修改一个已有数组。通过在方括号内指定键名来给数组赋值。也可以省略键名,在这种情况下给变量名加上一对空的方括号([])。
$arr[key] = value; $arr[] = value; // key可以是integer或string类型 // value可以是任意类型
以上代码中,如果$arr
不存在,将会新建一个,这也是另一种新建数组的方法。但并不推荐这样做,因为如果$arr
已经有值,则此值会保留而[]实际上代表着字符串访问运算符。
要修改某个值,通过其键名给该单元赋一个新值即可。要删除某键值对,对齐调用unset()函数。
Object对象型
对象(object)就是类的实例。当一个类被实例化以后,这个被生成的对象被传递给一个变量,这个变量就是对象型变量。对象型变量也属于资源型变量。
对象初始化
要创建一个新的对象object,使用new语句实例化一个类:
<?phpclass foo { function do_foo() { echo "Doing foo."; }}$bar = new foo;$bar->do_foo();?>
以上代码中$bar
的类型就是object类型。
Resource资源类型
资源 resource 是一种特殊变量,保存了到外部资源的一个引用。资源是通过专门的函数来建立和使用的。(get_resource_type())
资源类型是十分特殊的数据类型。它表示PHP的扩展资源,可以是一个打开的文件,也可以是一个数据库连接,甚至可以是其他的数据类型。
释放资源
引用计数系统是 Zend 引擎的一部分,可以自动检测到一个资源不再被引用了(和 Java 一样)。这种情况下此资源使用的所有外部资源都会被垃圾回收系统释放。因此,很少需要手工释放内存。
持久数据库连接比较特殊,它们不会被垃圾回收系统销毁。
NULL类型
NULL类型是仅拥有NULL这个值的类型,表示一个变量没有值。这个类型用来标记一个变量为空。一个空字符串与NULL是不同的。在数据库存储时会把空字符串和NULL区分处理。NULL型在布尔判断时永远为false。很多情况下,在声明一个变量的时候可以直接赋值为NULL。
在下列情况下一个变量被认为是NULL:
Callback / Callable 类型
自PHP5.4起,可以用callable类型指定回调类型callback。
一些函数如 call_user_func() 或 usort() 可以接受用户自定义的回调函数作为参数。回调函数不止可以是简单函数,还可以是对象的方法,包括静态类方法。
数据类型之间的相互转换
数据从一种类型转换到另一种类型,就是数据类型转换。在PHP中,有两种常见的转换方式:自动数据类型转换和强制数据类型转换。
PHP 在变量定义中不需要(或不支持)明确的类型定义;变量类型是根据使用该变量的上下文所决定的。也就是说,如果把一个 string 值赋给变量
v
a
r
,
var,
var,var 就成了一个 string。如果又把一个integer 赋给 $var,那它就成了一个integer。
自动转换为 数组 的行为目前没有定义。
示例
<?php $foo = "1"; // $foo 是字符串 (ASCII 49)$foo *= 2; // $foo 现在是一个整数 (2)$foo = $foo * 1.3; // $foo 现在是一个浮点数 (2.6)$foo = 5 * "10 Little Piggies"; // $foo 是整数 (50)$foo = 5 * "10 Small Pigs"; // $foo 是整数 (50)?>
<?php $foo = 10; // 定义一个整型变量$bar = (boolean) $foo; // 强制转换为布尔型?>
允许的强制转换有:
(binary) 转换和 b 前缀转换支持为 PHP 5.2.1 新增。
<?php $binary = (binary)$string;$binary = b"binary string";?>
可以将变量放置在双引号中的方式来代替将变量转换成字符串:
<?php $foo = 10; //定义整型变量$str = "$foo"; // 强制转换为string类型$fst = (string)$foo; //强制转换为string类型// 输出 "they are the same"if ($fst === $str) { echo "they are the same";}?>ログイン後にコピー
在PHP中,如果要改变一个变量的类型,可以使用settype函数强制转换数据类型,基本语法如下:
Bool settype(var, string type)
其中type的可能值不能包含资源类型数据。
示例
<?php $var1 = 1.86; // 定义浮点型数据echo settype($var1, "int"); // 强制转换为整数输出?>
转换为布尔值
要明确地将一个值转换成 boolean,用 (bool) 或者 (boolean) 来强制转换。但是很多情况下不需要用强制转换,因为当运算符,函数或者流程控制结构需要一个 boolean 参数时,该值会被自动转换。
当转换为 boolean 时,以下值被认为是 FALSE:
所有其它值都被认为是 TRUE(包括任何资源 和 NAN)。
*** -1 和其它非零值(不论正负)一样,被认为是 TRUE! ***
<?phpvar_dump ((bool) ""); // bool(false)var_dump((bool) 1); // bool(true)var_dump((bool) -1); // bool(true)var_dump((bool) -2); // bool(true)var_dump((bool) "foo"); // bool(true)var_dump((bool) 2.3e5); // bool(true)var_dump((bool) array(12)); // bool(true)var_dump((bool) array()); // bool(false)var_dump((bool) "false"); // bool(true)?>
转换为整型
値を整数に明示的に変換するには、(int) または (integer) キャストを使用します。ただし、演算子、関数、またはフロー制御で整数パラメーターが必要な場合、値は自動的に変換されるため、ほとんどの場合、キャストは必要ありません。関数 intval() を使用して値を整数型に変換することもできます。
リソースを整数に変換すると、結果は、PHP ランタイムによってリソースに割り当てられた一意のリソース番号になります。
ブール値から変換
FALSE は 0 (ゼロ) を生成し、TRUE は 1 (1) を生成します。
浮動小数点数からの変換
浮動小数点数から整数に変換する場合、切り捨てとなります。
浮動小数点数が整数の範囲 (通常、32 ビット プラットフォームでは /- 2.15e 9 = 2^31、64 ビット プラットフォームでは /- 9.22e 18 = 2^63 (Windows を除く)) を超える場合、結果は正確な整数の結果を得るには精度が不十分であるため、未定義です。この場合、警告はなく、通知さえありません。
PHP 7.0.0 以降、NaN と Infinity は整数に変換されるときに未定義またはプラットフォームに依存しなくなり、ゼロになります。
文字列からの変換
文字列を数値として扱う場合、結果と型は次のようになります。
文字列に '.' 、 ' が含まれない場合e' または 'E' であり、その数値が整数の範囲 (PHP_INT_MAX で定義) 内にある場合、文字列は整数として扱われます。それ以外の場合はすべて、値は浮動小数点数として扱われます。
文字列の先頭によって値が決まります。文字列が有効な数値で始まる場合は、その数値が使用されます。それ以外の場合、その値は 0 (ゼロ) です。有効な値は、オプションの符号、その後に続く 1 つ以上の数字 (小数点を含む場合もあります)、およびオプションの指数部分で構成されます。指数部は、「e」または「E」の後に 1 つ以上の数字が続くもので構成されます。
他の型からの変換
他の型から整数への変換の動作は定義されていません。予告なく変更される可能性があるため、既存の動作に依存しないでください。
浮動小数点数への変換
文字列型以外の値については、値を整数に変換してから変換する場合と同様の状況になります。浮動小数点に変換します。 PHP 5 では、オブジェクトを浮動小数点数に変換しようとすると、E_NOTICE エラー メッセージが発行されます。
文字列に変換
値を文字列に変換するには、値の前に (string) を付けるか、strval() 関数を使用します。文字列を予期する式では、文字列は自動的に文字列に変換されます。この変換は、たとえば、関数 echo または print を使用するとき、または変数を文字列と比較するときに発生します。
ブール値 TRUE は、文字列「1」に変換されます。ブール値 FALSE は "" (空の文字列) に変換されます。この変換はブール値と文字列の間で実行できます。
整数または浮動小数点は、数値リテラル形式の文字列 (浮動小数点の指数部分を含む) に変換されます。指数表記 (4.1E 6) を使用した浮動小数点数も変換されます。
Array 配列は常に文字列「Array」に変換されるため、echo や print では配列の内容を表示できません。特定の単位を表示するには、echo $arr[‘foo’] 構造体を使用できます。
PHP 4 では、オブジェクト object は常に文字列 "Object" に変換されます。オブジェクトのクラスの名前を取得するには、get_class() 関数を使用できます。 PHP 5 以降、必要に応じて __toString メソッドを使用できます。
リソース resource は常に「リソース ID #1」の構造を持つ文字列に変換されます。1 は実行時に PHP によってリソースに割り当てられる一意の値です。この構造は変更される可能性があるため、依存しないでください。リソースのタイプを取得するには、関数 get_resource_type() を使用できます。
NULL は常に空の文字列に変換されます。
配列、オブジェクト、またはリソースを文字列に直接変換しても、その型以外の有益な情報は得られません。これらのタイプのコンテンツは、関数 print_r() および var_dump() を使用してリストできます。
ほとんどの PHP 値は、永続的に保存するために文字列に変換できます。これはシリアル化と呼ばれ、関数 Serialize() を使用して実現できます。 PHP エンジンが WDDX をサポートするように構成されている場合、PHP 値を整形式の XML テキストにシリアル化することもできます。
对于任意 integer,float,string,boolean 和 resource 类型,如果将一个值转换为数组,将得到一个仅有一个元素的数组,其下标为 0,该元素即为此标量的值。换句话说,(array) s c a l a r V a l u e 与 a r r a y ( scalarValue 与 array( scalarValue与array(scalarValue) 完全一样。
如果一个 object 类型转换为 array,则结果为一个数组,其单元为该对象的属性。键名将为成员变量名,不过有几点例外:整数属性不可访问;私有变量前会加上类名作前缀;保护变量前会加上一个 ‘*’ 做前缀。这些前缀的前后都各有一个 NULL 字符。这会导致一些不可预知的行为:
<?phpclass A { private $A; // 这将变成'\0A\0A'}class B extends A { private $A; // 它将变成'\0B\0A' public $AA; // 它将变成‘AA’}var_dump((array) new B());?>
以上代码输出结果为:
将 NULL 转换为 array 会得到一个空的数组。
可以用 array_diff() 和数组运算符来比较数组。
转换为对象
如果将一个对象转换成对象,它将不会有任何变化。如果其它任何类型的值被转换成对象,将会创建一个内置类stdClass的实例。如果该值为NULL,则新的实例为空。 array转换成object将使键名成为属性名并具有相对应的值。
<?php $obj = (object)array('1' => 'foo');// PHP7.2之后的版本输出'bool(tru)',之前版本会输出'bool(false)'var_dump(isset($obj->{'1'}));var_dump(key($obj)); //PHP7.2后输出'string(1) "1"',之前输出'int(1)'?>
对于其他值,会包含进成员变量名 scalar。
<?php $obj = (object)'ciao';echo $obj->scalar; // 输出'ciao'?>
转换为资源
由于资源类型变量保存有为打开文件、数据库连接、图形画布区域等的特殊句柄,因此将其它类型的值转换为资源没有意义。
转换到NULL
使用(unset)$var将一个变量转换为NULL将不会删除该变量或者unset其值。仅是返回NULL值而已。
标量类型的声明
在默认情况下,所有的PHP文件都处于弱类型校验模式。PHP7加了标量类型声明特性,标量类型声明有两种模式:强制模式(默认)和严格模式。
标量类型声明语法格式如下:
declare(strict_types=1);
PHP默认情况下是弱类型校验模式,在php7下declare新增了strict_types指令,通过设置strict_types的值(1或者0),1表示严格类型校验模式,作用于函数调用和返回语句;0表示弱类型校验模式。默认为强制模式,即弱类型校验模式
可以声明标量类型的参数类型包括int、float、bool、string、interfaces、array和callable。
注意:
declare(strict_types=1)
必须是文件的第一个语句。如果这个语句出现在文件的其他地方,将会产生一个编译错误,块模式是被严格禁止的。
<?php // 默认情况function sum(int $ints){ return array_sum($ints);}print(sum(2, '3', 4.1));
以上程序输出结果为9.代码中的4.1先转换为整数4,然后再进行相加操作。
<?php // 严格模式declare(strict_types=1);function sum(int $ints) { return array_sum($ints);}print(sum(2, '3', 4.1));?>
以上程序采用了严格模式,因此如果参数中出现的不是整数类型,程序执行时就会报错。
运算符
算术运算符
算术运算符是最简单、最常用的的运算符。常见的算术运算符如下表:
演算子 | 名前 | 結果 | |
---|---|---|---|
- | 負の演算子 | $a | |
## の負の値 | #加算演算子 | ある そして と、 a および b および | |
- | 減算演算子 | ある そして と、 a と b# の違い | ##$a * $b|
#乗算演算子 | ある そして と、 a と b# の積##$a / $b | ||
除算演算子 | ある そして と、 | #a と #b# の商##$a % $b% | |
ある 取り除く による aを除算する | a を ## に割りますb | ||
$a の残り ** $b | ** | Power 演算子 | この演算子は PHP5.6 からのものです。結果は # です ある の a の b |
代入演算子
基本的な代入演算子 (=) は、特定のデータ値を特定の変数にロードするために使用されます。つまり、式の値を変数に代入します。右を左のオペランドに変換します。 組み合わせ代入演算子。式でその値を使用し、その値に式の結果を代入できます。たとえば、
$a = 5 (
$a = $a 5# と同等) ##.
## = | 左側の値と右側の値を加算した値を左側の変数に代入します。 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-= | 左側の値から上の値を引いた値を代入します。右を左の変数に代入 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#*= | 左の値に右の値を乗算し、それを左の変数に代入します | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/= | 左側の値を右側の値で除算し、左側の変数に代入します | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.= | 左側の文字列を右に接続します。 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
%= | 左側の値の残りを右側の値を左側の変数へ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# ビット単位の演算子 ビット単位の演算子を使用すると、整数内の指定されたビットの評価と演算が可能になります。一般的なビット演算子は次のとおりです。
ディスプレイスメントは、PHP の数学演算です。いずれかの方向に移動されたビットは破棄されます。左にシフトすると、右側にゼロが埋め込まれ、符号ビットが移動されます。これは、符号が保持されないことを意味します。右にシフトすると、左側に符号ビットが埋め込まれます。これは、符号が保持されることを意味します。 比較演算子 比較演算子は、両端のデータ値の大小を比較するために使用されます。比較演算子の具体的な意味は次のとおりです。
如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。此规则也适用于 switch 语句。当用 === 或 !== 进行比较时则不进行类型转换,因为此时类型和数值都要比对。 <?php // Integersecho 1 <=> 1; // 0echo "<br>";echo 1 2; // -1echo "<br>";echo 2 1; //1echo "<br>";// Floatsecho 1.5 1.5; // 0echo "<br>";echo 1.5 2.5; // -1echo "<br>";echo 2.5 1.5; // 1echo "<br>";// Stringsecho "a" "a"; //0echo "<br>";echo "a" "b"; // -1echo "<br>";echo "b" "a"; // 1echo "<br>";echo "a" "aa"; // -1echo "<br>";echo "zz" "aa"; // 1echo "<br>";// Arraysecho [] []; // 0echo "<br>";echo [1, 2, 3] [1, 2, 3]; // 0echo "<br>";echo [1, 2, 3] []; // 1echo "<br>";echo [1, 2, 3] [1, 2, 1]; // 1echo "<br>";echo [1, 2, 3] [1, 2, 4]; // -1echo "<br>";// Objects$a = (object)["a" => "b"];$b = (object)["a" => "b"];echo $a $b; // 0echo "<br>";$a = (object)["a" => "b"];$b = (object)["a" => "c"];echo $a $b; // -1echo "<br>";$a = (object)["a" => "c"];$b = (object)["a" => "b"];echo $a $b; // 1echo "<br>";// 只进行值的比较$a = (object)["a" => "b"];$b = (object)["b" => "b"];echo $a $b; // 1echo "<br>";?> ログイン後にコピー 对于多种类型,比较运算符根据下表比较(按顺序)。
インクリメント/デクリメント演算子 PHP は、C スタイルのプリ/ポストインクリメント演算子およびデクリメント演算子をサポートしています。
|
以上がPHP7言語の基礎を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。