PHP は 8 つのプリミティブ データ型をサポートしています。
4 つのスカラー型:
boolean (ブール、大文字と小文字を区別しない)
integer (整数)
float (浮動小数点、double とも呼ばれる)
文字列(ストリング)
2 つの複合タイプ:
array (配列)
object (オブジェクト)
<?php $a = array(1, 2, array("a", "b", "c"));var_dump($a);$b = 3.1;$c = true;var_dump($b, $c);
そうですね
デバッグ用にわかりやすい型式を取得したいだけの場合は、gettype() 関数を使用してください。型を確認するには、gettype() を使用せず、is_type 関数を使用します。 is_type を使用してパラメータをフィルタリングします。変数を特定の型に強制したい場合は、cast または settype() 関数を使用できます。変数は、その時点の型に応じて、特定の状況では異なる値を取る可能性があることに注意してください。
boolean ブール型
次のプログラムは、ブール型変換についての理解を深めることができます。
array (size=3) 0 => int 1 1 => int 2 2 => array (size=3) 0 => string 'a' (length=1) 1 => string 'b' (length=1) 2 => string 'c' (length=1)float 3.1boolean true
16進数表現を使用するには、数値の前に0xを追加する必要があります。
2進数表現を使用するには、数値の前に0bを追加する必要があります。
バイナリで表現された整数は、PHP 5.4.0 以降で使用できます。
<?php var_dump((bool) array()); // boolean falsevar_dump((bool) ""); // boolean falsevar_dump((bool) "0"); // boolean falsevar_dump((bool) "00"); // boolean truevar_dump((bool) "false"); // boolean truevar_dump((bool) (new stdClass())); // boolean truevar_dump((bool) ((object) array())); // boolean true
指定された数値が整数の範囲を超える場合、それは浮動小数点として解釈されます。同様に、演算結果が整数の範囲を超える場合は浮動小数点数が返されます。
PHP には整数の除算演算子はありません。 1/2 は float 0.5 を生成します。値は、小数部分を破棄して整数にキャストすることも、より適切に丸めるためにround()関数を使用することもできます。
マニュアルには、予期しない結果が生じる可能性があるため、未知の分数を整数にキャストしないようにと記載されています。
<?php var_dump(PHP_INT_SIZE); // int 4var_dump(PHP_INT_MAX); // int 2147483647var_dump(01090); // int 8 八进制 010 = 十进制 8
float 型
string string
文字列には 4 つの文法表現があります:
他のバックスラッシュはバックスラッシュ自体として扱われます。
ただし、一重引用符で囲まれた文字列にバックスラッシュが 1 つしかない場合、バックスラッシュも出力されます。これはなぜでしょうか。
二重引用符
一重引用符と二重引用符の両方で、複数行の文字列入力がサポートされています。
ヒアドキュメント構造
構造はおおよそ次のとおりです:
演算子 <<< の後に識別子が続き、その後に改行が続きます。次は文字列そのものです。
最後に、以前に定義した識別子を終了マークとして使用します。
最後に引用された識別子は行の最初の列になければなりません。つまり、識別子はインデントできず、行にはセミコロン (;) を除いて他の文字が含まれていてはなりません。
Heredocs 構造体を使用してクラス プロパティを初期化することはできません。 PHP 5.3 以降、この制限はヒアドキュメントに変数が含まれている場合にのみ機能します。
ヒアドキュメントの構造は二重引用符のない二重引用符で囲まれた文字列のようなもので、エスケープ規則は二重引用符と同じです。
nowdoc 構造
就象heredoc结构类似于双引号字符串,nowdoc结构是类似于单引号字符串的。nowdoc中不进行解析操作。这种结构很适合用于嵌入PHP代码或其它大段文本而无需对其中的特殊字符进行转义。nowdoc结构可以用在任意的静态数据环境中,最典型的示例是用来初始化类的属性或常量。
变量解析有两种语法规则,一种是简单规则,一种是复杂规则。简单规则最常用、最方便,这里详细学习一下复杂语法规则。复杂规则语法的显著标记是用花括号包围的表达式。
复杂语法不是因为其语法复杂而得名,而是因为它可以使用复杂的表达式。 由于{无法被转义,只有$紧挨着{时才会被识别。
可以以数组形式访问字符串,用超出字符串长度的下标写入将会拉长该字符串并以空格填充。非整数类型下标会被转换成整数。写入时只用到了赋值字符串的第一个字符。用空字符串赋值则赋给的值是NULL字符。PHP的字符串在内部是字节组成的数组。因此用花括号访问或修改字符串对多字节字符集很不安全。
字符串可以用 '.'(点)运算符连接起来,注意 '+'(加号)运算符没有这个功能。
一个布尔值boolean的TRUE被转换成string的"1"。boolean的FALSE被转换成""(空字符串)。字符串转换为数值,该字符串的开始部分决定了它的值。如果该字符串以合法的数值开始,则使用该数值。否则其值为 0(零)。
PHP的优势就体现在字符串处理的方便上,对于string的操作有很多有用的函数,可以运用各种函数,还有正则表达式。
PHP 并不特别指明字符串的编码,字符串会被按照该脚本文件相同的编码方式来编码。因此,操作文本的函数必须假定字符串是如何编码的。不幸的是,PHP关于此的函数有很多变种,关于PHP的字符串处理函数还需多加学习。
PHP中的数组实际上是一个有序映射,映射是一种把values关联到keys的类型。
可以用array()语言结构来新建一个数组。它接受任意数量用逗号分隔的“键(key)=>值(value)对”。自5.4起可以使用短数组定义语法,用[]替代array()。key可以是integer或者string,value可以是任意类型。
key会有如下的强制转换和规则:
包含有合法整型值的字符串会被转换为整型。
浮点数也会被转换为整型,意味着其小数部分会被舍去。
布尔值也会被转换成整型。
null会被转换为空字符串,即键名null实际会被储存为""。
数组和对象不能被用为键名。
如果在数组定义中多个单元都使用了同一个键名,则只使用了最后一个,之前的都被覆盖了。
如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是该值加一。
<?php $a = array('20' => 'a', '02' => 'b');var_dump($a);
通过上面的规则可知,这段代码的输出结果如下:
array (size=2) 20 => string 'a' (length=1) '02' => string 'b' (length=1)
如果给出方括号但没有指定键名,则取当前最大整数索引值,新的键名将是该值加上1(但是最小为0)。要删除某键值对,对其调用unset()函数,该函数允许删除数组中的某个键,但要注意数组将不会重建索引。
<?php $a = array('a', 'b' => 'b');$a[] = 'c';var_dump($a);unset($a[1]);var_dump($a);
对于上面这段程序,输出为:
array (size=3) 0 => string 'a' (length=1) 'b' => string 'b' (length=1) 1 => string 'c' (length=1)array (size=2) 0 => string 'a' (length=1) 'b' => string 'b' (length=1)
应该始终在用字符串表示的数组索引上加上引号。例如用$foo['bar']而不是$foo[bar]。此代码中有一个未定义的常量(bar)而不是字符串('bar'-注意引号),而 PHP 可能会在以后定义此常量。
foreach控制结构是专门用于数组的。它提供了一个简单的方法来遍历数组。
下面的示例程序,通过读取目录填充数组,这里涉及到几个函数的使用。
<?php $handle = opendir('.');while(false !== ($file = readdir($handle))) { $files[] = $file;}closedir($handle);var_dump($files);
对于任意integer,float,string,boolean和resource类型,如果将一个值转换为数组,将得到一个仅有一个元素的数组,其下标为 0,该元素即为此标量的值。
要创建一个新的对象 object,使用 new 语句实例化一个类。
如果将一个对象转换成对象,它将不会有任何变化。如果其它任何类型的值被转换成对象,将会创建一个内置类 stdClass 的实例。如果该值为 NULL,则新的实例为空。数组转换成对象将使键名成为属性名并具有相对应的值。对于任何其它的值,名为 scalar 的成员变量将包含该值。
<?php class foo { function do_foo() { echo 'Doint foo.'; }}$bar = new foo;$bar->do_foo();var_dump($bar);$obj = (object) 'hello';var_dump($obj);
上面的示例程序输出结果为:
Doint foo.object(foo)[1]object(stdClass)[2] public 'scalar' => string 'hello' (length=5)
资源resource是一种特殊变量,保存了到外部资源的一个引用。资源使用的所有外部资源都会被垃圾回收系统释放,很少需要手工释放内存。但是,持久数据库连接比较特殊,它们不会被垃圾回收系统销毁。
NULL类型只有一个值,就是不区分大小写的常量NULL。
第一次接触到这个概念,有点陌生。
自PHP 5.4起可用callable类型指定回调类型callback。
手册示例程序中使用了很多call_user_func函数,先把这函数理一下。call_user_func把第一个参数作为回调函数(callback),并且将其余的参数作为回调函数的参数。返回回调函数的返回值,如果错误则返回FALSE。
回调函数可以是简单函数、对象方法、静态类方法,回调函数的几种使用方法如下所示:
调用用户自定义的简单函数,以string类型传递其名称。
<?php function my_callback_function() { echo 'hello, world.';}call_user_func('my_callback_function');
调用类的静态成员方法,类及方法被作为数组传递,下标0包含该对象,下标1包含方法名。
<?php class MyClass { static function myCallbackMethod() { echo 'Hello, world.'; }}call_user_func(array('MyClass', 'myCallbackMethod'));
调用已实例化的对象方法。
<?php class MyClass { static function myCallbackMethod() { echo 'Hello, world.'; }}$obj = new MyClass;call_user_func(array($obj, 'myCallbackMethod'));
调用静态类方法。
<?php class MyClass { static function myCallbackMethod() { echo 'Hello, world.'; }}call_user_func('MyClass::myCallbackMethod');
调用父类静态成员方法。
<?php class A { public static function who() { echo "A\n"; }}class B extends A { public static function who() { echo "B\n"; }}call_user_func(array('B', 'parent::who'));
除了普通的用户自定义函数外,create_function()可以用来创建一个匿名回调函数。
PHP是弱类型语言,变量类型根据使用该变量的上下文所决定的。
(全文完)