Strings of Life

PHP/Phalcon/MySQL/JavaScript/RegExp/Ruby/Perl/ActionScript

2013年03月

以前、SublimeText2をターミナル経由で起動できない問題にハマってたのだけど、解決したのでメモ。


参考にした記事:PHPerがMacbookAirを買ったら直ぐにすること 2012

↑の記事のCotEditorの部分をSublimeText2に読みかえればOK。ですが、一応手順を書いておきます。

(1) ホームディレクトリに.bash_profileと.bashrcを作成する(touchで、同名ファイルが存在しない場合に空のファイルを作成する)

(2) .bash_profileに以下の記述を追加
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

(3) .bashrcに以下の記述を追加
alias subl='open -g -a Sublime\ Text\ 2'
※openコマンドの「-g」オプションは、「ファイルを開いたアプリケーションを最前面に表示しない」、「-a Application」オプションは、「指定したアプリケーションで開く」。
詳しくはMacWiki -コマンド/open

(4) ターミナル再起動
(5) 「subl」コマンドでSublimeText2を起動

2013-03-04追記


以下の記述で私が参照していたのは、Smartyバージョン2のドキュメントでした。Smartyバージョン3のドキュメントには、parent::__construct()とする書き方が載っています。




Smartyのドキュメントには、Smartyクラスを継承したクラスの書き方の例として、以下の様なクラスが載っています。

class Smarty_GuestBook extends Smarty {

   function Smarty_GuestBook()
   {

        // クラスのコンストラクタ。
        // これらは新しいインスタンスで自動的にセットされます。

        $this->Smarty();

        $this->template_dir = '/web/www.example.com/guestbook/templates/';
        $this->compile_dir  = '/web/www.example.com/guestbook/templates_c/';
        $this->config_dir   = '/web/www.example.com/guestbook/configs/';
        $this->cache_dir    = '/web/www.example.com/guestbook/cache/';

        $this->caching = true;
        $this->assign('app_name', 'Guest Book');
   }

}
引用元:http://www.smarty.net/docsv2/ja/installing.smarty.extended.tpl

しかし、この書き方だと、PHP5.4.10/Smarty3.1.13の環境では、コンストラクターの呼び出し時に例外が発生して止まりました。以下のように書けば動きます(太字が変更箇所。また、変更箇所に関係ない部分は省略)。

class Smarty_GuestBook extends Smarty {

   function Smarty_GuestBook()
   {
        parent::__construct();// $this->Smarty();ではダメ
   }
}

あと、Smarty_GuestBook()メソッドはコンストラクターとして働いていますが、PHP5ではクラス名と同名のメソッド名を付けるべきではないので、__construct()にすべきでしょうね。

PHP5では、クラスのコンストラクターメソッドは__construct()という名前で統一されています。一方、PHP4では、クラス名と同じ名前のメソッドがある場合はそれをコンストラクターメソッドとみなす、という動作でした。

PHP5では、__construct()がある場合はそれをコンストラクターメソッドとみなしますが、__construct()が無くて、クラス名と同名のメソッドがある場合、クラス名と同名のメソッドをコンストラクターメソッドとみなします(PHP4との互換性のため)。

したがって、PHP5では、クラス名と同名のメソッドを定義すべきではありません。コンストラクターにするつもりのないメソッドがコンストラクターになってしまう恐れがあるからです。

PHPマニュアル:コンストラクタとデストラクタ

オブジェクト指向プログラミングにおいて、継承(inheritance)は2つ以上のクラスの形式的な関係を指す。継承によって、あるクラスが他のクラスの変数やメソッドを借りてくる。実用的・技術的な意味では、継承は単にあるクラスが他のクラスのコードを使えるようにするだけである。

しかし、継承という用語には、再利用以上の意味合いがある。継承は、技術的な道具である以上に知的な道具なのである。継承によって、クラスに特有の機能をもたせると同時に、クラスの見た目と振る舞いを他のクラスに似せることもできる。

継承の例:
public class A {
    public var v = 10;

    public function m () {
        trace("Method m() was called");
    }
}

public class B extends A{
    // インスタンス変数もメソッドも無いクラス(Aを継承)
}
継承するには、クラス定義の際にextendsキーワードを用いる。上のコードでは、クラスBがクラスAを継承している。ここで、クラスBをインスタンス化すると、Bを通してAのインスタンス変数やメソッドを呼ぶことができる。

Bのような他のクラスを継承したクラス(サブクラス)は、Aのような継承元のクラス(スーパークラス)で使用できる機能を備えた上位機能(スーパーセット)である。サブクラスは、スーパークラスの機能を備え、さらに独自の機能を持つ。

ここで、クラスBに独自のメソッドを付け足してみる。
public class B extends A{
    public function n () {
        trace("Method n() was called");
    }
}
クラスBは、クラスAの特殊化と呼ばれる。クラスBはクラスAの機能を基本とし、さらに独自の機能を必要に応じて拡張する。2つのクラスの継承関係において、クラスAのような拡張されるクラスを基本クラス(又は祖先クラス)、クラスBのような拡張するクラスを派生クラス(又は子孫クラス)と呼ぶ。

継承では、2つ以上のクラスを含むこともできる。例えば、クラスBを拡張するクラスCを定義すれば、クラスCはクラスBの機能に加え、クラスAの機能も利用することができる。また、スーパークラスは、サブクラスをいくつでも持つことができる。

クラスの継承関係は図で表すことができる。例えば、UML(Unified Modeling Language)を用いてクラスの関係を図式化したりする。


今日の進捗:2554→2715/20168

問 次のPHPスクリプトの出力はどうなるか?
$array = array(
    0 => 'zero',
    2 => 'two',
    1 => 'one',
);
 
foreach ($array as $value) {
    echo $value, PHP_EOL;
}

zero
two
one
数値添字の昇順に「zero, one, two」と出力されるわけではないので注意が必要です。

PHPの配列の添字って、「並び順を示す数字」じゃなくて、単なる値のkeyなんですね。パーフェクトPHP にも、『PHPの配列はすべて連想配列であると言えます(p.82)』とあります。

このページのトップヘ