数组遍历
for($i = 0;$i <5;$i++){
$ar[] = $i;
}
数组变量=值,会自动叠加,而不是清空
extract函数
从K-V数组中将变量导入当前域。数组的键作为变量名,数组的值作为变量的值。
PHP常量和变量、全局变量、对象缓冲、数据库连接缓冲
内置常量:
1.$GOBALS
所有全局变量数组
2.$_SERVER
服务器环境变量数组
3.$_POST
通过POST方法传递给该脚本的变量数组
4.$_GET
通过GET方法传递给该脚本的变量数组
5.$_COOKIE
cookie变量数组
6.$_FILES
与文件上传相关的变量数组
7.$ENV
环境变量数组
8.$_REQUEST
所有用户输入的变量数组包括$_GET
$_POST
$_COOKIE
所包含的输入内容
9.$_SESSION
会话变量数组
自定义常量:
常量一旦被声明,全局可见,但必须要在每要用到的页面通过include或require引用才行。
PHP是一种纯解释型服务端脚本语言。请求一个PHP脚本,PHP会读取该脚本,并将其编译成Zend操作码。随后,操作码由PHP执行并丢弃。PHP脚本在每次解释时进行初始化,在解释完成后终止运行。这种运行是互相独立的,每一次请求都会创建一个单独的进程或线程,来解释相应的页面文件。页面创建的变量和其他对象,都只在当前的页面内部可见,无法跨越页面访问。在运行终止后,页面中申请的、没有被代码电焊工释放的外部资源,包括内存、数据库连接、文件句柄、Socket连接等都会被强行释放 。也就是,PHP无法在语言级别上实现直接访问跨越页面的变量,也无法创建驻留内存的对象。
<?php
class StaticVarTester {
public static $StaticVar = 0;
}
function TestStaticVar() {
StaticVarTester :: $StaticVar += 1;
echo "StaticVarTester :: StaticVar = " . StaticVarTester :: $StaticVar;
}
TestStaticVar();
echo "<br / >";
TestStaticVar();
>
这段代码如果写在Java中,$StaticVar
由于是静态的,一旦被初始化,就会长驻在内存中。多次运行页面,$StaticVar
会得到累加。
而PHP独立的工作模型,每次解释页面时都会执行一次程序初始化和终止的过程。因此每次请求都是独立的,无论运行多少次页面(刷新页面),$StaticVar
的结果都是一样。
对象缓冲(缓存):众所周知,很多设计模式都依赖于对象缓冲,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源,因此对于高并发WEB应用应当尽量减少对象的创建和销毁,由于PHP不支持多线程,无法像Java一样通过线程池调度来弥补这一缺陷;但可以通过第三方软件来实现。
数据库连接缓冲(缓存):对于Mysql,PHP提供了一种内置的数据库缓冲机制,即使用mysql_pconnect()代替mysql_connect(),但这种连接缓存往往会导致数据库连接的伪泄漏现象:在某时刻,并发的数据库连接过多,超过了Mysql的最大连接数,从而导致新的进程无法连接数据库。
PHP mysql 长连接、连接池的问题
php连接mysql的方式,常用有mysql扩展,mysqli扩展,pdo_mysql扩展,这些方式是官方提供的。
php的运行机制是页面执行完会释放该php进程中所有资源,如果有多个并发访问同一个页面,php会开相应的线程或进程去处理该请求,请求完释放结果。也就是php无法从语言层面 从页面到页面之间传递数据。
长连接的作用是在高负载情况下,通过利用长连接,减少每个请求建立连接、销毁连接所消耗的时间和资源。
PHP 并发模型,多进程,多线程
- PHP本身是线程安全的。
- PHP支持多线程并发,也支持多进程并发,取决于用哪个SAPI,比较推荐的php-fpm使用的是多进程模型。HHVM使用的是多线程模型。
- php-fpm多进程模型的优势:
- 内存释放简单,fpm通过进程直接退出方式有效解决内存泄露的问题。
- 容灾能力强,扩展或者php可能出现错误,如果单进程多线程模型,那么整个PHP都会挂掉,而多进程模型,某个进程死掉不会影响整体服务。
局部静态变量
局部静态变量即为在方法中的使用static修改的变量
静态局部变量不能被外部使用,一旦被创建,多次进入函数,局部静态变量不会被重新初始化。
include \ require \ include_one \ require_one的区别和用法
- 当引用不存在的文件时,include只会报警告,脚本会继续执行。而require会导致一个致命错误,停止执行。
- include是有条件包含函数,而require是无条件包含函数。即require函数总会执行。
- include_one与require_once会先检查函数是否被包含,如果已经包含过,则不再包含。
- include执行时每次都会进行读取和评估。require文件只处理一次,实际上是将要引入的内容替换了require语句。因此从性能上说,require会优于include
- 常用法:
require通常放在PHP程序的最前面,PHP程序在执行前,就会先读入require所指入的文件,使它变成PHP程序的一部分。
include一般放在流程控制的处理部分中。PHP程序读到include的文件时,才将它读进来。 - 被包含文件使用return 时,在include.require可以获取其返回值。
类相关
一个php文件可以有多个类
魔术常量
魔术常量即他是系统预定义的常量,但他并非不可变,他们的值 会随它们在代码中的位置改变与改变。
常用的魔术常量:
1. __LINE__
返回当前行号
2. __FILE__
文件的完整路径和文件名,如果用在被包含文件中,则返回被包含文件名。PHP4后值总是一个绝对路径
3. __DIR__
文件所在目录,如果用在被包含的文件中,则返回被包括的文件所在的目录,等价于dirname(__FILE__
)
4. __FUNCTION__
返回函数的名字
5. __CLASS__
返回类名PHP5.4对Trait也起作用
6. __TRAIT__
返回Trait名字
7. __METHOD__
类方法的名字,包含命名空间
8. __NAMESPACE__
当前的命名空间
defined与isset函数
bool defined(String $name) 检查一个常量是否存在
只能检查一个常量
如果需要检查变量是否存在使用isset()
如果需要检查一个函数是否存在 function_exists()
定义一个常量的方法
define(“NAME”,”CGZ”);
常量的定义应避免使用*的形式,因为PHP本身有内置的常量