クラス構造: クラスの内部関数には、定数、プロパティ、メソッドという 3 つの要素があります。関数は、クラスの外部では定数、変数、関数として理解できます。
コードは次のとおりです:
<?php class TEST { const NAME = 'value'; // 常量 public $name = 'value'; // 属性 public function name() // 方法 { echo 'value'; } } ?>
この中で、プロパティとメソッドは public、protected、private の 3 つの異なるキーワードを使用して、プロパティとメソッドのスコープをさらに区別できます。 private キーワードを持つ属性とメソッドのみが使用できます。それらが配置されているクラス内のメソッドによって呼び出すことができます。また、 protected キーワードを指定した属性およびメソッドは、それ自体に加えて、独自の親クラスおよびサブクラスの属性および public キーワードを指定したメソッドからも呼び出すことができます。この最大の利点は、すべてのプロパティとメソッドに説明的な機能が追加され、コードの構造を整理しやすくなることです。 const キーワードは最初にスキップされ、後で static とともに説明されます。
static キーワードは、public、protected、private とは異なる別のタイプのキーワードです (つまり、public、protected、private と組み合わせて使用できます):
コードは次のとおりです:
<?php class TEST { public static function name() { echo 'value'; } } ?>
with staticキーワード メソッドは、クラスをインスタンス化せずに、「::」記号を介して直接呼び出すこともできます。 public、protected、および private と組み合わせると、呼び出しでアクセス許可を区別することもできますが、前述したように、通常は public とペアになります。キーワード const は public static 型である必要があるため、定数は self::NAME や TEST::NAME などの形式を通じてのみ呼び出すことができます。後続の __construct、__destruct、およびその他のメソッドはすべて静的です。
クラスの構造部分で、導入された最後の 2 つのキーワードは、abstract とfinal です。abstract キーワードは、このクラスがそのサブクラスによって上書きされなければならないことを意味し、final キーワードは、このクラスがそのサブクラスによって上書きされてはならないことを意味します。 、これら 2 つのキーワードの機能はまったく逆です。抽象を持つメソッドは抽象メソッドと呼ばれ、抽象メソッドを持つクラスは抽象クラスと呼ばれます。
クラスの使用法:
クラスを使用するには主に 2 つの方法があります。1 つは new キーワードを使用する方法、もう 1 つは「::」記号を使用する方法です。
PHP コード
コードは次のとおりです。
<?php class TEST { public static function name() { echo 'value'; } } //方法1:使用new关键字 $test = new TEST; $test->name(); //方法2:使用“::”符号 TEST::name(); ?>
(1): new キーワードを使用してインスタンス化します。上記の $test は、TEST クラスをインスタンス化することによって生成されるオブジェクトであり、$test オブジェクトの name メソッドと呼ばれます。 。
(2): new キーワードを使用してクラスを使用する場合、$this を使用してクラス自体を参照できます。
(3): 「::」記号を使用するための前提条件は、メソッドに static キーワードが必要であることです。 new キーワードを使用する場合、呼び出されるメソッドには public キーワードが必要です (メソッドに public、protected がない場合)。 、プライベートのキーワードはデフォルトでパブリックになります)
(4): new キーワードを使用して同じクラスを複数の異なるオブジェクトにインスタンス化できますが、それらは互いに分離されます。「::」記号を使用すると、メソッドが共有されます。複数の使用間:
PHP コード
コードは次のとおりです:
<?php class TEST1 { public $name = 0; public function name() { $this->name = $this->name + 1; } } $test1 = new TEST1; $test2 = new TEST1; $test1->name(); //$name1 == 1 $test2->name(); //$name1 == 1 /*--------------------------------------------*/ class TEST2 { public static $name = 0; public static function name() { TEST2::$name = TEST2::$name + 1; } } TEST2::name(); // $name == 1 TEST2::name(); // $name == 2 ?>
クラス間の関係:
クラス間の関係には主に抽象化、インターフェイス、継承が含まれます:
PHP コード
コードは次のとおりです:
<?php abstract class TEST1 // 抽象 { abstract public function name1(); public function name2() { } } class TEST2 extends TEST1 implements TEST3 // 继承 { public function name1() { } } interface TEST3 // 接口 { public function name2(); } ?>
(1) 抽象キーワードを持つクラスは抽象クラスであり、抽象クラス内の抽象メソッドはサブクラスでオーバーライドされる必要があります。
(2) インターフェース キーワードを持つクラスはインターフェースです。インターフェース内のすべてのメソッドはサブクラスでオーバーライドされる必要があります。
(3) classA extends classB または classAimplements classB という単語が付いているものは継承であり、extends は別のクラスを継承することを意味し、implements は一度に 1 つのクラスのみを拡張できますが、複数のインターフェースを実装できます。
(4) 抽象クラス、インターフェイス、および最終的に継承および実装されたメソッドはパブリックである必要があります。
継承プロセス中に、サブクラスは同じ名前の親クラスのメソッドを上書きします。このとき、サブクラスで親クラスのメソッドを呼び出す必要がある場合は、parent キーワードまたはクラスを使用できます。名前と呼び出す "::" 記号:
PHP コード
コードは次のとおりです:
<?php class TEST1 extends TEST2 { public function name() { echo parent::name2(); echo TEST2::name2(); } } class TEST2 { public function name2() { echo 'value2'; } } $test = new TEST1; $test->name(); ?>
クラス内の "::" メソッドの役割のもう 1 つの説明は次のとおりです。インスタンス化せずに定数 (実際には静的とも理解できます)、静的なプロパティとメソッドを呼び出す方法、もう 1 つは、self、parent、クラス名を通じてクラス内に便利な呼び出しチャネルを確立する方法です。
オブジェクト間の関係は主に「==等しい」、「===すべて等しい、等しくない」およびクローンです:
PHPコード
<?php class TEST { public function name() { } } $test1 = new TEST; $test2 = new TEST; $test3 = $test1; echo $test1 == $test2 ? true : false; // true echo $test1 == $test3 ? true : false; // true echo $test2 == $test3 ? true : false; // true echo $test1 === $test2 ? true : false; // false echo $test1 === $test3 ? true : false; // true echo $test2 === $test3 ? true : false; // false ?>
(1)两个类只要拥有相同的属性和方法,就是“==”等于。
(2)两个类必须是指向的同一个对象,才能是“===”全等于。
clone比较特殊,在上面的例子中,$test3 = $test1的过程并不是给了 $test3 一份 $test1 对象的拷贝,而是让 $test3 指向了 $test1,如果一定要获得一份$test1的拷贝,就必须使用clone关键字:
PHP代码
代码如下:
<?php $test3 = clone $test1; ?>
类的钩子:
__autoload:
是一个函数名,也是唯一一个在类的外部使用的钩子,在实例化一个对象的时候,如果没有预先载入类,就会调用这个钩子。
__construct
在类被实例话的时候,被调用的钩子,可以做一些初始化的操作。
__destruct
在类被销毁的时候,被调用的钩子。
__call
当对象试图调用一个不存在的方法的时候,被调用的钩子
__sleep
当使用serialize()函数对一个类进行序列话操作的时候,会调用这个钩子
__wakeup
当使用unserialize()函数对一个类进行反序列话操作的时候,会调用这个钩子
__toString
当一个对象将被转变为字符串的时候,会调用这个钩子(比如echo的时候)
__set_state
当调用var_export()函数操作一个类的时候,会调用这个钩子
__clone
当使用clone关键字对一个类进行拷贝操作的时候,会调用这个钩子
__get
在获取一个类中的属性值的时候,会调用这个钩子
__set
在设置一个类中的属性值的时候,会调用这个钩子
__isset
在使用isset()函数对类中的属性值进行判定的时候,会调用这个钩子
__unset
在使用unset()函数销毁一个属性值的时候,会调用这个钩子
类的小技巧:
在实例话一个类的时候,可以使用这样的形式给__construct钩子传递参数:
PHP代码
代码如下:
<?php class TEST { public function __construct($para) { echo $para; } } $test = new TEST('value'); // 显示 value ?>
foreach()函数可以用来对类或者对象中的属性进行遍历,遍历的时候会先判断public, protected, private的情况而显示:
PHP代码
代码如下:
<?php class TEST { public $property1 = 'value1'; public $property2 = 'value2'; public $property3 = 'value3'; public function name() { foreach($this as $key => $value) { print "$key => $value\n"; } } } $test = new TEST; foreach($test as $key => $value) { print "$key => $value\n"; } $test->name(); ?>
在给类中的方法传递参数的时候,可以对参数进行强制的判定,这里只支持对数组和对象的判定:
PHP代码
代码如下:
<?php class TEST1 { public function name( TEST2 $para ) { } } class TEST2 { } $test2 = new TEST2; $test1 = new TEST1; $test1->name('value'); // 会报错,因为这个参数必须是TEST2实例化以后的对象 $test1->name($test1); // 不会报错 ?>
兼容php4的语法:
php5的类是往下兼容php4的,这些php4时代的语法也得到了继承,但是并不建议在php5的环境中使用。
(1)使用var预设属性,会自动转换成public。
(2)使用类名作为构造函数,在没有__construct构造方法的情况下,会寻找和类名相同的函数作为构造函数。
以上がPHPでクラスを学ぶ方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。