1.解惑
1.省略结束标签的便利性
php的结束标签是可以省略的,但前提是你只是用来写PHP,其中不包括html这些东西。不然会报出‘header has send’之类的错误。
2.empty、isset、isnull的区别
PHP提供三个用于测试变量的值的函数,分别是empty()、isset()、is_null()。都是返回布尔值。
isset用于检测变量是否声明且不 为NULL。不为NULL就返回真。
empty判断变量是否为空,空的定义:空字符串、false、空数组、NULL、0、‘,以及被unset删除后的变量。
is_null判断的是是否为NULL,是就返回真。只能对存在的变量进行判断
3.布尔值
PHP对布尔值是不区分大小写的
由于true等布尔值是一个常量,建议大写。 << 这个视情况而定。
4.变量作用域
PHP定义一个变量,在任何位置都可以存取访问,这就是‘全局变量’。而定义在函数或者类中的方法中的变量只能在函数内部访问,叫做局部变量。
使用局部变量可以使源代码易于管理。
PHP不允许从外部访问局部变量,所以可以在局部使用global声明一下该变量。
$globalname = 'xiao';
function hello() {
global $globalname;
}
5.多维数组排序
Q:数组排序PHP自带了一些sort() ksort() 等,但是无法对多维数组进行排序。
A:这里介绍一个排序函数叫做usort(),该函数可以根据用户自定义的函数进行排序。语法:usort(array,myfunction);
$a = [
[],
[],
[],
];
function my_compare($a, $b) {
if($a[1] < $[1]) {
return -1;
} elseif($a[1] == $[1]){
return 0;
} else {
return 1;
}
}
usort($a, 'my_compare');
##### 这里使用php7的新东西太空船运算符
function my_compared($a, $b) {
$res = $a[1] <=> $b[1];
}
### end
foreach($a as $elem) {
echo "elem[0] : $elem[1] <br />";
}
6.超全局数组
PHP内置了超全局数组
简写:
名称 | 功能 |
---|---|
_GET | |
_POST | |
_COOKIE | |
_SESSION | |
_EVN | |
_SERVER | |
_FILES | |
_REQUEST | |
GLOBALS |
7.global关键字和global数组的区别
$GLOBALS[] 数组似乎外部的全局变量本身。
global 关键字使外部变量同名引用或者指针。
如果你使用unset函数删除变量,会发现第一个被删除了,而第二个仍然可以输出。
8.活用静态变量
php脚本中的局部变量执行是存在的,但是执行过后就会立即删除,再次运行又会再次创建。好处是确保每次执行都是完整独立的,以免混乱。
如果想保存,那就创建静态变量。在变量前加上 static关键字。
function myFunction()
{
static $myVariable = 0;
}
静态变量在函数调用时会保存上次的值,但是执行后同样会被销毁。
9.require、require_once、include、include_once与autoload
include报错会继续执行
但是require会直接报错,终止。
千万不要将错误信息抛给用户。可以在代码中使用error_reporting(0)禁止所有的错误提示。
从性能角度来讲,使用require()要快于require_once,使用autoload速度最快。在代码中函数调用越少,速度越快。
10.= 和 = = 和 = = =
=是赋值操作
= = 是比较值的 大小
= = = 是比较值和数据类型是否一致。
11.HereDoc与NowDoc
PHP中的heredoc是Linux的原型文档
echo <<<THIS_HEREDOC
php is best language for web
THIS_HEREDOC
以上具备解析效果
PHP version>5.3就可以使用nowdoc
和heredoc相似,但是它使用单引号作为定界符。
它不做文本解析。
12.函数传值与引用
传值
格式如下
$user = getUserInfo($1, $2, $3)
我们可以使用func_get_arg()函数来直接处理
function getUserInfo(){
$first = func_get_arg(0);
$second = func_get_arg();
}
也可以将返回的内容交给数组
function getUserInfo() {
$args = func_get_args();
$first = $args[0];
$second = $args[1];
}
引用
使用&符号
13.避免使用过多参数
可以使用数组再逐一赋值。
可以适用对象
14.匿名函数
php ver 5.3引入了匿名函数,也叫动态函数
5.4后有进一步扩展
$greet = function($name) {
printf("hello %s\r\n", $name);
};
PHP中还有一个函数:array_map()
接收一个函数为第一个参数,第二个参数是一个数组,数组内的元素都将使用之前的函数。
array_map(function($value){
// todo
}, $name);
匿名函数副作用是可能出现解释出错。
匿名函数可以使用闭包
php ver < 5.3需要使用create_function();
$x = 3;
$func = create_function($z) {return $z *= 2;}
echo $func($x); // 6
ver > 5.3
$x = 3;
$func = function() use(&$x) {$x *= 2;};
$func()
echo $x; // 6
闭包语法要优于create_function()
15.return and exit
return 一般用在函数和方法里
exit是中断执行。
16.is_callable() 与 method_exists()函数
用于检查对象的方法是否存在
method_exists()判断方法是否存在,但是比较狭义。
is_callable函数接收一个回调参数,可以指定一个函数名称或者一个包含方法名和对象的数组。如果在当前作用域下执行,返回TRUE。
is_callable也可以对对象的魔术方法__call()进行判断。
17.执行外部程序
使用``来执行
函数shell_exec()
前者将结果放入到数组中
后者则放入到标量中。
18.安全模式的使用说明
用来限制用户使用外部命令或者执行不安全的操作
打开php.ini中的safe_mode选项 = on
修改后重启apache或者nginx
若想使用include或者require需要在safe_mode_include_dir选项设置。
如果想修改某些系统环境变量可以使用safe_mode_allowed_vars选项
19.优化
循环时,提前计算循环长度
使用foreach替代for和while循环
SQL组合优化
只查一次,然后再拆分
文件处理
goto语句
利用phar扩展来节省空间
创建一个phar文件
phar pack -f animals.phar -c gzwild.phpdomestic.php
php.ini 中的phar.readonly = off
深入PHP面向对象
PHP对于面向过程和面向对象支持都比较好
面向过程也有他的好处,就是性能强于面向对象,但是日积月累维护就会很难。
面向对象可以实现:
- 在已有代码的基础上扩展
- 允许类型微调,以在方法中对这些变量进行权限控制
- 结合设计模式,能够解决大多数软件设计的问题扩展性好,调试更容易
价值远大于面向过程
1.PHP与面向对象
面向对象编程的目的时让开发者的生活轻松,可以将问题分割成小块,容易理解并解决。
也节约开发时间
2.面向对象的概念
对象:
变量和方法都聚集在一起的实体
类:
被称之为对象的模板。每次创建对象时都是调用了类。
属性:
一个属性是类的一个内部变量,可以保留一些信息的容器。PHP不会检查属性变量的类型属性可以在类本身,子类,或调用之处。
方法:
在类中的函数
封装:
包装好的数据和方法到一个类作为封装
多态性:
对象可以是任何类型。一个对象可以演变为保留其行为的其他派生对象
传承:
就是继承
耦合:
类如何彼此依赖的行为。
松耦合比紧耦合的对象更容易重用。
这是重点
设计模式:
用最少的代码开发最好性能的应用程序
子类:
一个对象是另一个对象的派生
父类:
如果对象是它派生的,它就称之为父类,超类。
实例:
创建一个对象是,通过调用其构造函数,它就称之为实例。
3.类和对象
就是用类来写代码很清晰
也就是说:代码如诗
4.使用对象
实例化的时候调用了构造方法
__construct()
有参数记得传参
5.构造方法和析构方法
php低级版本是没有construct,使用和类名相同的名称的方法就是它的构造方法,如果两个都存在,那么PHP会默认执行construct,其他的不执行。
析构方法。
销毁对象时调用
6.实例和多态
一般有三个权限
public
公共的,哪都能调用
protected
受保护的,只能通过父类本身和子类进行访问和修改
private
私有的,只能内部访问
旧的PHP中使用var来定义相当于public
PHP的关键字描述:
static
不需要声明就可以被外部访问和存取
abstract
抽象方法不能直接使用,需要通过implement关键字才能使用
final
最终版本,不能重新声明和重写
7.类的扩展
可以通过子类来继承父类,然后进行类的扩展
8.防止重写
关键final
final public function test()
{
// TODO
}
9.防止被扩展
给某个方法声明final
public final function test()
{
// TODO
}
10.多态性
建立几个具体的父类对象的过程。
使用instantof关键字来判断当前对象的父类关系。
11.接口
接口就是一个空类,只包含方法的声明
使用interface来定义接口
interface test
{
public function a();
public functioin b($arg);
}
使用implements来实现接口
有参数要带参数,必须写全
接口就像是一个规则。
12.抽象类
抽象和接口相似,但是可以包含函数体
使用extended扩展
抽象方法不包含内容
abstract public function test();
13.静态方法和属性
使用::来调用,不需要实例化,不占内存
在类中使用self::来调用
14.魔术方法
__set()设置不存在的方法
function _set($name, $value) // 名字和值
{}
__get()
获取
__call()调用不存在或不可见的方法。
参数:存放视图调用的方法名,及其参数 放入同名数组中
__sleep() 序列化对象
__wakeup() 反序列化时
__tostring()
把类的实例化转化为字符串
__autoload()
自动加载
一个类中只能使用一次
把经常使用的类自动引进来。
15.命名空间
namespace定义
使用use使用
可以使用as来取别名
16.traits
traits用来实现类无法多继承。
使用use来使用
PHP输出缓冲区
有效的解决性能问题
1.系统缓冲区
buffer是一个内存的空间地址
例:使用vim时,每输入一个字符,操作系统不会立即把这个字符直接写入到磁盘中,而是先写入到缓冲区,写满才把缓冲中的数据写到磁盘,也就是当内核函数调用flush()时,才会强制把缓冲区的脏数据保存到磁盘中。
“脏数据(Dirty Read)是指源系统中的数据不在给定的范围内或对于实际业务毫无意义,或是数据格式非法,以及在源系统中存在不规范的编码和含糊的业务逻辑。”
2.什么是PHP输出缓冲区
- 任何会输出内容的函数都会用到输出缓冲区,echo() print()
如果是PHP扩展,使用函数(C函数)可能会直接将输出写到SAPI缓冲区层,不需要经过输出缓冲层。 - 输出缓冲区层是很多层的一个。
application
SAPI
PHP PHP API + Extensions
Zend API Zend Extension API
Zend Engine
- SAPI中的输出缓冲区。这写都是PHP中的层,当输出的字节离开PHP进入计算机体系结构中的底层是,缓冲区又不断出现