Introducing 

Prezi AI.

Your new presentation assistant.

Refine, enhance, and tailor your content, source relevant images, and edit visuals quicker than ever before.

Loading…
Transcript

さて、問題です。

さて

クラスの

アクセス修飾子に

不満を持っていませんか?

私は不満があります。

アクセス修飾子

なんで、

どの言語も

この3つぐらいしか

ないんでしょうか。

今日は、

オブジェクト指向/カプセル化の

幹線にあえて切り込んでみたい。

なんか、めんどっちいですよね。

これではカプセル化が

壊れてしまう。

//確かにコレはできる。

echo $HumanObject->Age;

//しかし、

//今度は、クラスの外から

//書き込まれてしまう。

$HumanObject->Age = 100;

クラスの外から

読めるけど書けない

そんなアクセス修飾子が

ほしい

そんなわけで

作ってみた。

クラス外から クラス内から 継承した場合

読み 書き 読み 書き

public ○ ○ ○ ○ 継承される

niigata ○ × ○ ○ 継承されない

protected × × ○ ○ 継承される

private × × ○ ○ 継承されない

いいですか?

読めるけど書けない

新潟の人ごめんなさい

Fatal error: Cannot access niigata property Human::$Age in /home/rti/lab/php-5.3.2/a.php on line 13

getter が多い

クラスだと

効果は抜群!

これからは新潟だ!!

新潟アクセス修飾子のご提案

     ~課題~

class Human

{

private $Age ,$Name, $Address, $Tel;

public function __get( $key )

{

return isset( $this->$key ) ? $this->$key : NULL;

}

};

Q7.外人に

どう説明するの?

A7.ごめんなさい

にいがた

漢字で正確に書いてください。

がたの右上は白ぢゃないよ。

ちなみに私はかけませんw

新潟アクセス

修飾子/指定子のご提案

新潟

という漢字は、

新潟

伯爵認定書

新潟 ==

読めるけど書けなーい

読めるけど、

書けない。

@super_rti

by rti

第二次大戦の要塞後を占拠して独立宣言。

自称国家。

現在、人口4人。

爵位販売中

Lord of Sealand

シーランド公国伯爵

イギリス

肩書き

ハンドル:rti

なんと読みますか?

http://d.hatena.ne.jp/rti7743/

自己紹介

シーランド公国について

ラーメンズ

不思議の国のニポンより

http://rtilabs.net/

後半の

実装部に続く

よく getter を作ってませんか?

今は

宇宙の法則すら乱れる時代。

定番の役割

クラスの外から

メンバ変数を取得するには、

getterを経由して

アクセスしなければいけない。

クラス外から クラス内から 継承した場合

読み 書き 読み 書き

public ○ ○ ○ ○ 継承される

protected × × ○ ○ 継承される

private × × ○ ○ 継承されない

public protected private

新潟アクセス修飾子のご提案

~問題提起~

class Human{

private $Age;

public function

__construct($age,$name){

$this->Age = $age;

//略

}

//年齢を取得する.

public fnction getAge(){

return $this->Age;

}

};

//Ageを取るにこうする必要がある。

echo $HumanObject->getAge();

これを変えようという人を

見たことがありません。

神が創った宇宙の法則でもないのに。

なぜ固持するか!

メンバ変数を外から読むために

よく使いますよね?

アナログ

//Ageを取るにこうする必要がある。

echo $HumanObject->getAge();

嘘です。

比較

//コレできても、

echo $HumanObject->Age;

//これはできないでほしい

$HumanObject->Age = 100;

class Human{

//private $Age;

//↓

public $Age;

public function

__construct($age,$name)

{

$this->Age = $age;

//略

}

//年齢を取得する.

public fnction getAge(){

return $this->Age;

}

};

//私は、こうやりたい。

echo $HumanObject->Age;

コレは困った。

パッチをダウンロードする

#ダウンロード

#php 5.3.2 本体

wget http://jp2.php.net/distributions/php-5.3.2.tar.gz

#新潟パッチ

wget http://rtilabs.net/files/2010_05_20/niigata.patch

#サンプルその1とその2

wget http://rtilabs.net/files/2010_05_20/niigata_test1.php.txt

wget http://rtilabs.net/files/2010_05_20/niigata_test2.php.txt

誰がどうみても

クラス外から クラス内から 継承した場合

読み 書き 読み 書き

public ○ ○ ○ ○ 継承される

protected × × ○ ○ 継承される

private × × ○ ○ 継承されない

新潟だ

つまり、niigataは

クラスの外から

パッチの適応

新潟アクセス修飾子のご提案

~ご提案内容~

php 5.3.2 の

Zendエンジンを改造して

新潟アクセス修飾子を実装

public , protected , private , niigata

新潟

##パッチを当てる

#パッチ当てるのがめんどくさい人にはパッチを当てたバージョンもあるよ!

#http://rtilabs.net/files/2010_05_20/php-5.3.2.niigata.tar.gz

#

patch < niigata.patch

##余談

##diffはこうやって作った。

##diff -crN php-5.3.2 php-5.3.2_niigata > niigata.patch

読めるけど、

書けない!!

パッチを公開中

新潟!?

読めるけど、書けない!!

新潟!!

コンパイルして遊ぶ

新潟 in php 5.3.2

#コンパイル

cd php-5.3.2

./configure

make

##サンプルで遊ぶ

#書き込み失敗のサンプル

./sapi/cli/php ../niigata_test1.php.txt

#読み込めることを確認するサンプル

./sapi/cli/php ../niigata_test2.php.txt

class Human{

niigata $Age;

public function

__construct($age,$name)

{

$this->Age = $age;

//略

}

};

//クラスの外から読める

echo $HumanObject->Age;

//だけどクラスの外から書けない

$HumanObject->Age = 100;

無意味なgetterが

消えてすっきり!

比べてください

Q3.スレッドセーフは?

Q1.新潟のメソッドは

どうするか?

Q2.protectedな

新潟が欲しい。

Q4.__getでできるよ?

Q5.パフォーマンスコスト

class Human{

niigata $Age,$Name,$Address,$Tel;

public function

__construct($age,$name)

{

$this->Age = $age;

//略

}

};

Q6.php以外の

他の言語の対応は?

class Human{

private $Age,$Name,$Address,$Tel;

public function

__construct($age,$name)

{

$this->Age = $age;

//略

}

public function getAge(){

return $this->Age;

}

public function getName(){

return $this->Name;

}

public function getAddress(){

return $this->Address;

}

public function getTel(){

return $this->Tel;

}

};

php 5.1以上なら

__getで作れば

同じことできるよ。

javaでいう

synchronizedは

どうすんの?

継承して使いたい。

class Human

{

//どうしよう。。。

niigata function song()

{

}

};

新潟の拡張で

既存のプログラムが遅くならない?

C++とかjavaでもniigataしたい。

5・7・5

通常

新潟

新潟 is very difficult.

bad read easy...?

しかも、

カプセル化は破壊されない!

A2.今は無理です。

通じるかー

A3.そんなの関係ねー

A5.あんまり遅くないですよ

A1.未サポートです。

A4.そ、そうですね。。。

A6.そのうちやるかもよ!!

新潟に不利なカウントテスト

1000000万回

private の拡張として実装。

final ような立ち居地で

独立させるべきかも。

niigata private

niigata protected

みたいな。

<?php

class Counter

{

public $count = 0;

}

$p = new Counter;

for($i = 0 ; $i < 1000000 ; $i ++ )

{

$p->count ++;

}

echo $p->count . "<br>\r\n";

phpにはスレッドはない。

仮にあったとしても、

スレッドセーフにするのは

個々のクラスの

責任ではない。

上位の専用のクラスの責任である。

そこはgetterで書けばよい。

言語仕様として組み込めれば、

作らなくてもOKです。

ソースコードを見ただけで

どれが外部から読みだされるか

簡単に分かります。

また、パフォーマンスも

ネイティヴで書いているので、

__getより5倍ぐらい早いです。

現在サポートしていません。

private と同じになります。

C++でいう

const メソッドにしたい。

無意味な

getterからの解放

そして、

時代は、

getterから

新潟へ

オリジナル php

新潟 php

コレをするにはもっと改造が必要

新潟(niigata)

すげぇぇーー!!

http://ml.php.gr.jp/pipermail/php-dev/2010-May/thread.html

time sh test.sh

real 0m0.130s

user 0m0.117s

sys 0m0.012s

time sh test.sh

real 0m0.130s

user 0m0.117s

sys 0m0.014s

それ C# でできるよ!

それ ruby でできるよ!

ruby

niigata

C#

niigata

class myClass

attr_reader :Age

end

class myClass

{

niigata $Age;

}

class myClass

{

public int Age

{ get; private set; }

}

31bytes

27bytes

good!

新潟の方がタイプ数が少ない。

アクセス修飾子を見ただけでわかる。

トータルのタイプ数だとまだ新潟の方が少ないが、rubyはすごいですね。。。

Learn more about creating dynamic, engaging presentations with Prezi