PHP之 常见问题拾记

PHP常识问题拾记


1、PHP_EOL是干什么的?
-》 PHP_EOL是PHP定义的变量,代表PHP换行。特点是这个变量会因为平台而变,在windows下是\r\n,在Linux下是\n,在mac下是\r。

2、为什么echo一个对象会报语法错误,但如果这个对象实现了__toString方法后就可以直接输出呢?
-》 echo本可以打印一个对象,而且也实现了这个接口,但是PHP对其进行了限制,只有实现__toString后才能使用。

3、PHP在echo一个对象的时候,为什么要判断变量类型是否为string?
-》 如果是string的话,直接输出;如果不是,则会去寻找可以转换为string的方法,比如对象中的__toString。

4、__toString和serialize有什么联系,区别又在哪里?
-》两者都可以实现序列化,但是,serialize会产生一些无用的信息,比如长度,会造成存储空间的无谓浪费;而__toString可以实现自己的序列化。用json_encode也不错。

5、我们平时的操作中echo一个对象,有时候,会报错,这是为什么?如何解决报错?
-》这是因为echo一个对象,对象就会自动去调用它所属类的__toString方法,格式化输出这个对象所包含的数据。如果没有这个方法,那么就会报错。

6、assert函数是做什么用的?
-》检查一个断言是否为false。第一个参数是assertion,如果是字符串,则将被该函数当做PHP代码来执行。assertion是字符串的优势是当禁用断言时,它的开销最小,并且,在断言失败时,消息会包含assertion表达式。断言这个功能只是被用来调试。而作为一个经验法则,在断言禁用时,你的代码还应该正常运行才对。

7、编程语言中的三大范式是什么?
-》面向过程、面向对象、函数式编程。

8、面向对象的核心思想是什么?
-》对象、封装、可重用性和可扩展性。

9、说说对于序列化的理解。
-》序列化就是把保存在内存中的各种对象状态(属性)保存起来,并且在需要的时候,可以还原出来。在序列化和反序列化时都需包含类的对象的定义,不然,反序列化后,就找不到该对象的类的定义,返回不了正确的结果。

10、PHP的底层变量类型是什么?
-》zvalue_value.

11、在PHP5中,对象在底层是采取什么方式实现的?
-》属性数组 + 方法数组。

12、类的标准方法在哪个文件定义,具体实现又在哪个文件?
-》zend/zend_object_handlers.h  zend/zend_object_handlers.c 

13、在PHP中有对象就一定有类吗?
-》 不一定。由标量转换的object,就没有一个类与object对应。在PHP中这类对象会被stdClass收留。

14、简单说说PHP的垃圾回收机制。
https://www.cnblogs.com/lovehappying/p/3679356.html

15、假设一个控制器调用了一个不存在的方法,报错了,那么要怎么处理,才会友好地处理这种情况呢?
-》使用__call魔术方法。

16、使用魔术方法的本意是什么?
-》使用魔术方法的本意并不是“防止调用不存在的方法而报错”,而是为了使方法的动态创建成为可能。

17、在PHP中,命名空间是用来解决什么问题的?
-》a.解决用户的代码与PHP内置的类、函数、常量或第三方类、函数、常量的冲突问题。
-》b.为很长的标识符名称创建一个别名,提高代码的可读性。

18、命名空间提出于什么时候?
-》PHP5.3

19、在PHP命名空间和目录一定要一一对应吗?
-》不是的。但是,常规操作中,尽量做到一一对应。

20、在PHP中,支持同一个文件中定义多个命名空间吗?
-》同意。但非常不提倡。

21、继承与多态的关系是什么?
-》面向对象的优势在于类的复用。继承和多态都是类的复用,但是,继承是类级别的复用,而多态是方法级别的复用。

22、举例说明一下“组合”。
-》代码定义两个类,一个是person,一个是family。在family类中创建person类中的对象,把这个对象视为family类的一个属性,并调用它的方法处理问题,这类复用方式,叫“组合”。

23、简述继承。
-》类与类之间有一种父与子的关系,子类继承父类的属性和方法,称为继承。在继承里,子类拥有父类的方法和属性,同时子类也可以拥有自己的方法和属性。

24、在继承中,用什么代表父类,用什么代表自己?使用什么运算符,该运算符还能做什么用?
-》parent代表父类。Self代表子类。使用“::”,该操作符还能作为常量和静态方法的调用。

25、如果声明类成员或方法为static,访问的时候,是否需要实例化,怎么访问?
-》不需要实例化,就可以直接访问。同时,也就不能通过一个对象去访问其中的静态成员,但是,静态方法除外。

26、使用“::”调用一个非静态的方法会导致一个什么级别的错误?在PHP中这个报错提示默认是否开启?怎么开启?
-》会导致一个E_STRICT级别的错误。默认不会开启。在php.ini文件中,进行如下操作开启:
error_reproting = E_ALL | E_STRICT
display_errors = On

27、组合与继承都是提高代码可重用性的手段。那么它们是什么关系?
-》继承是一种“是、像”的关系,而组合是一种“需要”的关系。举例,父子是继承关系,而父亲与家庭则是组合关系,组合偏重整体与局部的关系,而继承偏重父与子的关系。从方法复用的角度考虑,两个类,有很多相同的代码和方法,可以从这两个类中抽象出一个父类,提供公共方法,然后,两个类作为子类,提供个性方法。组合之间的类可以关系很小,甚至没有关系。

28、在实际的编程中,关于继承和组合,取舍就不是那么明显了,你很难说出两者是“像”还是“需要”的关系,甚至现实世界的建模,都无法决定是继承还是组合,那么,该怎么办?有标准吗?
-》有,低耦合。

29、耦合是什么?
-》耦合是一个软件结构内,不同模块之间,互连程度的度量,也就是不统计模块之间的依赖关系。
低耦合是什么?
-》低耦合是模块与模块之间,尽可能地,使模块独立存在,之间的接口也尽量少、简单。

30、解耦是什么?
-》解耦是解除模块之间的依赖。

31、按照低耦合的思想,继承与组合,在二者均可使用的情况下,更倾向于使用组合,为什么?继承存在什么问题?
a、继承破坏封装性。比如定义鸟类为父类,具有羽毛属性和飞翔方法,鸽子、老鹰、麻雀对其继承,没有问题;但是,鸵鸟、鸡继承的话,显然,飞翔的方法它们也可以使用,但是,他们压根就不能飞,显然破坏了类的封装性。而组合,从语义上要优于继承。
b、继承是紧耦合的。继承使得父子捆绑,组合仅仅通过唯一接口和外部进行通信,耦合低于继承。
c、继承扩展复杂。继承一多,大量的方法要重写,组合可以实现动态结合,减少代码。
d、不恰当地使用继承可能违反现实世界里的逻辑。比如人作为父类,雇员、经历、学生作为子类,经理一定是雇员,学生也可能是雇员,而使用继承的话,一个人就无法拥有这么多的角色。这种问题,归结起来就是“角色”与“权限”的问题。在权限系统中,可能存在这样的问题,经理的权限大于主管,但是,碍于分工和安全的考虑,经理是不能直接操作主管所负责的资源,技术经理也没有权限直接命令市场主管。就是这么个道理,不恰当地继承,就可能出现逻辑混乱,但组合可以巧妙地解决。

32、组合有缺点吗?
-》有,组合需要一一创建局部对象,增加了代码量,但是,其优点却是大过缺点的。

33、继承最大的优点是扩展简单,但是缺点大于优点,那么应该如何使用继承呢?
a、精心设计子类,父类得稳定,不要多于三层。
b、非被继承的类,使用final修饰符,防止覆盖和优化搜寻。
c、优先考虑组合。
d、子类不是父类的角色。
e、子类扩展,不能损害父类。
f、底层代码,多用组合;顶层、业务层多用继承。

34、继承与组合各有长短,如果想要组合的灵活,继承的简洁,能做到吗?
-》可以。多重继承,就可以实现。多重继承就是一个类可以同时继承多个父类,组合两个父类的功能。但多重继承过于灵活,会带来“菱形”问题,大多数语言已经放弃。PHP 5.4提供了Traits,可以方便实现对象的扩展,可以使单继承获得多重继承的灵活,又可避免多重继承的问题。

35、简述多态
-》同一类的对象,在收到相同的消息时,会得到不同的结果。而这个消息是不可测的。多态,顾名思义,就是多种状态,也就是多种结果。

36、多态性的意义在哪里
-》多态性是一种通过多种状态或阶段,描述相同对象的编程方式。它的真正意义在于:实际开发当中,只要关心一个接口或基类的编程,而不必关心一个对象所属的具体类。

37、很多人都说“PHP没有多态”,对吗?
-》不是没有,事实上,它本来就是多态的。PHP作为一门脚本语言,自身就是多态的,所以,在语言这个级别上,不谈PHP的多态。官方手册也找不到详细描述。

38、通过判断传入对象所属类不同来调用其同名方法,得出不同的结果,这是多态吗?
-》如果站在C++角度,不是,这只是不同对象的不同表现。C++里的多态,指的是运行时对象的具体化,同一类的对象调用相同的方法而返回不同的结果。

39、区别是否多态的关键
-》在于看对象是否属于同一类。如果调用相同的方法,返回了不同的结果,那就是多态。PHP与强语言的多态,在概念和实现上,是有一些区别的,PHP的实现更简单、更灵活。

40、多态的本质总结
A、多态是同一类对象在运行时的具体化。
B、PHP实现多态,更简单、更灵活。
C、类型转换不是多态。
D、PHP中的父类和子类,存在继承关系,但不存在“血缘”关系,子类无法向上转为父类。
E、多态的本质即if、else,实现的层级不同罢了。

41、面向接口编程是不是一种新的编程范式?
-》不是。

42、Interface定义的接口是狭义的还是广义的?
-》狭义的。

43、广义的接口是什么?
-》广义的接口可以是任何一个对外提供服务的出口。比如数据传输的USB接口、阿里的支付宝接口等。

44、在程序里,接口的方法必须被全部实现吗?
-》对,若不全部实现,就会报fetal错误。

45、在PHP中,如果代码不符合接口语义,可以运行吗?
-》可以,PHP中,只关心是否实现了这个方法,而不关心语义是否正确。

46、为什么要用接口,接口到底有什么好处?
-》接口并不提供实现,只是提供一个规范。如果我们知道一个类实现了某个接口,那么就知道了可以调用该接口的哪些方法,我们只需要知道这些就够了。

47、为什么一个类只要实现了Iterator迭代器,其对象就可以被用作foreach的对象呢?
-》在对PHP实例对象使用foreach语法时,会检查这个实例有没有实现Iterator接口,如果实现了,就会通过内置方法,或使用实现类中的方法,模拟foreach语句。

48、PHP的错误处理机制有哪两种?
A、使用set_error_handler接管PHP错误处理。
B、使用trigger_error主动抛出一个错误。

49、使用set_error_handler函数需注意什么?
A、自定义错误处理函数,必须先创建一个错误处理函数,然后设置错误级别。
B、此函数并不能托管所有种类的函数,比如E_ERROR、E_PARSE、E_CORE_ERROR等。

50、使用set_error_handler函数,会完全绕过标准的PHP错误处理函数,必要时需怎么做?
-》终止程序,die()脚本。

51、如果脚本执行前发生错误,这时自定义程序还未注册,因此,就不会用到自定义错误处理程序,怎么办?如何实现?
-》需要先实现一个自定义的异常处理函数。具体如下:
<?php
function customError($errno, $errstr, $errfile, $errline){
echo “<b>错误代码:</b>[${errno}]${errstr}\r\n”;
echo “错误代码所在行:{$errline}文件{$errfile}\r\n”;
echo “PHP版本”,PHP_VERSION,”(”,php_OS,”)\r\n”;
//die();
}
Set_error_handler(“customError”,E_ALL|E_STRICT);
$a = array(‘o’=>2,4,6,8);
echo $a[o];
?>

52、自定义错误处理函数一定要有哪四个输入变量?
-》$errno, $errstr, $errfile, $errliine

53、set_error_handler会接管PHP内置的错误处理,那如何取消接管?
-》使用restore_error_handler()函数。

54、使用自定义的set_error_handler接管PHP的错误,那先前代码里的错误抑制@是否会失效?
-》会。抑制的错误也会显示。

55、PHP中,异常是否必须手动抛出?
-》是。绝大部分得手动抛出。

56、在PHP中如何才能捕获到异常和非知名的错误?
-》使用set_error_handler接管,进而主动抛出。具体操作如下:
<?php
fucntion customError($errno,$errstr,$errfile,$errline){
// 自定义错误处理时,手动抛出异常
throw new Exception($level.’|’.${errstr});
}
set_error_handler(“customError”, E_ALL|E_STRICT);
try{
$a = 5/0;
}catch(Exception $e){
echo ‘错误信息:’.$e->getMessage();
}
?>

57、以上这种方式存在的问题是什么?
-》问题是这些必须靠程序员自己来掌控,处理不当,就会导致与前面的业务数据不一致。优点是,可获取程序上下文信息,及时针对性补救。

58、Fetal error这种错误,完全不能捕获吗?如果不是,怎么处理?
-》不是。使用register_shutdown_function这个函数可以在程序终止,或者die的时候触发一个函数,给PHP一个短暂的信息展示。

59、对于parse error这种错误,常见的处理方式是?
-》对于这种错误,你只能记录日志,后边进行查询。

60、错误处理,有对应的抛出函数吗?
-有,trigger_error()。

61、在PHP中,异常和错误是两种概念。异常绝大部分得通过手动抛出,才可捕获。无论错误还是异常,都可以使用handler,接管系统已有的处理机制。

62、在PHP中连接MySQL数据库,通常有哪三种选择?
A、MySQL系列函数,最常用,过程式风格的一组应用。
B、MySQLi函数,前者的增强版,提供面向过程和对象的两种API,增加预编译和参数绑定。
C、PDO,从语法上讲,PDO更接近MySQLi(PHP5.1及以上版本支持)

63、PDO扩展只是一个抽象的接口层,利用它本身不能实现库操作,那么它究竟怎么实现的?
-》它会使用一个特定的数据库PDO驱动访问数据库。

64、PDO中包含三个预定义类,是哪三个?
-》PDO、PDOStatement、PDOException。

65、如何使用PDO?
<?php
try{
$dsn = “mysql:host=127.0.0.1;dbname=test”; // 配置PDO的数据源
$db = new PDO($dsn, ‘root’, ‘123456’); // 构造方法
// 设置异常可捕获
$db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$db->exec(“SET NAMES UTF8”);
$sql = “insert into t1 (a,b,c,d) values (‘a1’,’b2’,’c1’,’d1’)”;
$db->exec($sql);
// 使用预处理语句
$insert = $db->prepare(“insert into t1 (a,b,c,d) values (?,?,?,?)”);
$insert->execute(array(‘a2’,‘b2’,‘c2’,‘d2’));

$sql = “select a,b,c from test”;
$query = $db->prepare($sql);
$query->execute();
}catch (PDOException $err){
echo $err->getMessage();
}
?>

66、PDO最大的特性是什么?
-》引入参数绑定和预处理。两者是同一事件的不同阶段。

67、PHP的PDO提供了哪两种参数绑定?
A、问号+序号
B、冒号+参数名

68、PHP显式地用了prepare的API,但实际上PDO并没有做真正的预处理,而是?
-》对参数转义,拼接到原来的sql语句上,发送给MySQL服务器。

69、为什么PHP里,使用PDO的prepare API,默认不是使用参数绑定和预编译呢?
-》这主要是处于兼容性的考虑,一个是PDO是个抽象数据访问层,支持多种数据库,可能有的数据库并不支持预编译功能,所以,为了做到最大兼容,PHP就默认使用了SQL拼接来模拟预编译。

70、从抓包可以看到,如果使用了预编译,客户端和服务端就多了一次网络开销,客户端需分两次发送SQL模板和SQL查询参数,那是不是说预编译会带来性能损失呢?
-》不会,因为预编译的过程只发生在第一次请求,它只需一次编译的过程。一旦编译成功,就不会再进行第二次了。

71、PHP的PDO思想来自于什么?
-》ODBC(open database connectivity,开放数据库连接),JDBC(Java database connectivity,Java数据库连接)。ODBC,微软的,开放服务结构中,数据库的一个组成部分,提供了对于数据库访问的标准的API。JDBC可对多种关系的数据库提供统一访问,它是对ODBC的一种继承。

72、为什么说使用了连接池的技术,就能达到提高预编译性能的目的?
-》MySQL支持预编译,但是比较弱,仅仅是session级别。PHP每次请求都是一次全新的会话,每次请求都需重新做一次预编译。但如果使用了连接池,就能让多次PHP请求使用同一个数据连接session,从而达到高性能的预编译。

73、预编译负责哪两件事?
-》 转义和软解析提速。程序是否支持预编译,除了数据库之外,还需驱动支持。PDO和MySQLi都支持预编译。

74、PDO中如何实现事务?
-》PDO中使用beginTransaction()方法创建事务。使用commit()提交事务,rollback()回滚事务。在脚本结束或者连接要关闭时,如果还有一个操作未处理完,PDO将自动回滚。自动回滚,仅限于通过beginTransaction()建立的事务。手动创建的事务,是不能自动回滚的。

75、怎么知道SQL执行的效率呢?
A、记录慢日志
B、使用show profile,查看所有语句的消耗时间
C、使用show status,返回一些计数器,通过数值判断哪些语句慢
D、使用show processlist,观察一些不正常的线程(消耗时间多的)
E、使用explain进行分析

76、MySQL索引建立和使用的基本原则?
A、合理设计和使用
B、关键字段,索引的创建与否,会使查询速度相差100倍
C、差的索引与没建索引一样
D、索引并非越多越好
E、每个表的索引应该少于5个
F、不在结果集单一的列(如enum枚举类型)上创建索引,帮助不大
G、创建索引的字段结果集最好分布均匀,或符合正态分布

77、PHP类型转换
第一种转换方式: (int)  (bool)  (float)  (string)  (array) (object)
<?php   
$num1=3.14;   
$num2=(int)$num1;   
var_dump($num1); //输出float(3.14)   
var_dump($num2); //输出int(3)   
?>  
第二种转换方式:  intval()  floatval()  strval()
<?php   
$str="123.9abc";   
$int=intval($str);     //转换后数值:123   
$float=floatval($str); //转换后数值:123.9   
$str=strval($float);   //转换后字符串:"123.9"    
?>  
第三种转换方式:  settype();
<?php   
$num4=12.8;   
$flg=settype($num4,"int");   
var_dump($flg);  //输出bool(true)   
var_dump($num4); //输出int(12)   
?> 

78、HTTP协议的请求方法
A、GET:会显示请求指定的资源,主要用于数据的读取,而不应当用于会产生副作用的非逆的操作
B、POST:向指定资源提交数据,请求服务器进行处理,它是非逆的方法
C、HEAD:向服务器发送指定资源的请求,但是服务器在响应head请求时,不会回传资源的内容部分,只会回传head的头信息
D、OPTIONS:用户客户端查看服务器的性能的,会请求服务器,返回该资源所支持的所有HTTP请求的方法,该方法会用*来代替资源名称。向服务器发送options请求,可以测试服务器功能是否正常。
E、PUT:会向指定资源的位置上上传最新的资源内容,put方法是逆等的方法,通过该方法,客户端可以将指定资源的最新数据传送给服务器,取代指定的资源的内容。通常情况,修改用put,创建用post。
F、DELETE:请求服务器用于删除过的请求的URI所标识的资源,delete请求后,指定的资源会被删除,该方法也是逆等     
G、TRACE:请求服务器回显其收到的信息,该方法主要用于HTTP请求的测试和诊断。

79、HTTP协议常见的请求/响应头
A、content-type:请求的与实体对应MIME信息
B、Accept:指定客户端能够接受的内容类型
C、Origin:告诉最初的请求来源
D、Cookie:HTTP请求发起时,发给服务端cookie的值 
E、Cache-control:指定请求和响应缓存的机制
F、User-agent:用户信息
G、Referer:上级请求路径
H、X-forwarded-for:请求端的真实的IP(做代理的时候,可以通过它获取请求端的真实IP)
I、Access-Control-Allow-Origin:允许特定的域名来访问,通常做跨域使用
J、Last-modified:请求资源的最后响应时间

80、常见的设计模式
工程模式、单例模式、注册树模式、适配器模式、观察者模式、策略模式。

81、session信息的存储方式有哪些?如何进行遍历?
A、默认存储到服务器的文件的;
B、还可以通过session_set_save_handler这个函数存储到Redis、memcache。
遍历的话,直接遍历$_SESSION,就可以了。

82、传递sessionid的问题
Session_name()和session_id()
使用示例:
<a href=”    index.php?<?php echo session_name.’=’.session_id();?>”>下一页</a>
还有另一种简便方式,但是,这种使用情况的前提是cookie没有开启,如下
<a href=”index.php?<?php echo SID;?>”>下一页</a>
cookie开启,SID为空。

83、SESSION配置
A、session.auto_start  开启session
B、Session.cookie_domain 存储session_id的cookie的有效域名的定义
C、Session.cookie_lifetime cookie生命周期
D、Session.cookie_path cookie的路径设置
E、Session.name 存储session_id是PHPSESSIONID,这个设置,就是可以更改PHPSESSIONID
F、Session.save_path session文件存储在服务器的哪个路径之下
G、Session.use_cookies  是否使用cookie传递session_id
H、Sesssion.use_trans_sid 是否可以使用传递的方式传递session_id
I、Session.gc_probability 开启垃圾回收机制
J、Session.gc_divisor 访问多少次后进行垃圾回收
K、Session.gc_maxlifetime  session文件最大生命周期,过了最大生命周期,垃圾回收文件

84、SESSION的操作
A、开启session: session_start();
B、使用session: 直接给$_SESSION赋值就行
C、销毁session: $_SESSION=[]
D、删除文件以及COOKIE:session_destory();

85、SESSION的工作原理
Session的信息存储在服务端,但是,客户端的cookie中存有session_id,如果,客户端要使用session信息,通过session_id,去服务端获取即可了。

86、COOKIE的优点和缺点
优点:信息存储在客户端,不会占用服务端资源。
缺点:信息存储在客户端,不安全;如果用户禁用COOKIE,那么,我们就无法保存用户的信息。

87、COOKIE的相关操作
设置COOKIE
setcookie( $name, $value, $expire, $path, $domain, $secure);
SETCOOKIE( cookie名,cookie值,过期时间,有效路径,域名,安全性 )

读取COOKIE
$_COOKIE

设置COOKIE为数组
setcookie( ‘ a[b]’, ‘val’ );

删除COOKIE
setcookie( $name, ‘’,time()-1 );
不能用unset删除

88、COOKIE的工作原理
COOKIE是由服务器发送给客户端的片段信息,存储在客户端浏览器的内存或者是硬盘当中,供页面之间的信息交流和状态跟踪。

89、会话控制的传递方式
A、通过GET参数传递
B、COOKIE
C、SESSION

90、为什么要使用会话控制技术?
web是通过http协议来实现的,而http协议又是无状态的协议,也就是说,http协议没有一个内建机制来维护两个事务之间的状态,同一个用户请求同一个页面两次的时候,http协议不会认为这两次请求都来自同一个用户,会把他们当做是两次请求的独立,会认为是两个人的请求。如果用户执行了登陆操作,再次请求页面,http不认为用户有登陆,因为无法保持该用户之前的登陆状态,所以,它无法在各个页面之间保持用户的跟踪和状态的保持,而会话控制技术,就是为解决这个问题应用而生的。

91、正表达式组成部分
A、分隔符:正斜线(/)、hash符号(#)、取反符号(~)
B、通用原子:\d(0-9) \D(非0-9) \w(字母、数字、下划线) \W(非字母、数字、下划线) \s(空白符) \S(非空白符)
C、元字符:.(除了换行符之外的任意字符) *(0次1,次多次) ?(0次或1次) ^(非) $(以某结尾)  +(1次或多次) {n}(n次) {n,m}(最少n次,最多m次) [](匹配一个集合,[abc]就是匹配a 或者b或者 c) ()(互相引用,或看做一个整体) [^](非某个范围) |(或者) [-](代表一个范围[0-9]匹配0到9之间的所有数字)
D、模式修正符:i(不区分大小写) m(将字符串分割,每一行都进行匹配,前提是字符串中有换行) e(preg_match匹配出来的内容,做一些PHP语法的处理) s(修正点的换行) U(取消贪婪模式) x(忽略模式当中的空白符) A(语句模式开头) D(修正$对反斜线的忽略) u(中文utf-8字符匹配时可以用到)

92、fopen函数
用来打开一个指定的文件,打开时,需要指定打开的模式
常见模式:
r:只读方式打开,将指针指向文件开头 
r+:读写方式打开,将文件指针指向开头
w:写的方式打开文件,将文件指针指向文件开头,并且将文件的大小记为0(清空文件)
w+:读写模式打开,如果文件不存在,会为你自动创建文件
a:追加的写入方式,会将文件的指针指向文件的末尾,如果文件不存在,也是创建一个
a+:追加的读写方式,将文件指针指向文件的末尾,文件不存在,也会创建
x:以写入的方式进行打开,将文件指针指向文件的开头,如果文件已经存在,会报warning的错误,并且fopen返回一个false;如果文件不存在,才会创建
x+:创建,并以读写的方式打开
b:打开一个二进制文件
t:Windows独有的文本转换标记,可以将\n透明地转换为\r \n

93、读取函数
fread():读取文件函数
fgets():获取一行文件内容函数
fgetc():获取文件一个字符

94、关闭函数
fclose()

95、文件读取,不需要fopen打开,就能读取的函数
file_get_contents()
file_put_contents()

96、其他的文件读取函数
file() 将整个文件读取到一个数组中
readfile() 将文件内容读取出来,并且输入到缓冲区

97、访问远程文件
需要在php.ini中开启allow_url_fopen,HTTP协议连接,只能读取,不能写入。FTP协议,可以使用只读或者只写。

98、目录相关的操作
Basename()  dirname()  pathinfo()

99、目录读取
opendir()  readdir()  closedir()  rewinddir()  

100、目录删除
rmdir() 
注意:只有当目录为空的时候,才能删除,否则,有内容,删除不了,要先删除文件,再删目录。

101、目录创建
mkdir()

102、文件大小
filesize()

103、目录大小(磁盘大小)
disk_free_space:磁盘剩余空间
dis_total_space:磁盘总的大小空间

104、文件拷贝
copy()

105、删除文件
unlink()

107、获取文件类型
filetype()
重命名文件或者目录
rename()
注意:这个函数不光可以重命名,还可以移动位置(Linux : mv)

108、文件截取
ftruncate()

109、文件属性
file_exists()  is_readable()  is_writeable()  is_excutable()  filectime()  fileatime()  filemtime()

110、文件锁
flock()

111、文件指针
ftell()  fseek()  rewind()

112、常规熟悉函数

时间日期函数
date()  strtotime()  mktime()  time()  microtime()  date_default_timezone_set()

mktime() : 取得一个日期的UNIX时间戳

mktime([ int $hour = date("H")[, int $minute = date("i")[, int $second = date("s")[, int $month = date("n")[, int $day = date("j")[, int $year = date("Y")[, int $is_dst = -1]]]]]]] )

IP处理函数
Ip2long()  long2ip()

打印处理
print() :语言结构,只能接收一个变量
printf() :根据格式来输出,直接输出到缓冲区
print_r() :将数组对象格式化输出(false不会输出,true输出1)
echo() :语言结构,可以接收多个变量,同时打印多个,建议使用echo
sprintf() :根据格式进行返回
var_dump() :将数组对象格式化输出,类型也会打印出来,推荐使用
var_export() :格式化输出,符合PHP语法结构,加参数true,变为返回

序列化和反序列化
serialize()  unserialize()

字符串处理函数
implode()  explode()  join()  strrev()  trim()  ltrim()  strstr()  number_format()

字符串常用的函数
.addcslashes—以C语言的分格使用反斜线转义字符串中的字符
.addslashes—使用反斜线引用字符串
.bin2hex—把数据的二进制字符串转换为十六进制值
.chop—同rtrim,取出字符右边的空白
.chr—返回ASCII所对应的字符
.ord—返回字符的ASCII值
.chunk_split—将字符串分割成小块
.convert_cyr_string—将字符由一种cyrillic字符转换为另一种
.convert_uudecode—解码一个uuencode编码的字符串
.convert_uuencode—使用uuencode编码一个字符串
.count_chars—统计字符串中每个字节出现的次数
.crc32—计算一个字符串的crc32多项式
.crypt—单向字符串散列
.explode—将字符串以某个字符分割为多个字符,并成形为一个数组
.fprintf—写入一个根据format格式化后的字符串到由handle句柄打开的流中
.get_html_translation_table—返回使用htmlspecialchars和htmlentities后的转换表
.hebrev—将逻辑顺序希伯来文转换为视觉顺序希伯来文
.hebrevc—将逻辑顺序希伯来文转换为视觉顺序希伯来文,并转换换行符
.hex2bin—转换十六进制字符串为二进制字符串
.htmlspecialchars—将预定义字符转换为HTML实体
.htmlspecialchars_decode—把一些预定义的HTML的实体转换为字符
.implode—将一个数组的值转换为字符串
.join—implode的别名,将一个数组的值转换为字符串
.lcfirst—使一个字符串的第一个字符小写
.levenshtein—计算两个字符串之间的编辑距离
.ltrim—删除字符串开头的空白字符
.md5_file—计算指定文件的MD5散列值
.md5—计算字符的MD5的散列值
.money_format—将数字格式化成货币字符串
.nl2br—在字符串所有新行之前插入HTML换行标记
.number_format—以千位分隔符格式化一个数字
.rtrim—删除字符串的末端的空白字符
.setlocate—设置地区信息
.sha1_file—计算文件的sha1散列值
.sha1—计算字符串的sha1散列值
.similar_text—计算俩个字符串的相似度
.sscanf—根据指定的格式解析输入的字符
.str_getcsv—解析CSV字符串为一个数组
.str_ireplace—str_replace的忽略大小写版本
.str_pad—使用另一个字符串来填充字符串到指定的长度
.str_repeat—重复一个字符串
.str_replace—子字符串替换
.str_rot13—对字符串执行ROT13转换
.str_shuffle—随即打乱一个字符串
.str_split—将字符串转换为数组
.str_word_count—返回字符串中单词的使用情况
.strcasecmp—不区分大小写,二进制安全比较字符串
.strchr—查找字符串的首次出现
.strstr—查找字符串的首次出现
.strcmp—二进制安全比较字符串
.strcoll—基于区域设置的字符串比较
.strcspn—获取不匹配遮罩的起始子字符串的长度
.strip_tags—从字符串中去除HTML和PHP标记
.stripslashes—反引用一个引用字符串
.stristr—不区分大小写,查找字符串首次出现的位置(strpos)
.strlen—获取字符串的长度
.strnatcasecmp—不区分大小写的使用“自然顺序”算法比较字符串
.strnatcmp—使用自然排序算法比较字符串
.strncmp—二进制安全比较字符串开头的若干个字符
.strpbrk—在字符串中查找一组字符的任何一个字符
.strpos—查找字符串首次出现的位置
.strrchr—查找字符在字符串中最后一次出现的位置
.strrev—反转字符串
.strripos—不区分大小写计算字符串在目标字符串中最后一次出现的位置
.strrpos—计算字符串在目标字符串中最后一次出现的位置
.strspn—计算字符串中全部字符都存在于指定字符集合中的第一段子串的长度
.strtok—标记分割字符串
.strtolower—将字符串转换为小写
.strtoupper—将字符串转换为大写
.strtr—转换指定字符
.substr_compare—从偏移位置比较指定长度二进制安全比较字符串
.substr_count—计算字符串出现的次数
.substr_replace—替换字符串的子串
.substr—截取字符串
.trim—去掉字符串首尾的空白符
.ucfirst—将字符串的首字母转换为大写
.ucwords—将字符串的每个单词的首字母转换为大写
.vsprintf—返回格式化字符串
.wordwrap—打断字符串为指定数量的字符串
.vprintf—输出格式化字符串
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章