Finder 当前路径打开 Terminal 的小插件December 7, 2011

码农在 Mac 折腾的时候都会在 Finder 和 Terminal 之中切换,所以在 Finder 中打开 Terminal 这个插件并不可少。其实这样的小工具已经有很多现成的,例如这个

出于折腾以及洁癖等心理作祟,还是自己用 AppleScript 写了个,好处就是可以无视系统的兼容问题。

http://files.gracecode.com/2011_12_07/1323223251.png

安装方法很简单,下载压缩包以后直接把程序图标拖动到 Finder 中的工具栏中即可。当然,如果你是键盘控的话,完全可以设定个快捷键。

顺便说一句,这个 app 可以用 「AppleScript 编辑器」 打开编辑。OK,希望这个小玩意能帮到你。

— EOF —

PHP 5.4 的 Trait 特性(翻译整理)November 18, 2011

原文: http://www.xpertdeveloper.com/2011/11/trait-in-php/

Trait 是 PHP5.4 中的新特性,是 PHP 多重继承的一种解决方案。例如,需要同时继承两个 Abstract Class, 这将会是件很麻烦的事情,Trait 就是为了解决这个问题。

简单使用

首先,当然是声明个 Trait,PHP5.4 增加了 trait 关键字

trait first_trait {
    function first_method() { /* Code Here */ }
    function second_method() { /* Code Here */ }
}

同时,如果要在 Class 中使用该 Trait,那么使用 use 关键字

class first_class {
    // 注意这行,声明使用 first_trait
    use first_trait;
}

$obj = new first_class();

// Executing the method from trait
$obj->first_method(); // valid
$obj->second_method(); // valid

使用多个 Trait

在同个 Class 中可以使用多个 Trait

trait first_trait
{
    function first_method() { echo "method1"; }
}

trait second_trait {
    function second_method() { echo "method2"; }
}

class first_class {
    // now using more than one trait
    use first_trait, second_trait;
}

$obj= new first_class();

// Valid
$obj->first_method(); // Print : method1

// Valid
$obj->second_method(); // Print : method2

Trait 之间的嵌套

同时,Trait 之间也可以相互的嵌套,例如

trait first_trait {
    function first_method() { echo "method1"; }
}

trait second_trait {
    use first_trait;
    function second_method() { echo "method2"; }
}

class first_class {
    // now using 
    use second_trait;
}

$obj= new first_class();

// Valid
$obj->first_method(); // Print : method1

// Valid
$obj->second_method(); // Print : method2

Trait 的抽象方法(Abstract Method)

我们可以在 Trait 中声明需要实现的抽象方法,这样能使使用它的 Class 必须实现它

trait first_trait {
    function first_method() { echo "method1"; }

    // 这里可以加入修饰符,说明调用类必须实现它
    abstract public function second_method();
}

class first_method {
    use first_trait;

    function second_method() {
        /* Code Here */
    }
}

Trait 冲突

多个 Trait 之间同时使用难免会冲突,这需要我们去解决。PHP5.4 从语法方面带入了相关 的关键字语法:insteadof 以及 as ,用法参见

trait first_trait {
    function first_function() { 
        echo "From First Trait";
    }
}

trait second_trait {
    // 这里的名称和 first_trait 一样,会有冲突
    function first_function() { 
        echo "From Second Trait";
    }
}

class first_class {
    use first_trait, second_trait {
        // 在这里声明使用 first_trait 的 first_function 替换
        // second_trait 中声明的
        first_trait::first_function insteadof second_trait;
    }
}  

$obj = new first_class();

// Output: From First Trait
$obj->first_function();

需要注意的几点

上面就是些 Trait 比较基本的使用了,更详细的可以参考官方手册。这里总结下注意的几 点:

-- Split --

一些看法

坦白讲,我第一眼看到 Trait 对它并没有任何好感。PHP5 以来带来的新特性已经足够得 多,而且让开发者们有点应接不暇。

同时,Trait 更像是程序员的「语法糖」,然而它提供便利的同时可能会造成巨大的隐患。 例如 Trait 能够调用类中的成员:

trait Hello {
    public function sayHelloWorld() {
        echo 'Hello'.$this->getWorld();
    }
    abstract public function getWorld();
}

class MyHelloWorld {
    private $world;
    use Hello;
    public function getWorld() {
        return $this->world;
    }
    public function setWorld($val) {
        $this->world = $val;
    }
}

同时,针对类中已经实现的方法,Trait 没有效果

trait HelloWorld {
    public function sayHello() {
        echo 'Hello World!';
    }
}

class TheWorldIsNotEnough {
    use HelloWorld;
    public function sayHello() {
        echo 'Hello Universe!';
    }
}

$o = new TheWorldIsNotEnough();
$o->sayHello(); // echos Hello Universe!

那么 Trait 的出现是为何呢?有哥们的回答比较有意思,但不无道理:

因为php没有javascript作用域链的机制,所以无法把
function bind到class里面,曾经以为php 5.3的闭包
可以做这个事,最后才发觉作用域的设计不允许这么干

但话说回来,拿 interface 和 Trait 类比,显然 Trait 有更多方便的地方(虽然 两者不能完全相互替代)。

不过很显然 Trait 目前还处于测试阶段,它的未来相比其他 PHP5 新推来的特性还有 更多让人观望的地方,但或许这特性能改变 PHP5 未来继承的方式。

因为,我个人坚信 PHP 的作用链设计迟早会改得「更像 JavaScript」,即便这事情会在遥远的 PHP6 。

参考链接

-- EOF --

随记 Google Developer Day 2011November 6, 2011

有幸参加了今年的 GDD,这里主要记录下对于当天所见的所得。

从时间和会场的安排上来看,一天的时间、两个会场想要同时听遍所有的演讲是不可能的。从技术方向来看,今年的 GDD 明显分成了 HTML5 和 Android 俩大块。由于目前工作的关系,我更多的参加了有关 Android 的内容演讲。

http://s0.i1.picplzthumbs.com/upload/img/ad/fc/2d/adfc2d40247febc41ceac0af56c7a1704c768d22_wmeg_00001.jpg

Android 其实还是舶来品

Google 的工程师 Galpin 在讲述 Android4.0 新功能的时候,我特意留意了下现场参会者的手机。比较有趣的一点是现场参与者的手机程三大派系:iOS 设备(iPhone4 居多)、非智能手机(NOKIA 居多)、还有就是各种 Android 设备。

当然,这个现场其实很容易找到原因,有可能是 GDD 本身就是非盈利性的会议,来者的背景各种各样;同时,这会其实是 Google 自己的产品推介会(即便是面向开发者),所以推广产品的氛围会大于技术讨论。

根据我对些数据的掌握,从地理上说南北方的差异还是很大的。iOS 似乎在上海这座城市明显比 Android 设备要多些(在地铁上的观察),这是否预示着 iOS 设备比各种 Android 设备更受人欢迎些?

Google 是「版本控」

回到 Android4.0 本身,先对于新功能本身不做任何的评论。单单对比其版本号,就十分的有意思。iOS 从 1.0 发展到 5.0 用了将近四年的时间,而 Android 从 1.5 发展到 4.0 只用了不到二十个月(当然,这没法和 Chrome 比)。

会议间坐我旁边的哥们带点报怨的口气在揶揄:「不用等到 2012,我们就可以用的上 5.0 ,和 iOS 看齐了!」。版本号的迅速提升显然对于开发者而言是个坏消息,Google 这做法我想是出于商业和推广考虑。

Google Maps?

似乎每次 GDD 都会有个主题,这次的 GDD 有大量的 Google Maps 上的技术推广。从技术角度上讲,有关 Google Maps 的技术阐述并不十分的复杂。

今年主讲 Google Maps 我不得不讲前几天传出 Google Maps 将要收费的传闻联系起来。

虽然官方并没有对此做任何正面的回应,但一旦如果其收费,那么对于开发者而言,Google Maps 将会是他们的成本还是新的赢利点?

毕竟,从目前的市场情况而言,Google Maps 是绝对占有领导性的地位的。

Web VS. Native

今年 GDD 分成 Android 与 HTML5 俩大块,实际上按照我的理解其实就是 Native App 与 Web App 的两大不同派系的技术发展方向。

很明显,从各会场的参与人数就可以看出,上海开发者对于 Android 的兴趣目前占有绝对的优势。不过也可以了解到,很多都是想往 Android 平台上转移的开发人员(他们或许是上述使用 NOKIA 的一员?)。

一直在追赶

据 Google 官方的阐述,Android 市场的下载量首次超过 iOS。个人对于这新闻并不十分的激动,在我看来 Google 过于强调数量而忽略了质量。

同比想到了 Google 近期的一系列调整,我不得不说「Google,你还是别追了,另外条路更适合你」。

— EOF —

Yahoo 统计