PHP5 部門の制約

WBOY
WBOYオリジナル
2016-06-13 13:03:41745ブラウズ

PHP5 の型制約

PHP の関数パラメータには型制約があります。つまり、パラメータのタイプを明示的に要求します。たとえば、次のコード:

?

?

<?php
//如下面的类
class MyClass
{
    /**
     * 测试函数
     * 第一个参数必须为类OtherClass的一个对象
     */
    public function test(OtherClass $otherclass) {
        echo $otherclass->var;
    }


    /**
     * 另一个测试函数
     * 第一个参数必须为数组 
     */
    public function test_array(array $input_array) {
        print_r($input_array);
    }
}

//另外一个类
class OtherClass {
    public $var = 'Hello World';
}
?> 

?

では、型制約は何が重要なのでしょうか?ここで特有の問題が発生します。つまり:

パラメータを明示的に特定の型の変数に指定すると、PHPのプログラム効率が向上します。なぜ? PHP5 はオブジェクトであるため、デフォルトで参照渡しされます。したがって、コード public function test(OtherClass $otherclass) {
の行では、参照記号はありませんが、実際にはパラメーターが参照によって渡されます。

それでは、配列はどうでしょうか?なぜなら、PHP では、私たちが直面するビッグデータの種類はオブジェクト、配列、文​​字列の 3 種類にすぎず、文字列はパラメーター テーブル内で明確に参照記号 (&) を使用する必要があるからです。

配列については、試してみるとわかります。だから、これ以上は言いません!

?

オブジェクト パラメータが型制約されている場合でも、デフォルト値を保持し、オプションのパラメータにすることができます。この場合、関数は受信パラメータが NULL かどうかを内部的に判断する必要があります。ただし、通常は、instanceof 演算子を使用する必要はありません。 (この演算子は特別です。これを否定したい場合は、?(!(A instanceod B)) の形式にする必要があります。?) 以下は、デフォルト値を含む元のコードです:

?

<?php

class ca{
    public $name='';
}

class cb{
    public $ca;
    public $color;
    public $array=array();
   //这里我们加上了类型约束,同时也给了默认值。但我们能发现,只有对象是以引用传递的 
   function test($srcStr,$color,ca $ca = null,array $array=null){
        $this->color=$color;
        $this->ca = $ca;
        $this->array = $array;
        $ca->name=$srcStr;
        print_r($this);
    }
}

$cat=new ca();
$cbt=new cb();


$cbt->test('test','red'); //这里我们可以不传对象
$cbt->test('test','blue',$cat); //我们可以传对象,但数组仍不传
print_r($cat); 
$cat1=new ca();
$arr=array(1,2,3,4,5);
$cbt->test('test','black',$cat1,$arr); //数组对象全部传入
array_push($arr,6,7,8,9); //再改变数组
print_r($cbt->array); //结果传入的数组未变。

?>

?

?

?

?

?

?

1階 デウェイ 2011-01-25
PHP5 では、オブジェクトを参照する必要はありません (&) が、大きな配列を参照する必要があります (&)。

2階 トニーシーク 2011-01-26
投稿者が言及した型制約は、PHP のインターフェイスにも適用されるようです

3階 仁真 2011-05-20
dewei さんは
と書きました。php5 ではオブジェクトを参照する必要はありません (&) が、大きな配列は参照する必要があります (&)。
これは、コードのニーズに完全に依存します。関数内のパラメーターと関数の外側のパラメーターを変更する場合は & を使用し、それ以外の場合は使用しません。
関数内のパラメータ配列が変更されない場合はどうなりますか?
実際には、追加するかどうかは関係ありません。アプリケーションを追加しないと、ただ値を渡すだけで、大きな配列を使用するとどれだけのメモリが無駄になるのかと言う人もいるかもしれません。
実際、PHP 5 では代入用のコピーに Zero が実装されています。簡単に言うと、大きな配列 a を b に代入すると、最初は同じ配列オブジェクトを指すことになり、メモリが指数関数的に増加することはありません。 b が変更されると (要素の追加など)、PHP の最下層はまず a の新しい配列をコピーし、次に操作を実行します。
このメカニズムは値の割り当てのパフォーマンスを大幅に向上させますが、基本的にパフォーマンスには影響しません。
詳細情報はオンラインでご覧いただけます。

4階 リーゼ 2011-06-02
比較する必要がある場合、型をチェックしても計算量は増加します。

最も明白な利点は、インターフェイスの使用を制限し、手動の型チェック コードを削減できることです。インターフェースを標準化できる

5階 イミント 2011-06-27
bardo write


パラメータが特定のものであることを明示的に指定する場合type 変数は、PHP プログラムの効率を向上させるために追加されます。



?


自分の発言には責任を持たなければなりません。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。