2007年6月13日星期三

The Template Method Pattern in PHP 5

php5模板方法模式


节选翻译,原文: http://www.zend.com/zend/php5/php5-OOP.php

什么是模板方法模式?定义一个操作中算法的骨架,将一些步骤的执行放到其子类中.
这是一种重要的代码重用技术。模板方法模式通常用在类库中提取类的共同的行为。
模板方法设计模式可以让子类去重新定义一个操作中的某些步骤,而不用去改变这个操作的结构。
这些可重新定义的步骤可以在基类中标为强制的或者可选的。由于这些步骤都会归于单独的方法,所以子类必须为强制的步骤提供一个实现方法,可选的则可以忽略。

模板方法可以实现一个操作中不变的部分,把那些可能变化的行为留给子类实现。也可以用于仅在在指定点提供hook操作来给子类扩展行为。

例子


Listing 1. AbstractClass.php



Listing 1 显示了一个迷你的模板方法,叫做 templateMethod()。它使用了两个方法:mandatoryOperation() 和 optionalOperation(), 这两个可以在子类中重定义。
abstract class AbstractClass {
public final function templateMethod() {
print "AbstractClass::templateMethod() called.\n";

$this->mandatoryOperation();
$this->optionalOperation();
}

protected abstract function mandatoryOperation();

protected function optionalOperation() {
}
}



Listing 2: ConcreteClass.php



Listing 2 显示了一个和 AbstractClass 类对应的子类。 ConcreteClass 重定义了mandatoryOperation() 和 optionalOperation() 方法。

require_once 'AbstractClass.php';

class ConcreteClass extends AbstractClass {
protected function mandatoryOperation() {
print "ConcreteClass::mandatoryOperation() called.\n";
}

protected function optionalOperation() {
print "ConcreteClass::optionalOperation() called.\n";
}
}


Listing 3: example.php



最后, Listing 3 显示了如何调用 ConcreteClass 。

require_once 'ConcreteClass.php';

$o = new ConcreteClass;
$o->templateMethod();


输出:
AbstractClass::templateMethod() called.
ConcreteClass::mandatoryOperation() called.
ConcreteClass::optionalOperation() called.

2007年6月3日星期日

使用 Zend_Console_Getopt 处理 PHP 命令行

Linux 下写Shell只要在第一行加上
#!/path/to/php
然后将脚本加上执行属性即可 chmod +x

注意:Windows下编程再上传的朋友要注意。换行必须以linux格式,否则脚本会报错

require_once 'Zend/Console/Getopt.php';

定义规则:

使用短语
$opts = new Zend_Console_Getopt('abp:');

使用长语法
$opts = new Zend_Console_Getopt(
array(
'apple|a' => 'This option chooses apple, with no parameter',
'banana|b=i' => 'This option chooses banana, with required integer parameter',
'pear|p-s' => 'This option chooses pear, with optional string parameter'
)
);


捕获异常
try {
$opts = new Zend_Console_Getopt('abp:');
$opts->parse();
} catch (Zend_Console_Getopt_Exception $e) {
echo $e->getUsageMessage();
exit;
}


获取命令行选项和参数
$b = $opts->getOption('b');
$p = $opts->getOption('p');


另一种方法是使用 __get() and __isset() 魔术方法
if (isset($opts->b)) {
echo "I got the b option.\n";
}
$p = $opts->p; // null if not set