php継承の一つの応用
2880 ワード
これは継承して解決したいと思います。前に発表した会話類は簡単に多くなりました。ログインによってユーザーのレベルを設定します。status()の戻り値が0であれば、現在のユーザはブロガーではないことを示していますので、削除、文章編集の権限はありません。戻り値が1であれば、本人であることを示します。もういいです。無駄話はやめてください。まずコードfoodstory.me/post/{$name}.php'>read moreEeeeに変えます。こんなにすっきりしました。
class operationLimit
// operating limit. When no user login or is not this user
{
/* for limit the user operat at post.
* @author:xiaoai 8.12 2011
*/
static $limitObject;
public function __construct() {}
// when call the function but does not exist
public static function getObject()
{
if( !(self::$limitObject instanceof self))
self::$limitObject = new self;
return self::$limitObject ;
}
protected function setLimit() {}
public function getReadA($postName)
{
return '<a herf=\'http://foodstory.me/post/'.$postname.
'.php\' class=\'readmoreLink\'>readmore</a>';
}
}
class operationUnlimit extends operationLimit
// when is this user
{
public static function getObject()
{
if( !(self::$limitObject instanceof self))
self::$limitObject = new self;
return self::$limitObject ;
}
public function getUpdateA($name)
{
return '<a href=\'http://foodstory.me/post/'.$name.
'.php?do=update\' id=\''.$name.'\' >update</a>';
}
public function getDelectA($name)
{
return '<a href=\'javascript:delectPOST('.$name
.');\' id=\'delectPOST\' >delect</a>';
}
}
class LimitFactory
{
public static function getLimitObject($userStatus)
// $userStatus = $session->get_status();
{
switch ( $userStatus )
{
case 0:
return operationLimit::getObject();
case 1:
return operationUnlimit::getObject();
default:
return limit::getObject();
}
}
}
Limit Factoryは工場の種類で、静的なクラスを兼ねています。すなわち、オブジェクトを構成する必要はなく、入力されたユーザ権限値に基づいて、このリターンoperation Limitクラスまたはoperation Unimitクラスの例を判断するだけの役目である。いくつかの共通の操作があります。例えば、読書がもっと多く、operation Unimit類はこの方法を継承しました。その後、削除を返したり、リンクを更新したりする方法を作成しました。使い方例
$limitObj = LimitFactory::getLimitObject($session->get_status());
echo $limitObj->getReadA('hi');
echo $limitObj->getDelectA('hah');
以下でポイントに関係なく話します。最初に私がoperation Unimit類にgetObject()を書いていなかった時、スタティック方法を発見しました。return operation Unimit:getObject();帰ってきたのは超類の対象で、変な感じがしました。私はget Objectにいます。方法はselfで現在のクラスを表していますが、指定がないと超種類のオブジェクトに戻ります。サブクラスでこの静的な方法を書き直したらOKです。その後googleを調べたら、コンパイラは最初からgetObjectの方法と超種類を結びつけていたので、サブクラスでの呼び出しは依然としてスーパークラスの対象に戻っていることが分かりました。また、文字列の中でそんなに多くの変換記号が分かりにくいと思っているかどうかは、echo<<