PHP如观潮一般

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输出缓冲区

  1. 任何会输出内容的函数都会用到输出缓冲区,echo() print()
    如果是PHP扩展,使用函数(C函数)可能会直接将输出写到SAPI缓冲区层,不需要经过输出缓冲层。
  2. 输出缓冲区层是很多层的一个。

application

SAPI

PHP PHP API + Extensions

Zend API Zend Extension API

Zend Engine

  1. SAPI中的输出缓冲区。这写都是PHP中的层,当输出的字节离开PHP进入计算机体系结构中的底层是,缓冲区又不断出现
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值