之前吐槽过PHP为什么没__compare魔术方法《PHP __compare?》,可能开发组觉得没有必要吧,毕竟对象默认的比较一般情况已经够用了。 于是乎怀着no zuo no die心情尝试去实现一下,发现难度比预想要小。但由于拖延症的原因这篇文拖到现在才写,还有一方面就是修改的地方比较多和杂乱。

先看看效果吧!

<?php
//默认情况
class Foo
{
    private $v = [];

    public function __construct(array $v) {
        $this->v = $v;
    }
}

$o1 = new Foo([1, 2, 3]);
$o2 = new Foo([2, 1, 4]);
var_dump($o1 > $o2);
/* output */
bool(false)

//添加 __compare
class Foo
{
    private $v = [];

    public function __construct(array $v) {
        $this->v = $v;
    }

    public function __compare($o) {
        return $this->v[1] > $o->v[1];
    }
}

$o1 = new Foo([1, 2, 3]);
$o2 = new Foo([2, 1, 4]);
var_dump($o1 > $o2);
/* output */
bool(true)

可以看出,$o1, $o2的比较行为已经被__compare改变

Read more...

感觉比较实用的两个array函数,为了熟悉一下HashTable的操作就写成了extension的形式

array_insert


–对应index插入值得的值
array array_insert ( array $input , int $index , mixed $value )

示例:

<?php
$arr = ['a' => 1, 'b' => 2, 'c' => 3, 4];
var_dump(array_insert($arr, -1, ['foo', 'bar']));
/* output */
array (size=5)
  'a' => int 1
  'b' => int 2
  'c' => int 3
  0 => 
    array (size=2)
      0 => string 'foo' (length=3)
      1 => string 'bar' (length=3)
  1 => int 4

Read more...

在鸟哥《深入理解PHP原理之对象(一)》看到一段挺有意思的代码

“PHP通过这种比较ugly但是简单高效的方法, 实现了对属性访问权限的标识.知道了, 我们就可以干一些不合常理的事请, 比如访问对象的私有/保护属性”

<?php
class Foo {
    private $_name = "laruence";
    protected $_age = 28;
}
$foo = new Foo();
$arr = (array) $foo;
var_dump($arr["\0Foo\0_name"]);
var_dump($arr["\0*\0_age"]);
//output:
string(8) "laruence"
int(28)

至于这算不算BUG本文就不议论了,有兴趣的可以看看这里 (见: Bug #44273 access to private and protected class variables allowed when casting to array ): 下面有相关议论

Read more...

在这里搭建起博客源于和 @AproSane的一次交谈。 之前他的博客是挂在GAE的,但是由于抠门的配额不得不迁移,找到了这个VPS。 很小巧,并且支持Go,Python什么的,最主要便宜到烂,于是我也买了。 然后想了想做Web开发也一段时间了没有一个域名不像话,接着就买了四年了这域名, 所以就有了这博客。

当然这VPS并不是单单有用搭建博客,还有用来运行一些“实验性”的东西。还是说回 博客吧。最近在看Go Web的内容并且和@AproSane担心 的一样,怕VPS哪天跪了,所以还是做静态博客吧,选用了Gor生成。我的发布流程是这样的,本地编辑编译,然后提交到github,接着VPS那边更新就好。

说到博客数一数都好几个,百度的,OSC的,SAE的(贴在about me),其实没心思写,说忙是一回事,但最主要还是自己懒吧。想导出迁移到这里,但是一直不顺利,估计就这样算了。


2014-05-09 把博客的生成器换成了jekyll,因为一直有听说这东西,所以现在试一下,虽然一点都不懂ruby,但最近在看《代码的未来》

在看《PHP之道》时有这么一段代码

<?php
$raw = '22. 11. 1968';
$start = \DateTime::createFromFormat('d. m. Y', $raw);
echo 'State date: ' . $start->format('m/d/Y') . "\n";

$end = clone $start;
$end->add(new \DateInterval('P1M6D'));

$diff = $end->diff($start);
echo "Difference: " . $diff->format('%m month, %d days (total: %a days)') . "\n";

if($start < $end) {
    echo "Start is before end!\n";
}

$start < $end 引起了我的注意,印象中并没有__compare之类的魔术方法,翻了下手册确实没找到,也没相关实现,那为什么这里可以直接比较呢?因为这是built-in class,所以需要翻一下源码。(已下代码版本是 5.4.27)

Read more...