PHP 常用函数整理——字符串

作者: 分类: php 时间: 2017-08-12 评论: 暂无评论

1.explode(separator,string,limit)
separator 必需。规定在哪里分割字符串。
string 必需。要分割的字符串。
limit 可选。规定所返回的数组元素的数目。0是1个,-1去掉最后一个
2.implode(separator,array)
separator 可选。规定数组元素之间放置的内容。默认是 ""(空字符串)。
array 必需。要组合为字符串的数组。
3.str_split(string,length) 函数把字符串根据长度length分割成数组。
4.str_pad(string,length,pad_string,pad_type)
string 必需。规定要填充的字符串。
length 必需。规定新的字符串长度。如果该值小于字符串的原始长度,则不进行任何操作。
pad_string 可选。规定供填充使用的字符串。默认是空白。
pad_type
可选。规定填充字符串的哪边。
可能的值:
STR_PAD_BOTH - 填充字符串的两侧。如果不是偶数,则右侧获得额外的填充。
STR_PAD_LEFT - 填充字符串的左侧。
STR_PAD_RIGHT - 填充字符串的右侧。默认
5.strlen(string str) 字符串长度
6.substr ( string string, int start [, int length] ) 截取字符串
7.strpos(string,find,start) 查找字符串在另一字符串中第一次出现的位置,大小写敏感。 stripos()大小写不敏感
string 必需。规定要搜索的字符串。
find 必需。规定要查找的字符串。
start 可选。规定在何处开始搜索。
8.strrpos(string,find,start)函数查找字符串在另一字符串中最后一次出现的位置,大小写敏感。 strripos()大小写不敏感
string 必需。规定被搜索的字符串。
find 必需。规定要查找的字符。
start 可选。规定在何处开始搜索。
9.strstr(string,search,before_search) 返回出现那个字符串及之后的所有字符// stristr()大小写不敏感
string 必需。规定被搜索的字符串。
search 必需。规定要搜索的字符串。如果该参数是数字,则搜索匹配该数字对应的 ASCII 值的字符。
before_search 可选。默认值为"false"的布尔值。如果设置为 "true",它将返回 search参数第一次出现之前的字符串部分。
10.substr_replace(string,replacement,start,length)
string 必需。规定要检查的字符串。
replacement 必需。规定要插入的字符串。
start 必需。规定在字符串的何处开始替换
正数 - 在字符串中的指定位置开始替换
负数 - 在从字符串结尾的指定位置开始替换
0 - 在字符串中的第一个字符处开始替换
length 可选。规定要替换多少个字符。默认是与字符串长度相同。
正数 - 被替换的字符串长度
负数 - 表示待替换的子字符串结尾处距离 string 末端的字符个数。
0 - 插入而非替换
11.ucfirst() 函数把字符串中的首字符转换为大写。lcfirst() - 把字符串中的首字符转换为小写
12.strtolower() - 把字符串转换为小写 strtoupper() - 把字符串转换为大写
13.ucwords() - 把字符串中每个单词的首字符转换为大写
14.round(x,prec) 函数对浮点数进行四舍五入。
x 可选。规定要舍入的数字。
prec 可选。规定小数点后的位数。
15.ceil() 函数向上舍入为最接近的整数 floor()函数向下舍入为最接近的整数。
16.parse_str(string,array) 将字符串解析成变量 id=1&&key=dk //ps 可以用 $_SERVER['QUERY_STRING'] 获取url参数
string 必需。规定要解析的字符串。
array 可选。规定存储变量的数组的名称。该参数指示变量将被存储到数组中。$arr['id']=1;

17.sprintf(format,arg1,arg2,arg++)
format 必需。规定字符串以及如何格式化其中的变量。
可能的格式值:
%% - 返回一个百分号 %
%b - 二进制数
%c - ASCII 值对应的字符
%d - 包含正负号的十进制数(负数、0、正数)
%e - 使用小写的科学计数法(例如 1.2e+2)
%E - 使用大写的科学计数法(例如 1.2E+2)
%u - 不包含正负号的十进制数(大于等于 0)
%f - 浮点数(本地设置) 常用
%F - 浮点数(非本地设置)
%g - 较短的 %e 和 %f
%G - 较短的 %E 和 %f
%o - 八进制数
%s - 字符串 常用
%x - 十六进制数(小写字母)
%X - 十六进制数(大写字母)
附加的格式值。必需放置在 % 和字母之间(例如 %.2f):

  • (在数字前面加上 + 或 - 来定义数字的正负性。默认情况下,只有负数才做标记,正数不做标记)
    ' (规定使用什么作为填充,默认是空格。它必须与宽度指定器一起使用。例如:%'x20s(使用 "x" 作为填充))
  • (左调整变量值)
    [0-9] (规定变量值的最小宽度)
    .[0-9] (规定小数位数或最大字符串长度)
    注释:如果使用多个上述的格式值,它们必须按照以上顺序使用。
    arg1 必需。规定插到 format 字符串中第一个 % 符号处的参数。
    arg2 可选。规定插到 format 字符串中第二个 % 符号处的参数。
    arg++ 可选。规定插到 format 字符串中第三、四等 % 符号处的参数。
    格式:
    eg: sprintf("%-'x8.2f",1234) //1234.00x
    %s = %符号和后面属性符号(s)总称为插入标记组合,也就是把后面准备进行格式化的值(%s)替换在这个位置
    $是代表有多个值准备格式化
    '(补位值) 表示补位
    8.2 总宽度3 ,小数2位 小数点算一位,-号表示从右边开始补位
    eg: printf("[%'x4.2s]",1234) //%x.ys这里是截取字符串 显示4位,前面补充2位xx

[转]MySQL MyISAM 和InnoDB 区别

作者: 分类: php 时间: 2017-08-01 评论: 暂无评论

MyISAM 和InnoDB 讲解
  InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能。
  以下是一些细节和具体实现的差别:
  ◆1.InnoDB不支持FULLTEXT类型的索引。
  ◆2.InnoDB 中不保存表的具体行数,也就是说,执行select count() from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count()语句包含 where条件时,两种表的操作是一样的。
  ◆3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
  ◆4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
  ◆5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。
  另外,InnoDB表的行锁也不是绝对的,假如在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”
  两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁。而MyISAM不支持.所以MyISAM往往就容易被人认为只适合在小项目中使用。
  作为使用MySQL的用户角度出发,Innodb和MyISAM都是比较喜欢的,如果数据库平台要达到需求:99.9%的稳定性,方便的扩展性和高可用性来说的话,MyISAM绝对是首选。
  原因如下:
  1、平台上承载的大部分项目是读多写少的项目,而MyISAM的读性能是比Innodb强不少的。
  2、MyISAM的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少。能加载更多索引,而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb比MyISAM体积庞大不小。
  3、经常隔1,2个月就会发生应用开发人员不小心update一个表where写的范围不对,导致这个表没法正常用了,这个时候MyISAM的优越性就体现出来了,随便从当天拷贝的压缩包取出对应表的文件,随便放到一个数据库目录下,然后dump成sql再导回到主库,并把对应的binlog补上。如果是Innodb,恐怕不可能有这么快速度,别和我说让Innodb定期用导出xxx.sql机制备份,因为最小的一个数据库实例的数据量基本都是几十G大小。
  4、从接触的应用逻辑来说,select count() 和order by 是最频繁的,大概能占了整个sql总语句的60%以上的操作,而这种操作Innodb其实也是会锁表的,很多人以为Innodb是行级锁,那个只是where对它主键是有效,非主键的都会锁全表的。
  5、还有就是经常有很多应用部门需要我给他们定期某些表的数据,MyISAM的话很方便,只要发给他们对应那表的frm.MYD,MYI的文件,让他们自己在对应版本的数据库启动就行,而Innodb就需要导出xxx.sql了,因为光给别人文件,受字典数据文件的影响,对方是无法使用的。
  6、如果和MyISAM比insert写操作的话,Innodb还达不到MyISAM的写性能,如果是针对基于索引的update操作,虽然MyISAM可能会逊色Innodb,但是那么高并发的写,从库能否追的上也是一个问题,还不如通过多实例分库分表架构来解决。
  7、如果是用MyISAM的话,merge引擎可以大大加快应用部门的开发速度,他们只要对这个merge表做一些select count(
)操作,非常适合大项目总量约几亿的rows某一类型(如日志,调查统计)的业务表。
  当然Innodb也不是绝对不用,用事务的项目就用Innodb的。另外,可能有人会说你MyISAM无法抗太多写操作,但是可以通过架构来弥补。
转至 http://blog.csdn.net/xifeijian/article/details/20316775

PHP ReflectionClass 反射类

作者: 分类: php 时间: 2017-07-30 评论: 暂无评论
$reflection = new \ReflectionClass($moduleName);  //new 一个反射类ReflectionClass
$reflection->hasMethod($actionName))  //是否存在$actionName 方法
$method = $reflection->getMethod($actionName);  //new 一个反射方法类  ReflectionMethod
$handle = $reflection->newInstance(); //new 一个$moduleName
data = $method->invokeArgs($handle, array($param)); //调用方法 

Lravel 容器实践

作者: 分类: laravel,php 时间: 2017-04-25 评论: 暂无评论
<?php
interface Model{
    public function run();
}


class SuperMan{
    public $model;
    public function __construct(Model $mode)
    {
        $this->model=$mode;
    }
}
class XPower implements Model{
    public function run(){
        echo '发射X-射线';
    }
}



class Container{
    protected $binds;//绑定
    protected $instances;//实例化

    /**
     * 绑定模块
     * @param $abstract  模块关键字
     * @param $concrete  闭包函数 或 实例
     */
    public function bind($abstract,$concrete)
    {
        //如果是闭包函数
        if($concrete instanceof Closure){
            $this->binds[$abstract]=$concrete;
        }else{
            $this->instances[$abstract]=$concrete;
        }
    }
    //模块实例化脚本
    public function make($abstract,$parameters=[])
    {
        if(isset($this->instances[$abstract])){
            return $this->instances[$abstract];
        }
        array_unshift($parameters,$this);
        return call_user_func_array($this->binds[$abstract],$parameters);
    }
}

$container=new Container(); //模块工厂
// 工厂初始化
$container->bind('superman', function($container, $moduleName) {
    return new SuperMan($container->make($moduleName));
});
$container->bind('x-power',function($container){
    return new XPower;
});
echo '<pre>';
$superman = $container->make('superman', ['x-power']);
var_dump($superman);
echo '</pre>';

php 利用openssl加密解密

作者: 分类: php 时间: 2017-02-14 评论: 暂无评论

参考了别人的文章,自己做了笔记

①准备工作
找到php.ini 去掉openssl.dll前面的';'。
找到openssl.cnf的位置,我的在D:\xampp\apache\conf。
配置apache以支持SSL:打开apache的配置文件conf/httpd.conf
LoadModule ssl_module modules/mod_ssl.so、Include conf/extra/httpd-ssl.conf
去掉两行前面的#
注意修改httpd-ssl.conf 文件里的两个字段:
SSLCertificateFile "C:/Apache2.2/conf/server.crt"
SSLCertificateKeyFile "C:/Apache2.2/conf/server.key"

② 代码

<?php
$config = array(
    "private_key_bits" => 1024,                     //字节数    512 1024  2048   4096 等
    "private_key_type" => OPENSSL_KEYTYPE_RSA,     //加密类型
    "config" => "D:/xampp/apache/conf/openssl.cnf"
);

$privkeypass = '123456789'; //私钥密码
$numberofdays = 365;     //有效时长
$cerpath = "./test.cer"; //生成证书路径
$pfxpath = "./test.pfx"; //密钥文件路径

$dn = array(
    "countryName" => "UK",
    "stateOrProvinceName" => "Somerset",
    "localityName" => "Glastonbury",
    "organizationName" => "The Brain Room Limited",
    "organizationalUnitName" => "PHP Documentation Team",
    "commonName" => "Wez Furlong",
    "emailAddress" => "wez@example.com"
);
// 生成公钥私钥资源
$res = openssl_pkey_new($config);

// 导出私钥 $priKey
openssl_pkey_export($res, $priKey,null,$config);

//  导出公钥 $pubKey
$pubKey = openssl_pkey_get_details($res);
$pubKey = $pubKey["key"];
//print_r($priKey); 私钥
//print_r($pubKey); 公钥
//直接测试私钥 公钥
$data = '直接测试成功!';
// 加密
openssl_public_encrypt($data, $encrypted, $pubKey);
// 解密
openssl_private_decrypt($encrypted, $decrypted, $priKey);
echo $decrypted;


//生成文件
$csr = openssl_csr_new($dn, $priKey,$config); //基于$dn生成新的 CSR (证书签名请求)
$sscert = openssl_csr_sign($csr, null, $priKey, 365,$config);//根据配置对证书进行签名
openssl_x509_export($sscert, $csrkey); //将公钥 证书存储到一个文件$sscert,由 PEM 编码格式命名。
openssl_pkcs12_export($sscert, $privatekey, $priKey, $privkeypass); //将私钥存储到名为的出 PKCS12 文件格式的字符串。 导出密钥$privatekey

//生成证书文件
$fp = fopen($cerpath, "w");
fwrite($fp, $csrkey);
fclose($fp);
//生成密钥文件
$fp = fopen($pfxpath, "w");
fwrite($fp, $privatekey);
fclose($fp);




// 测试私钥 秘钥
$privkeypass = '123456789'; //私钥密码
$pfxpath = "./test.pfx"; //密钥文件路径
$priv_key = file_get_contents($pfxpath); //获取密钥文件内容
$data = "测试数据!"; //加密数据测试test
//私钥加密
openssl_pkcs12_read($priv_key, $certs, $privkeypass); //读取公钥、私钥
$prikeyid = $certs['pkey']; //私钥
openssl_sign($data, $signMsg, $prikeyid,OPENSSL_ALGO_SHA1); //注册生成加密信息
$signMsg = base64_encode($signMsg); //base64转码加密信息


//公钥解密
$unsignMsg=base64_decode($signMsg);//base64解码加密信息
openssl_pkcs12_read($priv_key, $certs, $privkeypass); //读取公钥、私钥
$pubkeyid = $certs['cert']; //公钥
$res = openssl_verify($data, $unsignMsg, $pubkeyid); //验证
echo $res?'证书测试成功!':'证书测试失败!';; //输出验证结果,1:验证成功,0:验证失败

ps. 如果用txt编辑器建的密钥文件,记得去掉bom头

附带一篇错误集锦
http://blog.sina.com.cn/s/blog_8da982ac0101lqh1.html

Top ↑