资讯专栏INFORMATION COLUMN

php tricks

Karrdy / 1429人阅读

摘要:存储的文件是以来进行命名的,文件的内容就是值的序列话之后的内容,。是键值,是的结果。使外部调用时只要知道这个方法的存在多态父类的方法继承的到子类以后可以有不同的实现方式继承书教材计算机类教材这就是现实世界的继承关系。

1.函数并立即调用

    call_user_func(function(){
            echo "hello,world";
    });

2.上下文变量

    $context="hello,world";
    call_user_func(function()use($context){
        echo $context;
    });

3.use和$this

    class A {

     public  $t;
     public function  __construct($t="hello,world"){
         $this->t=$t;
     }

     function test(){

         call_user_func(function(){
                 echo $this->t;//php5.4+
         });
     }


 }


 $a=new A();
 $a->test();

class Hello {

    private $message = "Hello world
";

    public function createClosure() {
        return function() {
            echo $this->message;
        };
    }

}

class Bye {

    private $message = "Bye world
";

}

$hello = new Hello();
$helloPrinter = $hello->createClosure();
$helloPrinter(); // outputs "Hello world"
$bye = new Bye();
$byePrinter = $helloPrinter->bindTo($bye, $bye);//like javascript apply
$byePrinter(); // outputs "Bye world"

$CI = $this;
$callback = function () use (&$CI) {
$CI->public_method();
};

4.调用一切可调用的东西

    class Contrller{ 


    //调用具体的action,
    public function __act($action){
        call_user_func(
            array($this,$action) 
        ); //$this->{$action}()
    }

}

class HelloContrller extends Controller{ 

    public function index(){
    }

    public function hello(){
    }

    public function dance(){
    }

}

5.装饰器

    //装饰器
 $dec=function($func) {
     $wrap=function ()use ($func) {
     echo "before calling you do sth
";
     $func();
     echo "after calling you can do sth too
 ";
     };
     return $wrap;
 };

 //执行某功能的函数
 $hello=function (){
     echo "hello
";
 };
 //装饰
 $hello=$dec($hello);



 //在其他地方调用经过装饰的原函数
 $hello(); 

/*output:
before calling you do sth
hello
after calling you can do sth too
*/ 

6.object

$obj = new stdClass;
$obj->a = 1;
$obj->b = 2;

7.static

class father
{
    public function __construct()
    {
        // $this->init();
      static::init();
    }

    private function init()
    {
        echo "father
";
    }
}

class son extends father
{
    /*public function __construct()
    {
        $this->init();
    }*/
    public function init()
    {
        echo "son
";
    }
}

$son  = new son();
son::init();//son

8.list explode

    list( , $mid) = explode(";", "aa;bb;cc");
    echo $mid; //输出 bb

9.object array

    $array = json_decode(json_encode($deeply_nested_object), true);
    //$array =  (array) $yourObject;
    function object_to_array($data){
    if (is_array($data) || is_object($data))
    {
        $result = array();
        foreach ($data as $key => $value)
        {
            $result[$key] = object_to_array($value);
        }
        return $result;
    }
    return $data;
}

10.tree

    function displayTree($array){
      $newline = "
"; $output = ""; foreach($array as $key => $value) { if (is_array($value) || is_object($value)) { $value = "Array()" . $newline . "(
    " . $this->displayTree($value) . "
)" . $newline; } $output .= "[$key] => " . $value . $newline; } return $output; }

11.交换变量
list($a, $b) = array($b, $a);
12.PHP中SESSION反序列化机制

修改php系列化的引擎, ini_set("session.serialize_handler", "需要设置的引擎");ini_set("session.serialize_handler", "php_serialize");默认是以文件的方式存储。
存储的文件是以sess_sessionid来进行命名的,文件的内容就是session值的序列话之后的内容,name|s:6:"spoock";。name是键值,s:6:"spoock";是serialize("spoock")的结果。
13.php-fpm

vi /etc/php-fpm.d/www.conf

TPC socket

listen = 127.0.0.1:9000
Unix Domain Socket (Apache 2.4.9+)
listen = /var/run/php-fpm/php-fpm.sock

没有sock文件的话先设置listen = /var/run/php-fpm/php-fpm.sock,然后重启下php-fpm就有了
14.php和js数组区别

JS:数组属于引用类型值,存储在堆中https://www.zhihu.com/questio...
var a = {"Client":"jQuery","Server":"PHP"};
var b = a;
a["New"] = "Element";
console.log(b);
// 输出 Object { Client="jQuery", Server="PHP", New="Element"}

PHP例程1:
$a = array("Client"=>"jQuery","Server"=>"PHP");
$b = $a;
$a["New"] = "Element";
var_export($b);
//输出 array("Client"=>"jQuery","Server"=>"PHP")

PHP例程2:
$a = array("Client"=>"jQuery","Server"=>"PHP");
$b = &$a; //引用赋值
$a["New"] = "Element";
var_export($b);
//输出 array("Client"=>"jQuery","Server"=>"PHP","New"=>"Element")
PHP对象默认是引用赋值,而不是值复制:
class foo {

public $bar = "php";

}
$foo = new foo();
$tmp = $foo;//$tmp = clone $foo;值复制
$tmp->bar = "sql";
echo $foo->bar."n"; //输出sql
15.编码
“中”这个汉字在UTF-8的16进制编码是0xe4,0xb8,0xad
因此在双引号字符串中,会被转义为 “中” x开头表示这是一个以十六进制表达的字符,就和HTML中&xe4; 一样 PHP中的字符串就是直接本地编码二进制存储的
单引号字符串中,直接输出xe4xb8xad
$str1 = "xe4xb8xad";中

$str2 = "xe4xb8xad";xe4xb8xad

$str3 = "中";
16.数据库连接
new mysqli时通过p:127.0.0.1来表示使用持久连接,里面的p就是persistent持久的意思
function db() {

static $db; //静态变量
if ($db) {
    return $db;
} else {
    $db = new mysqli("p:127.0.0.1","user","pass","dbname",3306);
    return $db;
}

}
function foo1() {

return db()->query("SELECT * FROM table1")->fetch_all();

}
function foo2() {

return db()->query("SELECT * FROM table2")->fetch_all();

}
var_export( foo1() );
var_export( foo2() );

function db() {

static $db; //静态变量
if ($db) { return $db; } 
else { $db = uniqid(mt_rand(), true); return $db; }

}
function foo1() { return db(); }
function foo2() { return db(); }
echo foo1()."n";
echo foo2()."n";
17 面向对象
继承:可以使子类复用父类公开的变量、方法;
封装:屏蔽一系列的细节。使外部调用时只要知道这个方法的存在;
多态:父类的方法继承的到子类以后可以有不同的实现方式;
继承:书 & 教材 & 计算机类教材 —— 这就是现实世界的继承关系。
封装:手机 —— 它是封装好的,当你使用它时,不必知道里面的电路逻辑。
多态:人.看(美女) & 人.看(强光) —— 参数类型不一样,执行的也不一样。
https://segmentfault.com/a/11...
18.数字前自动补0
$a = 1;
echo sprintf("%02d", $a);//输出该数字,若十位、个位为空或0,自动补零
$a = "01";
echo sprintf("%d", $a);//去0
function addZ(a){

return ("0" + a).slice(-2);

}
19.html5 使用 Content-Security-Policy 安全策略
与ios 交互使用jsbridge库需要添加信任的frame-src
; style-src "self" http://.xxx.com "unsafe-inline"; script-src "self" "unsafe-inline" "unsafe-eval" http://.xxx.com;">
20.php数组转js数组
var mapRegion =
21.浮点数精度 四舍六入五成双

银行家舍入 的方法,即:

舍去位的数值小于5时,直接舍去;
舍去位的数值大于等于6时,进位后舍去;
当舍去位的数值等于5时,分两种情况:5后面还有其他数字(非0),则进位后舍去;若5后面是0(即5是最后一位),则根据5前一位数的奇偶性来判断是否需要进位,奇数进位,偶数舍去。
49.6101 -> 50
49.499 -> 49
49.50921 -> 50
48.50921 -> 48
48.5101 -> 49
function tail($num, $fen) {

$avg  = bcdiv($num, $fen, 2); //除
$tail = bcsub($num, $avg*($fen-1), 2); //减
echo $num."=".str_repeat($avg."+", $fen-1).$tail."
";
echo "$num=$avg*($fen-1)+$tail
";
return array($avg, $tail);

}
var_export(tail(100, 3));
var_export(tail(100, 6));
//输出:
100=33.33+33.33+33.34
100=33.33*(3-1)+33.34
array (
0 => "33.33",
1 => "33.34",
)
100=16.66+16.66+16.66+16.66+16.66+16.70
100=16.66*(6-1)+16.70
array (
0 => "16.66",
1 => "16.70",
)
来自
知乎
http://stackoverflow.com/ques...
http://stackoverflow.com/ques...
https://www.quora.com/What-ar...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/20974.html

相关文章

  • Learning PHP —— 设计模式 | Chap1:浅谈设计模式中的OOP

    摘要:而哈士奇区别于普通狗,又有新的特征逗比,爱捣乱为了保证类之间的松绑定,通常会继承抽象类,而且是浅继承只有一层子类。如果知道所有类都会共享一个公共的行为实现,就使用抽象类,并在其中实现该行为。 为什么使用OOP OOP是一个模块化的过程,目的是为了把复杂问题简单化,一个模块解决一个复杂问题的某一个方面,即一个类应当只有一个职责 OOP区别于顺序式编程与过程式编程,在于: 1.顺序编程...

    SunZhaopeng 评论0 收藏0
  • Nodejs中的一些小trick

    摘要:要达到想要的效果正确的做法是即用来产生一个立即作用域,保证回调函数执行的时候最近的原型作用域的就是当时循环的。判断数组中是否存在满足条件的项,只要有一项满足条件,就会返回。 之前常常因为不注意,习惯用写PHP或者Java的方式来写nodejs,产生了了一些错误,这里总结一些小小的trick,以便于展示nodejs的不同,和平时需要注意的地方。 变量提升 var variable = g...

    tomorrowwu 评论0 收藏0
  • python 类和元类(metaclass)的理解和简单运用

    摘要:什么是元类刚才说了,元类就是创建类的类。类上面的属性,相信愿意了解元类细节的盆友,都肯定见过这个东西,而且为之好奇。使用了这个魔法方法就意味着就会用指定的元类来创建类了。深刻理解中的元类 (一) python中的类 今天看到一篇好文,然后结合自己的情况总结一波。这里讨论的python类,都基于python2.7x以及继承于object的新式类进行讨论。 首先在python中,所有东西都...

    zhangqh 评论0 收藏0
  • Python Tricks 若干

    摘要:在代码中可以看到一些常见的,在这里做一个简单的小结。的妙用在某些场景下我们需要判断我们是否是从一个循环中跳出来的,并且只针对跳出的情况做相应的处理。这时候我们通常的做法是使用一个变量来标识是否是从循环中跳出的。 在 python 代码中可以看到一些常见的 trick,在这里做一个简单的小结。 json 字符串格式化 在开发 web 应用的时候经常会用到 json 字符串,但是一段比...

    lovXin 评论0 收藏0
  • Python学习之路3-操作列表

    摘要:本章内容主要是对列表的进一步操作,以及初识元组数据结构。列表非常适合用于存储在程序运行期间可能变化的数据集,列表可以被修改。代码结果相比于列表,元组是更简单的数据结构。 《Python编程:从入门到实践》笔记。本章内容主要是对列表的进一步操作,以及初识元组数据结构。 1. 遍历列表 本章主要是for循环: # 代码: magicians = [alice, david, carolin...

    makeFoxPlay 评论0 收藏0

发表评论

0条评论

Karrdy

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<