phpのinstanceofとis_subclass_of()の違い
is_subclass_ofつうのを発見した
<?php $super = new Super(); $sub = new Sub(); var_dump($super instanceof Super); var_dump($sub instanceof Super); var_dump($super instanceof Sub); var_dump($sub instanceof Sub); var_dump(is_subclass_of($super, 'Super')); var_dump(is_subclass_of($sub, 'Super')); class Super { public $a; } class Sub extends Super { public $b; }
bool(true)
bool(true)
bool(false)
bool(true)
bool(false)
bool(true)
名前のまんま is_subclass_of はそいつ自身は含まない
伊坂幸太郎の「砂漠」がすごく良かった
危ない!月1ブログのノルマが!!!
ってことで、最近よんだ伊坂幸太郎の「砂漠」がとてもグッと来るお話だったので、読み終わったときの興奮を思い出しつつ感想でも書いてみようかと思います。
ところで、なぜ僕がこの本を買ったかというと、伊坂幸太郎・荻原浩・東野圭吾といったベタベタな現代人気小説家の書く長編小説が純粋に好きで、文庫本になったらとりあえず買って読むという僕の中の掟があるからです。
僕がこの3人が好きな理由は、3人が3人ともお話の中に伏線をnaruto並みに大量に散りばめまくって、終盤のほんの数ページでドバドバドバーっとものの見事に回収していく爽快さと、読み終わった後の気持ちよさ、そして3人それぞれが特徴的な文章を使うところがたまらなくすきなのです。
そんなこんなで、この3人を読むときは最初から期待値が高すぎるので、読み終わった後に「面白いんだけどなんかなー、、、」という、どこか不完全燃焼を抱いてしまうこともしばしばなのです。
では、この「砂漠」はどうだったかというと、
最高!
いいね!
うん!いいーーーーーー!!
と、うっすら興奮すらしてしまうくらい良かったのです。
満足しすぎたので珍しく「あとがき」なんぞも読んでみると「あれ?これオレが書いた??」ってくらい感想が同じwww
もはや薄っすらとは言えない興奮を覚えた僕は、「ビジネス書なんてクソ食らえ!そんなもん読む暇があったら小説を読みやがれ!!!」とついツイッターに書きかけてしまうほどにテンションがあがってしまったのです。(近いことは書いたが・・・)
で、何がそんなにいいの?ってところですが、ネタバレを避けて伝えることは僕の脳みそでは出来ません。
なので僕が痺れたキーワードを2つあげてみます。
「その気になればね、砂漠に雪を降らすことだって、余裕でできるんですよ」
これは西嶋っていう、この物語に出てくる主人公でないけど最高のキャラクターが冒頭のシーンで言ったことばです。
社会に出てから、利益を上げるために生きていると、どうしても不可能なことをしようとすると、多くの場合は「無駄」とののしられ、「バカじゃないの?」みたいな冷たい目線を浴びて終わるのがオチだと思います。(多くの場合)
でも、もしも、しれっとこんなことを言ってるやつがいたら、そいつなら余裕でできそうな気がしてしまうから不思議なんです。
そう考えると、チャレンジしないって逆にバカだよなーと、チャレンジすること、高すぎる目標を掲げることに対して恐怖心がなくなった僕がいたのです。
(あー、この脳みそじゃなく、感覚で心できっかけをつかむ瞬間はビジネス書じゃ味わえないわ。)
こんな冒頭でいきなり引き込まれてしまうお話しがこの「砂漠」なのです。
なんてことは、まるでない
これは、主人公の北村の妄想で、よく僕たちが「不良を見かけた時に、ボッコボッコにする妄想をしながら、無意識に遠回りをする」感覚のことなんだけど、これがこの小説のアクセントになってて笑えるポイントだと思うんです。
最近、仕事でwebサービスのライティングなんかもしてるけど、言葉の奥深さや難しさというのを本当に身にしみて感じています。
もし僕が、こんな"どんな空気も一瞬でやわらげてしまうようなマジックワード"を、自分の書く短い文章の中に入れることが出来たら、どんなにいいだろうと感心したのです。
(あー、ビジネス書じゃこのノウハウを脳みそに伝えるだけで、こうやって感覚で教えてくれないよね。)
と、伊坂幸太郎の技術をべた褒めしてしまったんだけど、もちろんストーリーが面白く、「え、そこでそれ必要w」みたいに無駄にやられた感も与えてくれるし、ミステリーのような青春小説のような、物語の宝石箱とでもいうべき満足度の高い一冊です。
これは、荻原浩の傑作「オロロ畑」には到底及ばない。
なんてことは、まるでない
もうオロロと並ぶ大傑作だと僕は思います。マジで。
- 作者: 伊坂幸太郎
- 出版社/メーカー: 新潮社
- 発売日: 2010/06/29
- メディア: 文庫
- 購入: 4人 クリック: 73回
- この商品を含むブログ (171件) を見る
APCの挙動
使い方はカンタンで、
<?php if ($data = apc_fetch('data')) { $data = getData(); // なんか処理 apc_store('data', $data); }
本当にカンタンでPHPのオブジェクトもそのまま入ります。
しかし、
<?php $objects = array(); foreach (range(10, 30, 10) as $i) { $params = array(); foreach (array('a', 'b', 'c',) as $p) $params[$p] = ++$i; $objects[] = new Test($params); } var_dump($objects); apc_store('tests', $objects); apc_store('tests_0', $objects[0]); $data = apc_fetch('tests'); $data_0 = apc_fetch('tests_0'); var_dump($data); var_dump($data_0); class Test { public $a; private $b; protected $c; public function __construct($array) { foreach (array('a', 'b', 'c',) as $p) { if (isset($array[$p])) $this->{$p} = $array[$p]; } } }
結果
array(3) { [0]=> object(Test)#1 (3) { ["a"]=> int(11) ["b:private"]=> int(12) ["c:protected"]=> int(13) } [1]=> object(Test)#2 (3) { ["a"]=> int(21) ["b:private"]=> int(22) ["c:protected"]=> int(23) } [2]=> object(Test)#3 (3) { ["a"]=> int(31) ["b:private"]=> int(32) ["c:protected"]=> int(33) } } array(3) { [0]=> NULL [1]=> NULL [2]=> NULL } object(Test)#4 (3) { ["a"]=> int(11) ["b:private"]=> int(12) ["c:protected"]=> int(13) }
え、、、?
てっきり内部でserializeしているのかとおもったら、serializeとは挙動がちがっておりまして、
配列の要素のオブジェクトは消えてしまうようです。
というわけで,memcacheを同じで、下記の用にしてあげないと行けないみたい
<?php if ($data = apc_fetch('data')) { $data = serialize(getData()); // なんか処理 apc_store('data', $data); } return unserialize($data);
arrayの結合
間違えたのでメモ…
# Array + Array;
% php -r 'var_dump(array("a", "b", "c") + array("d", "e", "f", "g", "h"));'
array(5) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[2]=>
string(1) "c"
[3]=>
string(1) "g"
[4]=>
string(1) "h"
}
# array_merge(Array, Array);
hp -r 'var_dump(array_merge(array("a", "b", "c"),array("d", "e", "f", "g", "h")));'
array(8) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[2]=>
string(1) "c"
[3]=>
string(1) "d"
[4]=>
string(1) "e"
[5]=>
string(1) "f"
[6]=>
string(1) "g"
[7]=>
string(1) "h"
}
admin generatorでできるだけ手抜きをするためのBaseFormFilterPropel と BaseFormPropelのテンプレ
frontendでも使ってたらNGぽいけど管理画面でしか使ってないので可能な限り手抜きをしたい
- lib/form/BaseFormPropel.class.php
<?php abstract class BaseFormPropel extends sfFormPropel { public function setup() { foreach ($this->getWidgetSchema()->getFields() as $name => $widget) { // formから消す if (in_array($name, array('created_at', 'updated_at', 'is_delete'))) { unset($this[$name]); } // 日本風 switch (get_class($widget)) { case 'sfWidgetFormDateTime': $widget->setOption('date', array('format' => '%year%年%month%月%day%日')); break; case 'sfWidgetFormDate': $widget->setOption('format', '%year%年%month%月%day%日'); break; default: // 何もしない break; } } } }
- lib/filter/BaseFormFilterPropel.class.php
<?php abstract class BaseFormFilterPropel extends sfFormFilterPropel { public function setup() { // 何故かデフォでついてないidを追加 if (!in_array('id', $this->getFields()) && !isset($this->widgetSchema['id'])) { $this->setWidget('id', new sfWidgetFormFilterInput(array('with_empty' => false))); $this->setValidator('id', new sfValidatorSchemaFilter('text', new sfValidatorInteger(array('required' => false)))); } // 日本風 foreach ($this->getWidgetSchema()->getFields() as $name => $widget) { switch (get_class($widget)) { case 'sfWidgetFormFilterDate': $widget->getOption('from_date')->setOption('format', '%year%年%month%月%day%日'); $widget->getOption('to_date')->setOption('format', '%year%年%month%月%day%日'); break; default: // 何もしない break; } } } }