1.变量作用域
php变量有四种作用域:局部作用域、全局作用域,静态作用域、参数作用域
- 在局部调用全局变量需要使用 global声明变量
- 在全局使用局部变量需要使用$GLOBALS['变量名'] 注册全局变量
- 如果在方法中需要保存某变量的值可以使用静态变量static声明
- 调用方法是传参可以多但是不能少
超级全局变量
- $GLOBALS:全部变量的全局组合数组。变量的名字就是数组的键。
- $_SERVER: 包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。
- $_REQUEST: 用于收集HTML表单提交的数据。
- $_POST: 收集表单数据,在HTML form标签的指定该属性:"method="post"
- $_GET: 收集表单数据,在HTML form标签的指定该属性:"method="get"
- $_COOKIE:cookie 是一种服务器留在用户计算机上的小文件。每当同一台计算机通过浏览器请求页面时,这台计算机将会发送 cookie。通过 PHP,您能够创建并取回 cookie 的值。
- $_FILES:上传文件时,用于服务器端需要获得该文件的相关信息。
- $_ENV:包含服务器端环境变量的数组。
- $_SESSION: session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置。Session 变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的。
2.打印输出
- echo:可以输出一个或多个字符串,没有返回值。
- print:只允许输出一个字符串,有返回值 1 。
- print_r:可以打印标量和复合数据类型,可以通过print_r($str,true)来使print_r不输出而返回print_r处理后的值
- var_dump():输出变量的内容、类型或字符串的内容、类型、长度。常用来调试。
提示:echo和print是语句不是函数,echo 输出的速度比 print 快, 不能输出数组和对象,只能打印简单类型(如int,string)。print_r和var_dump()是函数
echo PHP_EOL;// PHP_EOL是换行符
3.数据类型
标量数据类型:String(字符串), Integer(整型), Float(浮点型), Boolean(布尔型)
复合数据类型: Array(数组), Object(对象)
特殊数据类型:resource(资源), NULL(空值)
常量:整个脚本中都可以使用。可使用 define() 函数设置常量。
define(string constant_name, mixed value, case_sensitive = true)
4.运算符
算数运算符:+(加),-(减),*(乘),/(除),%(模,除法的余数),-x(取反) ,.(并置,拼接)
赋值运算符:=(赋值),+=(加等),-=(减等),*=(乘等),/=(除等), %=(模等),.=(拼接后赋值)
x = x + y; // +可替换为其他算数运算符
递增/递减运算符:x++(后递增),++x(预递增),x--(后递减),--x(预递减)
比较运算符:==(等于),===(绝对等于),!=(不等于),<> (不等于),!==(绝对不等于),>(大于),<(小于),>=(大于等于),<=(小于等于)
逻辑运算符:and(与),or(或),xor(异或),&&(与),||(或),!(非)
数组运算符:+(数组集合),==(相等),=== (恒等),!=(不相等),<>(不相等),!== (不恒等)
三元运算符:条件?是 :否;
(expr1) ? (expr2) : (expr3)
// 自 PHP 5.3 起,可以省略三元运算符中间那部分。表达式 expr1 ?: expr3 在 expr1 求值为 TRUE 时返回 expr1,否则返回 expr3。
// 在 PHP7+ 版本多了一个 NULL 合并运算符 ??,实例如下:
$username = $_GET['user'] ?? 'nobody';// 如果 $_GET['user'] 不存在返回 'nobody',否则返回 $_GET['user'] 的值
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';// 类似的三元运算符
组合比较符(PHP7+): <=>(也称之为太空船操作符)
$c = $a <=> $b;
如果 $a > $b, 则 $c 的值为 1。
如果 $a == $b, 则 $c 的值为 0。
如果 $a < $b, 则 $c 的值为 -1。
5.八大魔术变量
- __LINE__: 文件中的当前行号。
- __FILE__:文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。
- __DIR__:文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。
- __FUNCTION__:函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。
- __CLASS__ :类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。
- __METHOD__:类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
- __NAMESPACE__:当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增)。
- __TRAIT__: Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。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(); // Hello World!
?>
6.魔术方法
以下是几个常用的魔术方法:
__construct()和__destruct():构造函数和析构函数,类初始化时和类销毁时调用。
__get()和__set():访问和设置类不存在的成员变量时调用的。
__isset()和__unset():当使用isset()和unset()函数调用时判断或销毁变量时调用的。
__call():当调用类中不存在的方法。
__clone():使用clone复制对象时调用。
__tosring():当类变成字符串时调用。
__sleep()和__wakeup():序列化类的时候调用的。当序列化对象时,php将试图在序列动作之前调用该对象的成员函数__sleep(), 当使用unserialize() 恢复对象时, 将调用__wakeup()。
__debuginfo():打印所调试信息时调用。
7.命名空间
PHP 命名空间(namespace)是在PHP 5.3中加入的,如果你学过C#和Java,那命名空间就不算什么新事物。 不过在PHP当中还是有着相当重要的意义。
PHP 命名空间可以解决以下两类问题:
- 用户代码与PHP内部的类/函数/常量之间的名字冲突。
- 创建别名(或简短)的名称,提高源代码的可读性。
默认情况下,所有常量、类和函数名都放在全局空间下,就和PHP支持命名空间之前一样。
如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间
< ?php
// 定义代码在 'MyProject' 命名空间中
namespace MyProject;
// ... 代码 ...
//也可以在同一个文件中定义不同的命名空间代码
namespace MyProject1;
// MyProject1 命名空间中的PHP代码
namespace MyProject2;
// MyProject2 命名空间中的PHP代码
// 另一种语法
namespace MyProject3 {
// MyProject3 命名空间中的PHP代码
}
在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前。
命名空间使用:
-
非限定名称,或不包含前缀的类名称,例如 $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。带绝对命名空间前缀的引用(类似绝对路径) 引用路径已明确 不用查找
<?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 对象
?>
网友评论