PHP开发面试深度解析:正则、安全模式、魔术方法与实战题

需积分: 10 1 下载量 41 浏览量 更新于2024-09-15 收藏 53KB DOC 举报
"这是一份关于PHP面试题目的集合,主要涵盖了PHP的基础知识、安全配置、面向对象编程、脚本执行、垃圾回收、并发处理、数据结构实现、正则表达式应用以及网络通信等方面,适合准备PHP面试的开发者参考学习。" 1. **POSIX风格与兼容Perl风格正则表达式** - **POSIX风格** 的正则表达式函数包括`ereg`和`ereg_replace`,它们是PHP较早版本中使用的函数,不支持PCRE(Perl Compatible Regular Expressions)特性,如前瞻和后瞻断言、命名捕获组等。 - **兼容Perl风格** 的正则表达式函数是`preg_match`和`preg_replace`,它们基于PCRE库,提供了更强大的正则表达式支持,包括支持Unicode字符集、模式修饰符等。 2. **PHP配置中的safe_mode** - 当`safe_mode`在`php.ini`中开启时,PHP会限制某些系统函数的使用,以提高安全性。例如,它可能不允许执行系统命令(`exec`, `system`),限制文件操作(`include`, `require`),以及对文件所有者进行权限检查等。 3. **PHP5中的魔术方法** - PHP5引入了一些特殊的函数,当特定情况发生时自动调用,称为魔术方法,例如: - `__construct` 和 `__destruct` 分别用于对象创建和销毁时执行的代码。 - `__toString` 让对象能像字符串一样被打印。 - `__set_state` 用于序列化和反序列化对象状态。 - `__call` 处理未定义的方法调用。 - `__get` 和 `__set` 用于访问未定义的属性。 - `__isset` 和 `__unset` 对未定义的属性进行isset()和unset()操作。 - `__sleep` 和 `__wakeup` 在序列化和反序列化对象时调用。 - `__clone` 在克隆对象时调用。 - `__autoload` 自动加载未定义的类。 4. **在命令行下运行PHP脚本** - 方式一:直接执行PHP文件,如 `php filename.php arg1 arg2`,参数通过空格分隔。 - 方式二:使用`-r`选项运行PHP代码片段,如 `php -r "代码"`。 5. **PHP的垃圾收集机制** - PHP的垃圾收集(GC)机制主要用于回收不再使用的对象,防止内存泄漏。它采用引用计数和周期性GC策略,当对象的引用计数变为0且无法通过任何可达对象访问时,垃圾收集器会回收该对象占用的内存。 6. **实现Iterator接口** - 在PHP5中,可以通过实现`Iterator`接口使对象像数组一样遍历。需要定义`rewind()`, `current()`, `key()`, `next()`, 和 `valid()` 方法来遵循迭代器协议。 7. **多进程同时写入文件** - 实现多进程同时写入文件通常需要使用锁机制,如`flock()`,确保同一时间只有一个进程在写入,避免数据冲突。 8. **双向队列实现** - 双向队列可以通过继承`SplQueue`并扩展其`enqueue`和`dequeue`方法来实现,使其支持前后插入和删除元素。 9. **正则表达式提取属性值** - 使用正则表达式提取HTML或XML标签的属性值,需考虑到各种边界条件,如大小写、空格、引号类型等。例如,提取`test`标签的`attr`属性值的正则表达式可能如下: ```regex <test[^>]*attr\s*=\s*[‘"]([^‘"]+)[‘"]\s*>.* ``` 10. **使用socket实现POST请求** - 使用PHP的`socket`函数来构造POST请求,需要创建套接字连接到指定服务器,然后发送HTTP头和POST数据。例如: ```php $host = 'www.example.com'; $port = 8080; $path = '/test'; $data = array( 'username' => '温柔一刀', 'pwd' => '&123=321&321=123&', 'intro' => 'Helloworld!', ); $cookie = array( 'cur_query' => 'you&me', 'last_tm' => time() - 600, ); $headers = [ "POST $path HTTP/1.1", "Host: $host", "Cookie: " . http_build_query($cookie), "Content-Type: application/x-www-form-urlencoded", "Content-Length: " . strlen(http_build_query($data)), ]; $fp = fsockopen($host, $port, $errno, $errstr, 30); if (!$fp) { // 错误处理 } else { fputs($fp, implode("\r\n", $headers) . "\r\n\r\n" . http_build_query($data)); // 读取响应 while (!feof($fp)) { echo fgets($fp, 128); } fclose($fp); } ``` 这段代码创建了一个HTTP POST请求,并设置了所需的cookies。