PHPとOOPについての記事をその年に
PHPとOOP magicというタイトルで読みました。そこからDavid BlaineはPHPでOOPが何であるかを説明しました...はい、著者は関数を正しく使用する方法を示しました言語はオブジェクト指向ではなくオブジェクト指向になりましたが、OOPの単純なサポートに驚かないでしょう。 PHPの多くの恐怖症は、不器用で遅い...さて、考える、遅い、関数のパラメーターは異なる順序で受け入れられると思う=)アクセラレーターで加速でき、関数をクラスに隠すことができる... PHPで最もOOP moshは組み込みのインターフェースです...私はそれらを(配列の例で)教えます...
インターフェース-SPLと呼ばれる氷山の一角。パズルの作者から、このことをここで見つけました。コードを返す労力-if($ q [0] === 1 && $ q [0] === 2)(exactlyタスクを覚えていません、言い換えました、とても面白いです)
コードを開始するには、後で説明します。
<?php
class MyArray implements ArrayAccess, Iterator
{
private $_data;
private $_innerCounter = -1;
public function __construct( $data = null )
{
$ this ->_data = $data;
$ this ->_innerCounter = count( $data );
}
public function get( $offset )
{
return $ this [$offset];
}
// start implementing ArrayAccess interface
public function offsetExists( $offset )
{
return isset( $ this ->_data[$offset] );
}
public function offsetGet( $offset )
{
if ( is_array( $ this ->_data[$offset] ) )
{
$this->_data[$offset] = new MyArray( $this->_data[$offset] );
return $this->_data[$offset];
}
return $ this ->_data[$offset];
}
public function offsetSet( $offset, $value )
{
$ this ->_data[$offset] = $value;
return $ this ;
}
public function offsetUnset( $offset )
{
unset( $ this ->_data[$offset] );
return $ this ;
}
// end implementing ArrayAccess interface
// start implementing Iterator interface
public function current()
{
if ( is_array( current( $ this ->_data ) ) )
{
return new MyArray( current( $ this ->_data ) );
}
//return $this->_data[$offset];
return current( $ this ->_data );
}
public function next()
{
$ this ->_innerCounter++;
return next( $ this ->_data );
}
public function key()
{
return key( $ this ->_data );
}
public function valid()
{
return $ this ->_innerCounter < count( $ this ->_data );
}
public function rewind()
{
$ this ->_innerCounter = 0;
//return reset( $this->_data );
return ;
}
// end implementing Iterator interface
}
$array = new MyArray( array(1, 2, 'qwe' => 'asd' , 6, 'obj' => array(1,2)) );
foreach ( $array as $arrayKey => $arrayValue )
{
if ( is_a( $arrayValue, 'MyArray' ) )
{
echo "it`s an MyArray Object with key '{$arrayKey}' -> " ;
var_dump( $arrayValue );
}
else
{
var_dump( 'key = ' . $arrayKey . ' value = ' . $arrayValue );
}
echo '<br>' ;
}
var_dump( $array[ 'qwe' ] );
echo '<br>' ;
var_dump( $array->get( 'qwe' ) );
echo '<br>' ;
var_dump( $array[ 'obj' ] );
echo '<br>' ;
var_dump( $array->get( 'obj' )->get(1) );
?>
// :
// string(17) "key = 0 value = 1"
// string(17) "key = 1 value = 2"
// string(21) "key = qwe value = asd"
// string(17) "key = 2 value = 6"
// it`s an MyArray Object with key 'obj' -> object(MyArray)#3 (2) { ["_data:private"]=> array(2) { [0]=> int(1) [1]=> int(2) } ["_innerCounter:private"]=> int(2) }
// string(3) "asd"
// string(3) "asd"
// object(MyArray)#2 (2) { ["_data:private"]=> array(2) { [0]=> int(1) [1]=> int(2) } ["_innerCounter:private"]=> int(2) }
// int(2)
* This source code was highlighted with Source Code Highlighter .
だから... 2つのインターフェイスを使用するMyArrayクラスがあります:ArrayAccessとIterator ...それらは何をしますか? 注文を始めましょう。
ArrayAccess:配列としてオブジェクトにアクセスできるインターフェイス(角括弧を介したアクセス、コード内のコメントを参照)例:$ array [1]または$ array ['qwe']
配列を作成するために不可欠なツール!
:
ArrayAccess {
/* Methods */
// ( $offset - )
abstract public boolean ArrayAccess::offsetExists ( string $offset )
// ... $array['offset']
abstract public mixed ArrayAccess::offsetGet ( string $offset )
// ... $array['offset'] = 'value'
abstract public void ArrayAccess::offsetSet ( string $offset , string $value )
// ... :) unset $array['offset']
abstract public void ArrayAccess::offsetUnset ( string $offset )
}
イテレータ:foreach / for(すべてのオブジェクトに列挙機能があり、ここには制御があります)を反復できるインターフェイスです。オブジェクトのメンバー...当然、何が必要ですか(デフォルトでは、パブリックプロパティのみ)
構造:
/* Methods */
// current( array(1,2,3) )
abstract public mixed Iterator::current ( void )
// key( array(1,2,3) )
abstract public scalar Iterator::key ( void )
// next( array(1,2,3) )
abstract public void Iterator::next ( void )
// rewind( array(1,2,3) )
abstract public void Iterator::rewind ( void )
// isset( $array[1]) - =)
abstract public boolean Iterator::valid ( void )
それで、私たちは何を得ましたか? キーによって配列要素を返す1つの「手動」getメソッドでベースオブジェクトを取得しました。 問題は、ArrayAccessがあるのになぜそれが必要なのですか? 答えは明らかです(ここで考えて、このようなアクションの可能性を確認しました:$ array ['qwe'] ['asd'] ... It works =)嬉しいです!)結局のところ、少なくとも1つのメソッドを実装する必要があります。
一般に、これで終わりです。メソッドを実装することは難しくありません。基本的な機能があり、本格的な配列があり、ループをサポートし、出力データを制御します...追加、変更、提供します...
PS:PHPは驚くべき言語であり、すべての弱点があり、ほとんど何もすることが難しく、構造化されていないため、完全に構造化でき、速度が遅く、コンパイルされた言語の速度に加速できます...私はこの言語が大好きですそれには欠陥がありませんでした、それは私があなたに望んでいることです、PHP-スキキ-鼻を垂らさないでください!
PS:
あなたがここにいなかったなら-あなたは馬鹿だ! =)表現は申し訳ありませんが、このサイトを補うマニュアルはありません:)
UPD:ワーカーの要求に応じて明確化:配列は単純なデータ型であり、オブジェクトが参照されるため、このオブジェクトは本格的な配列として動作しません。状況によっては、このプロパティが明示されます。