php语言特性笔记

一、composer相关

现在composer v2已经发布,可以使用 composer self-update ,更新到版本2。之后可以使用 composer self-update --rollback 来进行回退

二、__call重载

<?php
 class ModeTest
{
    public function __call($m, $n)
    {
        echo "通过call这个函数的名名字为: " . $m . "参数为:" . implode(',', $n) . "\n";
    }

     public static function __callStatic($m, $n)
    {
        echo "通过static这个函数的名名字为: " . $m . "参数为:" . implode(',', $n) . "\n";
    }
}

$a = new ModeTest();
$a->abc('good');

ModeTest::ggd("哈哈");

执行返回:
通过call这个函数的名名字为: abc参数为:good
通过static这个函数的名名字为: ggd参数为:哈哈

三、自定义回调函数call_user_function

<?php
function aa($m) {
    echo "你好呀".$m . "\n";
}

## 

call_user_func('aa', "100");

执行返回:

四、php错误日志级别

Monolog (一个功能强劲的 Laravel 日志服务)接受定义在 RFC 5424 specification 中的全部级别: 
emergency、alert、critical、error、warning、notice、info 和 debug。

一种快速传递php require的办法

foreach(glob(__DIR__.'/Applications/*/start*.php') as $start_file)
{
    require_once $start_file;
}

获取PHP扩展目录

php-config --extension-dir 
输出路径,即为PHP扩展所在的目录

mac下安装php mongo扩展

在macOS中,MongoDB 扩展已经从Homebrew仓库中移除,需要通过pecl安装此扩展
sudo pecl install mongodb

中文字符串,8进制 16进制,urlencode之间的转换

起因:
使用php编写脚本:

//检测输入,直到获取输入为##
while(($input = fgetc(STDIN)) != '#') {
    echo $input;
}
echo "ok,检测到结束字符串#, 退出!";
return;

在程序执行时输入字符串加#后,程序退出。使用strace -fp pid追踪程序调用,看到

write(1, "ok\357\274\214\346\243\200\346\265\213\345\210\260\347\273\223\346\235\237\345\255\227\347\254\246\344\270\262#, "..., 41) = 41

这样一个字符串,很好奇\357\274\214\346\243\200\346\265\213\345\210\260\347\273\223\346\235\237\345\255\227\347\254\246\344\270\262部分是怎么产生的的。查资料得知,这是一个八进制表示。遂想要把此字符串还原为中文字符串。
找到以下程序

#中文字符串,检测到结束字符串#, 退出!
$str='\357\274\214\346\243\200\346\265\213\345\210\260\347\273\223\346\235\237\345\255\227\347\254\246\344\270\262';
$arr=explode('\\',ltrim($str,'\\'));
$bs='';
foreach($arr as $v){
    $bs.='%'.base_convert($v,8,16);
}
echo urldecode($bs);

此程序原理:去除字符串首部一个 \
然后字符串 \ 分割为数组,把每个一8进制的值转换为16进制。然后首部%拼接,形如:%ef%bc%8c,然后对这个urlencode后的字符串进行decode。得出结果: ,检测到结束字符串#, 退出!

本文链接:目录"--EOF--