声明PHP脚本的方式
最常用
?>
短标记风格,需要在 php.ini 配置文件内 将 short_open_tag 设置为 ON ,然后重启
<% %>
ASP风格, 需要在 php.ini 配置文件内 将 asp_tag 设置为 ON ,然后重启
: 脚本风格,基本用不到
= ?>
: 嵌入表达式
嵌入HTML
PHP和JSP类似,可以和HTML嵌套使用
>
大家好,我的名字是
我的年龄是: = $age; ?> 岁
= 18) {?>
我成年了
我未成年
= 18) :?>
我可以去网吧
我还不能去网吧
PHP Web 的本质
其实 php 响应请求,就是一个输出IO流的过程; PHP解析器会将.php文件的内容解析执行后,将结果返回给客户端;
如下示例
将会被解析成如下php代码
echo '';
// 定义变量
$name = "张三";
$age = 18;
echo '';
//嵌入PHP代码
echo '';
echo '标题';
echo ' ';
echo '';
执行后,将结果返回给客户端
标题
所以.PHP可以和任何文本嵌套,本质就是 echo 输出
结尾空行的问题
在开发中会遇到尾行后换行的问题,如下代码,我们长时间的开发习惯,会在尾行多输出几个空行;
## 下面是开发习惯多出来的空行
会被解析成为如下代码
echo 'test';
echo 'n';
echo 'n';
如果客户端是严格解析,(如:JSON),客户端则会产生解析错误.
所以,开发中要注意到这一点,在 ?>
php文件结尾后,不要有多余的空行。
如果 一个 .php 文件中,全部都是 php代码,没有其他的文本,则可以忽略 ?>
,这样就不用担心结尾换行的习惯问题了;
# demo: exception.php
,下面的换行没事,不会被PHP解析 */
总结: ?>
结尾后的空白行 会被当做空字符串输出到客户端,可能导致客户端解析出现莫名其妙的错误。
所以,当客户端对空白字符串(空白行)敏感的时候(如API返回JSON的场景时),就应该注意空白行的问题。
或可以直接忽略结尾,忽略结尾的前提是 该PHP文件只有PHP的代码,不会和其他模板(HTML等)混合嵌套编程。
注释
# 行注释
/*多行注释*/
// 行注释
变量
PHP的变量名区分大小写,多个变量大小写不一样为不同的变量;
变量可以改变类型,和javascript等其他脚本语言类似;
$foo = 'Bob';
echo $foo; // 输出: Bob
$foo = 13 ;
echo $foo; // 输出: 13
$foo = new stdClass();
var_dump($foo);
默认值
虽然在 PHP 中并不强制需要先使用前,声明和初始化变量,但对变量进行初始化是个好习惯。
未初始化的变量具有其类型的默认值,下面列出每个类型的默认值:
Boolean: 默认值是 FALSE
整形和浮点型: 默认值是0
字符串型:默认值是 空字符串
数组变量 : 默认值是空数组
对象变量: 默认值是 new stdClass
// 输出NULL,没有被用作任何地方,无法推断出类型,所以为NULL
var_dump($unset_var);
// $unset_bool 变量在下面的表达式中被用作 Boolean ,所以PHP推断其为 Boolean 类型,但由于它没有声明和初始化,所以采用其默认值 FLASE
// 输出false
echo($unset_bool ? "true\n" : "false\n");
// $unset_str 变量在下面的表达式中被用作 String ,所以PHP推断其为 String 类型,但由于它没有声明和初始化,所以采用其默认值 空字符串
// 输出 abc
$unset_str .= 'abc';
var_dump($unset_str);
// $unset_int 变量在下面的表达式中被用作 int ,所以PHP推断其为 int 类型,但由于它没有声明和初始化,所以采用其默认值 0
// 输出 25
$unset_int += 25; // 0 + 25 => 25
var_dump($unset_int);
// $unset_int 变量在下面的表达式中被用作 float ,所以PHP推断其为 float 类型,但由于它没有声明和初始化,所以采用其默认值 0
// 输出 1.25
$unset_float += 1.25;
var_dump($unset_float);
// $unset_arr 变量在下面的表达式中被用作 Array ,所以PHP推断其为 Array 类型,但由于它没有声明和初始化,所以采用其默认值 空数组
$unset_arr[3] = "def"; // array() + array(3 => "def") => array(3 => "def")
var_dump($unset_arr);
// $unset_obj 变量在下面的表达式中被用作 object ,所以PHP推断其为 object 类型,但由于它没有声明和初始化,所以采用其默认值 new stdClass
$unset_obj->foo = 'bar';
var_dump($unset_obj); // 输出 object(stdClass)#1 (1) { ["foo"]=> string(3) "bar" }
建议一定要在变量使用前进行声明与初始化,使用未声明初始化的变量在较新的PHP版本会产生 **Notice** 通知
isset
isset() 检测变量是否声明,并且不是 NULL。
如果已经使用 unset() 释放了一个变量之后,它将不再是 isset()。若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE。
字符("\0")并不等同于 PHP 的 NULL
如果一次传入多个参数,那么 isset() 会根据根据参数,从左到右依次 isset(),全部都是 isset()则返回TRUE,如果发现非 isset() 则返回FALSE。
unset
清除释放一个变量;
// 销毁单个变量
unset ($foo);
// 销毁单个数组元素
unset ($bar['quux']);
// 销毁一个以上的变量
unset($foo1, $foo2, $foo3);
可变变量
可变变量名的作用: 动态的拼凑变量名,引用该变量;
简单的案例:
$abc = "abcdefg";
$one = "abc";
$abcdefg = "final";
echo $$one; // $one => 'abc' ; $$one = $abc = "abcdefg"
echo $$$one; // $one => 'abc' ; $$one ="abcdefg" ; $$$one = $abcdefg = 'final'
复杂的案例:
和数组、对象一起使用
class foo {
var $bar = 'I am bar.';
var $r = 'I am r.';
}
$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo $foo->$bar . "\n"; // $foo -> $bar => $foo->bar => I am bar .
echo $foo->$baz[1] . "\n"; // $foo -> $baz[1] => $foo->bar => I am bar .
$start = 'b';
$end = 'ar';
echo $foo->{$start . $end} . "\n";// => $foo->bar => I am bar .
$arr = 'arr';
echo $foo->$arr[1] . "\n"; // => $foo->r => I am r .
echo $foo->{$arr}[1] . "\n"; // => ($foo->arr)[1] => I am B .
要将可变变量用于数组,必须解决一个模棱两可的问题。
这就是当写下 $$a[1]
时,
是想要 $a[1]
作为一个变量呢,
还是想要 $$a
作为一个变量,然后取出该变量中索引为 [1]
的值。
解决此问题的语法是,对第一种情况用 ${$a[1]}
,对第二种情况用 ${$a}[1]
。
$A = "zhangsan";
$arr = array('A', 'I am B.', 'I am C.');
echo ${$arr[0]}; // => $A => 输出 zhangsan
$name= 'arr';
echo ${$name}[0]; // => $arr[0] => 输出 A
变量的使用范围
超全局变量
静态变量
常量
const 和 define 的区别
魔术常量
类型转换
引用
变量相关函数
file:///E:/php-chunked-xhtml/ref.var.html