PHP 16个魔术方法
__construct() 类的构造函数
__destruct() 类的析构函数
__call() 在对象中调用一个不可访问方法时调用
__callStatic() 用静态方式中调用一个不可访问方法时调用
__get() 获得一个类的成员变量时调用
__set() 设置一个类的成员变量时调用
__isset() 当对不可访问属性调用isset()或empty()时调用
__unset() 当对不可访问属性调用unset()时被调用
__sleep() 执行serialize()时,先会调用这个函数
__wakeup() 执行unserialize()时,先会调用这个函数
__toString() 类被当成字符串时的回应方法
__invoke() 调用函数的方式调用一个对象时的回应方法
__set_state() 调用var_export()导出类时,此静态方法会被调用
__clone() 当对象复制完成时调用
__autoload() 尝试加载未定义的类
__debugInfo() 打印所需调试信息
PHP 数组函数
array_merge() 合并多个数组
array_column() 获取数组中指定的单列字段
array_unique() 去掉数组中重复的值
array_keys() 获取数组中所有的键名
asort() 对关联数组按键值进行升序排序
PHP 字符串函数
substr("Hello world",6); 截取字符串
mb_substr('测试', 0, 1, 'utf-8'); 截取字符串
substr_replace($str, 'shanghai', 6); 把字符串的一部分替换为另一个字符串
str_replace('world', 'boy', 'hello world'); 把字符串的一部分替换为另一个字符串
substr_count('hello world', 'l'); 统计子串出现的次数
strtolower(); 转小写
strtoupper(); 转大写
explode(' ', 'hello world'); 把字符串打散为数组
strip_tags() 剥离html标签
将1234567890转成1,234,567,890样式
ltrim(strrev(chunk_split(strrev($str),3,',')),',')
PHP 超全局变量
$_POST
$_GET
$_COOKIE
$_SESSION
$_FILES
$_SERVER
$GLOBALS
PHP 面向对象的理解以及三大特征
万事万物都是一个对象,有自己的属性、行为
封装、继承、多态
PHP 常见的设计模式
单例模式、工厂模式、观察者模式
单例模式
一个类只有唯一对象实例问题 常用于数据库类设计,只连接一次数据库,防止打开多个数据库连接
class database
{
private static $_instance; 必须声明为静态的私有变量,用来实例保存对象
private function __construct() {} 构造函数必须声明为私有,防止外部程序new类从而失去单例模式的意义
private function __clone() {} 阻止复制对象实例
public static function get_instance() 此函数必须设为公有的,必须调用此方法以返回实例的一个引用
{
if (!isset(self::$_instance)) {
self::$_instance = new self();
}
return self::$_instance;
}
}
$db1 = database::get_instance();
$db2 = database::get_instance();
工厂模式
用一个公用的封装类去批量生成对象
class factoryModel
{
public static function produce($className)
{
$classObj = new $className();
return $classObj;
}
}
class tom {}
class kit {}
$tomObj = factoryModel::setFunc("tom");
$kitObj = factoryModel::setFunc("kit");
PHP的重载、重写
因为PHP属于弱类型,无法实现严格的OOP函数重载
PHP的常用算法
冒泡排序
对于一个长度为N的数组,我们需要排序 N-1 轮,每 i 轮 要比较 N-i 次。
对此我们可以用双重循环语句,外层循环控制循环轮次,内层循环控制每轮的比较次数
http://www.cnblogs.com/wgq123/p/6529450.html
function bubble_sort($array)
{
$len = count($array);
for ($i = 0; $i < $len - 1; $i++) {
for ($j = 0; $j < $len - 1 - $i; $j++) {
if ($array[$j] > $array[$j + 1]) {
$tmp = $array[$j + 1];
$array[$j + 1] = $array[$j];
$array[$j] = $tmp;
}
}
}
return $array;
}
$array = array(1, 5, 2, 7, 8, 0);
print_r(bubble_sort($array));
快速排序
找到当前数组中的任意一个元素作为标准,新建两个空数组,遍历整个数组元素;
如遍历到的元素比当前的元素小,就放到左边的数组,否则放到右面的数组,然后再对新数组进行同样的操作;
这里符合递归的原理,所以我们可以用递归来实现;
使用递归,则需要找到递归点和递归出口:
递归点:如果数组的元素大于1,就需要再进行分解,所以我们的递归点就是新构造的数组元素个数大于1
递归出口:我们什么时候不需要再对新数组不进行排序了呢?就是当数组元素个数变成1的时候,所以这就是我们的出口。
$array = array(5, 2, 7, 4, 8);
function quick_sort($array) {
if (count($array) <= 1) return $array;
$left = $right = array();
for ($i = 1; $i < count($array); $i++) {
if ($array[$i] < $array[0]) {
$left[] = $array[$i];
} else {
$right[] = $array[$i];
}
}
$left = quick_sort($left);
$right = quick_sort($right);
return array_merge($left, array($array[0]), $right);
}
print_r(quick_sort($array));
二分查找
二分查找前提:数组是一个有序的数组;
首先取得初始下标、结束下标,然后获取中间一个值的下标,然后中间的值跟需要查找的数做对比;
如果中间的值大于需要查找的值,说明需要查找的值在前一段,需要再次二分,所以此时结束下标为中间值下标-1,反之初始下标为中间值下标+1;
function binary_search($needle, $array) {
$start = 0;
$end = count($array) - 1;
while ($start <= $end) {
$middle = floor(($start + $end) / 2);
if ($array[$middle] == $needle) return '下标为:' . $middle;
if ($array[$middle] > $needle) $end = $middle - 1;
if ($array[$middle] < $needle) $start = $middle + 1;
}
return '没有找到';
}
$array = array(1, 2, 3, 4, 5, 6);
print_r(binary_search(4, $array));
支付宝、微信、第三方托管 接口开发中需要注意的安全点
- 严格遵照接口文档进行开发
- 验证用户是否支付成功、支付金额
- 验证支付签名、支付平台来源
- 合理化设置订单生成规则
myisam innodb 区别
myisam:
1. 表锁
2. 非聚集索引,数据与索引分离的
3. 支持全文索引,查询效率高,适合select 读取快
innodb:
1. 行锁
2. 事务
3. 外键
4. 聚集索引,数据与索引存放在一起
5. 适合大量的update delete insert操作
mysql 多列索引 单列索引 的使用
- 多列索引(复合索引)主要是为了解决单列索引(普通索引)在使用 where 条件的时候 and 关键字带来的多个索引的效率问题
select * from course where aid = 10 and unit_id = 12 and chapter_id = 213;
aid、unit_id、chapter_id 最好建立多列索引 而不是建立 多个单列索引
memcache redis 区别
memcache:
单一的数据结构key - value
redis:
丰富的数据结构string、list、has、set、sorted set
数据持久化,支持RDB、AOF两种方式
支持主从复制
什么是事务
事务:是一系列的数据库操作,是数据库应用的基本逻辑单位
事务特性:
1)原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。
2)一致性:事务的执行使得数据库从一种正确状态转换成另一种正确状态
3)隔离性:在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务,
4)持久性:事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。
事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。
什么是锁
数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。
加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。
基本锁类型:锁包括行级锁和表级锁
遍历文件夹
function scan_dir($dir)
{
$array = array(); // 定义一个空数组,用于存放遍历的目录
$resource = opendir($dir); // 打开目录,并返回目录句柄
while (($file = readdir($resource)) !== false) { // 当能够读取目录时,执行以下循环
if ($file != '.' && $file != '..') { // 排除此两个目录
if (is_dir($dir . '/' . $file)) { // 如果目录下仍是目录,递归执行
$array[$file] = scan_dir($dir . '/' . $file);
} else {
array_push($array, $file); // 将文件加入列表数组
}
}
}
closedir($resource); // 关闭目录句柄
return $array; // 返回结果数组
}
echo "<pre>";
print_r(scan_dir('F:\www.exam2.com\app'));
echo "</pre>";
在不使用第三个变量的条件下,交换两个变量值
方法1: 使用list()函数
$a = 1;
$b = 2;
list($b, $a) = array($a, $b);
方法2: 使用数学方法
$a = 1;
$b = 2;
$a = $a + $b;
$b = $a - $b;
$a = $a - $b;
PHP开发中,禁用cookie之后,如何使用session?
方法一:可以启用url传值的方式来使用
index.php 存储session值
<?php
session_start();
$_SESSION['username34'] = 123456789;
?>
<a href="text.php?PHPSESSID=<?php echo session_id() ?>">另一个页面</a>
text.php 获取session值
<?php
session_id($_GET['PHPSESSID']);
session_start();
echo $_SESSION['username34'];
?>
方法二:可以启用<input type="hidden" value="xxx">的方式来使用
HTTP协议理解
引用:
- 当输入www.baidu.com之后,页面发生了哪些事情
- 域名解析
域名解析检查顺序为:
>> 浏览器自身DNS缓存
>> 系统自身的DNS缓存
>> 读取host文件
>> 本地域名服务器
>> 权限域名服务器
>> 根域名服务器
如果有且没有过期,则结束本次域名解析。域名解析成功之后,进行后续操作 - tcp 3次握手建立连接
- 客户端发起http请求,服务器响应http请求
- 客户端获取http请求内容,然后解析html内容,然后请求html中的静态资源
- 客户端渲染html内容
-
http主要请求分为两种方式:get、post
-
http是一个基于请求和响应模式的,无状态的应用层超文本传输协议
-
http因为是无状态的会话服务,所以引入cookie、session会话机制来解决此种无状态问题
-
http请求由三部分组成:请求行、请求头、请求体
-
http响应由三部分组成:响应行、响应头、响应体
请求行:请求方法 请求资源路径 http协议版本
GET /resources/images/ HTTP/1.1
响应行:http协议版本 状态码 状态码描述
HTTP/1.1 200 OK
- http响应状态码
1xx 指示信息
2xx 成功
3xx 重定向
4xx 客户端信息
5xx 服务端信息
shell 编程
step=1
for (( i = 0; i < 60; i=(i+step) )); do
curl http://www.runpicture141.com/index.php
sleep $step
done
exit 0
crontab -e
* * * * * /bin/sh /home/shell/index.sh >/dev/null 2>&1
TCP与UDP协议的区别
tcp:打电话
udp: 写信
int(10) 与 int(11) 有什么区别?
- int(10)、int(11) 只是在显示效果上不一样,存储长度上没有区别都只能存储10个字符
- int(M) M只代表MySQL的一些交互工具用来显示字符的个数,存储长度取决于是否设置为unsigned
网友评论