PHP 会根据变量的值,自动把变量转换为精确的数据类型。

在强类型的编程措辞中,我们必须在利用变量前先声明(定义)变量的类型和名称

在所有函数外部定义的变量,拥有全局浸染域。
除了函数外,全局变量可以被脚本中的任何部分访问,要在一个函数中访问一个全局变量,须要利用 global 关键字。

php在国外的别称php冷僻常识点基本认知 HTML

当一个函数完成时,它的所有变量常日都会被删除。
然而,有时候您希望某个局部变量不要被删除。

要做到这一点,请在您第一次声明变量时利用 static 关键字:

PHP EOF(heredoc) 利用解释1. 必须后接分号,否则编译通不过。
2. EOF 可以用任意其它字符代替,只需担保结束标识与开始标识同等。
3. 结束标识必须顶格独自占一行(即必须从行首开始,前后不能衔接任何空缺和字符)。
4. 开始标识可以不带引号或带单双引号,不带引号与带双引号效果同等,阐明内嵌的变量和转义符号,带单引号则不阐明内嵌的变量和转义符号。
5. 当内容须要内嵌引号(单引号或双引号)时,不须要加转义符,本身对单双引号转义,此处相称与q和qq的用法。
1.以 <<<EOF 开始标记开始,以 EOF 结束标记结束,结束标记必须顶头写,不能有缩进和空格,且在结束标记末端要有分号 。
2.开始标记和结束标记相同,比如常用大写的 EOT、EOD、EOF 来表示,但是不但限于那几个(也可以用:JSON、HTML等),只要担保开始标记和结束标记不在正文中涌现即可。
3.位于开始标记和结束标记之间的变量可以被正常解析,但是函数则不可以。
在 heredoc 中,变量不须要用连接符 . 或 , 来拼接

整型可以用三种格式来指定:十进制, 十六进制( 以 0x 为前缀)或八进制(前缀为 0)。

可以通过设置变量值为 NULL 来清空变量数据:

一个常量由英笔墨母、下划线、和数字组成,但数字不能作为首字母涌现。
(常量名不须要加 $ 润色符)。

把稳: 常量在全体脚本中都可以利用。

strpos() 函数用于在字符串内查找一个字符或一段指定的文本。

如果在字符串中找到匹配,该函数会返回第一个匹配的字符位置。
如果未找到匹配,则返回 FALSE。

自 PHP 5.3 起,可以省略三元运算符中间那部分。
表达式 expr1 ?: expr3 在 expr1 求值为 TRUE 时返回 expr1,否则返回 expr3。

把稳:PHP_EOL 是一个换行符,兼容更大平台。

运算符的等级

必须要把稳的是 elseif 与 else if 只有在利用花括号的情形下才认为是完备相同。
如果用冒号来定义 if/elseif 条件,那就不能用两个单词的 else if,否则 PHP 会产生解析缺点。
详见 http://php.net/manual/zh/control-structures.elseif.php

数值数组 - 带有数字 ID 键的数组关联数组 - 带有指定的键的数组,每个键关联一个值多维数组 - 包含一个或多个数组的数组sort() - 对数组进行升序排列rsort() - 对数组进行降序排列asort() - 根据关联数组的值,对数组进行升序排列ksort() - 根据关联数组的键,对数组进行升序排列arsort() - 根据关联数组的值,对数组进行降序排列krsort() - 根据关联数组的键,对数组进行降序排列

PHP 超级全局变量列表:

$GLOBALS$_SERVER$_REQUEST$_POST$_GET$_FILES$_ENV$_COOKIE$_SESSION

do...while 语句

函数名称以字母或下划线开头(不能以数字开头)PHP 魔术常量

PHP 向它运行的任何脚本供应了大量的预定义常量。

不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会涌现,或者动态加载后,或者在编译时已经包括进去了。

有八个魔术常量它们的值随着它们在代码中的位置改变而改变。

例如 __LINE__ 的值就依赖于它在脚本中所处的行来决定。
这些分外的常量不区分大小写

__LINE__

__FILE__

__DIR__

__FUNCTION__

__CLASS__

__TRAIT__

__METHOD__

__NAMESPACE__

自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits

优先顺序是当前类中的方法会覆盖 trait 方法,而 trait 方法又覆盖了基类中的方法

PHP 命名空间(namespace)是在PHP 5.3中加入的

PHP 命名空间可以办理以下两类问题:

用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
为很长的标识符名称(常日是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。

如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间

在声明命名空间之前唯一合法的代码是用于定义源文件编码办法的 declare 语句

<?php

declare(encoding='UTF-8'); //定义多个命名空间和不包含在命名空间中的代码

namespace MyProject {

const CONNECT_OK = 1;

class Connection { / ... / }

function connect() { / ... / }

}

<html>

<?php

namespace MyProject; // 命名空间前涌现了“<html>” 会致命缺点 - 命名空间必须是程序脚本的第一条语句

?>

工具的3大特性:封装、继续,多态

public(公有):公有的类成员可以在任何地方被访问。
protected(受保护):受保护的类成员则可以被其自身以及其子类和父类访问。
private(私有):私有的类成员则只能被其定义所在的类访问。

PHP 不会在子类的布局方法中自动的调用父类的布局方法。
要实行父类的布局方法,须要在子类的布局方法中调用 parent::__construct(),但是如果子类没有布局方法的话会自动继续父类的布局方法

PHP 5 新增了一个 final 关键字。
如果父类中的方法被声明为 final,则子类无法覆盖该方法。
如果一个类被声明为 final,则不能被继续

声明类属性或方法为 static(静态),就可以不实例化类而直接访问。

静态属性不能通过一个类已实例化的工具来访问(但静态方法可以)。

由于静态方法不须要通过工具即可调用,以是伪变量 $this 在静态方法中不可用。

静态属性不可以由工具通过 -> 操作符来访问。

自 PHP 5.3.0 起,可以用一个变量来动态调用类。
但该变量的值不能为关键字 self,parent 或 static。

<?php

class Foo {

public static $my_static = 'foo';

public function staticValue() {

return self::$my_static;

}

public static function getValue() {

return self::$my_static;

}

}

print Foo::$my_static . PHP_EOL;

$foo = new Foo();

print $foo->staticValue() . PHP_EOL;

print $foo::staticValue() . PHP_EOL;

print $foo->getValue() . PHP_EOL;

print $foo::getValue() . PHP_EOL;

?>

可以把在类中始终保持不变的值定义为常量。
在定义和利用常量的时候不须要利用 $ 符号

接口

利用接口(interface),可以指定某个类必须实现哪些方法,但不须要定义这些方法的详细内容。

接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但个中定义所有的方法都是空的。

接口中定义的所有方法都必须是公有,这是接口的特性。

要实现一个接口,利用 implements 操作符。
类中必须实现接口中定义的所有方法,否则会报一个致命缺点。
类可以实现多个接口,用逗号来分隔多个接口的名称。

抽象类

任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。

定义为抽象的类不能被实例化。

被定义为抽象的方法只是声明了其调用办法(参数),不能定义其详细的功能实现。

继续一个抽象类的时候,子类必须定义父类中的所有抽象方法;其余,这些方法的访问掌握必须和父类中一样(或者更为宽松)。
例如某个抽象方法被声明为受保护的,那么子类中实现的方法就该当声明为受保护的或者公有的,而不能定义为私有的。

子类方法可以包含父类抽象方法中不存在的可选参数。

抽象类和接口的观点要分清楚,随意马虎稠浊

命名空间的理解有深度,须要花点力气学习下

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。

把稳访问任意全局类、函数或常量,都可以利用完备限定名称,例如 \strlen() 或 \Exception 或 \INI_ALL。

在命名空间内部访问全局类、函数和常量:

<?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

?>

关键字 namespace 可用来显式访问当前命名空间或子命名空间中的元素。
它等价于类中的 self 操作符。

namespace操作符,命名空间中的代码

<?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 命名空间支持 有两种利用别名或导入办法:为类名称利用别名,或为命名空间名称利用别名。

在PHP中,别名是通过操作符 use 来实现的. 下面是一个利用所有可能的三种导入办法的例子:

1、利用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 工具

?>

导入操作是在编译实行的,但动态的类名称、函数名称或常量名称则不是。

3、导入和动态名称

<?php

use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // 实例化一个 My\Full\Classname 工具

$a = 'Another';

$obj = new $a; // 实际化一个 Another 工具

?>

全局空间

如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间,与 PHP 引入命名空间观点前一样。
在名称前加上前缀 \ 表示该名称是全局空间中的名称,纵然该名称位于其它的命名空间中时也是如此。

利用全局空间解释

<?php

namespace A\B\C;

/ 这个函数是 A\B\C\fopen /

function fopen() {

/ ... /

$f = \fopen(...); // 调用全局的fopen函数

return $f;

}

?>

名称解析遵照下列规则:

对完备限定名称的函数,类和常量的调用在编译时解析。
例如 new \A\B 解析为类 A\B。
所有的非限定名称和限定名称(非完备限定名称)根据当前的导入规则在编译时进行转换。
例如,如果命名空间 A\B\C 被导入为 C,那么对 C\D\e() 的调用就会被转换为 A\B\C\D\e()。
在命名空间内部,所有的没有根据导入规则转换的限定名称均会在其前面加上当前的命名空间名称。
例如,在命名空间 A\B 内部调用 C\D\e(),则 C\D\e() 会被转换为 A\B\C\D\e() 。
非限定类名根据当前的导入规则在编译时转换(用全名代替短的导入名称)。
例如,如果命名空间 A\B\C 导入为C,则 new C() 被转换为 new A\B\C() 。
在命名空间内部(例如A\B),对非限定名称的函数调用是在运行时解析的。
例如对函数 foo() 的调用是这样解析的:在当前命名空间中查找名为 A\B\foo() 的函数考试测验查找并调用 全局(global) 空间中的函数 foo()。
在命名空间(例如A\B)内部对非限定名称或限定名称类(非完备限定名称)的调用是在运行时解析的。
下面是调用 new C() 及 new D\E() 的解析过程: new C()的解析:在当前命名空间中查找A\B\C类。
考试测验自动装载类A\B\C。
new D\E()的解析:在类名称前面加上当前命名空间名称变成:A\B\D\E,然后查找该类。
考试测验自动装载类 A\B\D\E。
为了引用全局命名空间中的全局类,必须利用完备限定名称 new \C()。