ホームページ > バックエンド開発 > PHPの問題 > phpにコンストラクターはありますか?

phpにコンストラクターはありますか?

藏色散人
リリース: 2023-03-15 06:22:01
オリジナル
1862 人が閲覧しました

php にはコンストラクターがあり、その構文の説明は「__construct(mixed...$values = ""): void" です。コンストラクターを持つクラスは、毎回このメソッドを最初に呼び出します。新しいオブジェクトを作成するため、オブジェクトを使用する前に初期化作業を行うのに非常に適しています。

phpにコンストラクターはありますか?

この記事の動作環境: Windows 7 システム、PHP バージョン 7.1、DELL G3 コンピューター

コンストラクターはありますかphp?

php コンストラクター

__construct(mixed ...$values = ""): void
ログイン後にコピー

PHP を使用すると、開発者はクラス内のコンストラクターとしてメソッドを定義できます。コンストラクターを持つクラスは、新しいオブジェクトが作成されるたびにこのメソッドを呼び出すため、オブジェクトを使用する前に初期化作業を行うのに非常に適しています。

注: コンストラクターがサブクラスで定義されている場合、その親クラスのコンストラクターは暗黙的に呼び出されません。親クラスのコンストラクターを実行するには、子クラスのコンストラクターでparent::__construct()を呼び出す必要があります。サブクラスでコンストラクターが定義されていない場合、通常のクラス メソッドと同様に親クラスから継承されます (プライベートとして定義されていない場合)。

例 #1 継承におけるコンストラクター

<?php
class BaseClass {
    function __construct() {
        print "In BaseClass constructor\n";
    }
}
class SubClass extends BaseClass {
    function __construct() {
        parent::__construct();
        print "In SubClass constructor\n";
    }
}
class OtherSubClass extends BaseClass {
    // 继承 BaseClass 的构造函数
}
// In BaseClass constructor
$obj = new BaseClass();
// In BaseClass constructor
// In SubClass constructor
$obj = new SubClass();
// In BaseClass constructor
$obj = new OtherSubClass();
?>
ログイン後にコピー

他のメソッドとは異なり、__construct() は継承時に署名互換性ルールの対象になりません。

PHP 5.3.3 以降、ネームスペースでは、クラス名と同じ名前のメソッドはコンストラクターとして使用されなくなりました。名前空間にないクラスは影響を受けません。コンストラクターは、対応するオブジェクトがインスタンス化されるときに自動的に呼び出される通常のメソッドです。したがって、必須のパラメーター、タイプを持つパラメーター、またはデフォルト値を持つパラメーターをいくつでも定義できます。コンストラクターのパラメーターは、クラス名の後の括弧内に置かれます。

例 2 コンストラクター パラメーターの使用

<?php
class Point {
    protected int $x;
    protected int $y;
    public function __construct(int $x, int $y = 0) {
        $this->x = $x;
        $this->y = $y;
    }
}
// 两个参数都传入
$p1 = new Point(4, 5);
// 仅传入必填的参数。 $y 会默认取值 0。
$p2 = new Point(4);
// 使用命名参数(PHP 8.0 起):
$p3 = new Point(y: 5, x: 4);
?>
ログイン後にコピー

クラスにコンストラクターがなく、コンストラクターのパラメーターが必要ない場合は、括弧を省略できます。

古いスタイルのコンストラクター

PHP 8.0.0 より前では、グローバル名前空間内のクラスに同じ名前のメソッドがある場合、古いスタイルのコンストラクターに解決されていました。スタイルのコンストラクターデバイス。関数はコンストラクターとして使用できますが、この構文は非推奨であり、E_DEPRECATED エラーが発生します。 __construct() と同名のメソッドが同時に存在する場合は、__construct() が呼び出されます。

クラスと同じ名前のメソッドは、名前空間内のクラスと PHP 8.0.0 以降のクラスの 2 つのケースでは特別な意味を持たなくなりました。

新しいコードで __construct() を使用します。

コンストラクター属性の昇格

PHP 8.0.0 以降では、コンストラクターのパラメーターもそれに応じてクラス属性に昇格できます。コンストラクターのパラメーターはクラス属性に割り当てられるのが一般的で、そうでない場合は操作できません。コンストラクターのプロモーション機能は、このシナリオに便利です。したがって、上記の例は次のように書き直すことができます。

例 #3 コンストラクター属性プロモーションの使用

<?php
class Point {
    public function __construct(protected int $x, protected int $y = 0) {
    }
}
ログイン後にコピー

コンストラクター パラメーターにアクセス制御 (可視性修飾子) がある場合、 PHP はそれをオブジェクトのプロパティとコンストラクターのパラメーターとして同時に扱い、プロパティに割り当てます。コンストラクターは空にすることも、他のステートメントを含めることもできます。パラメータ値が対応する属性に割り当てられた後、テキスト内の追加のコード ステートメントが実行されます。

すべてのパラメータを改善する必要があるわけではありません。属性としてプロモートされたパラメーターと非プロモートされたパラメーターを混在させることができますが、それらは順序どおりである必要はありません。発生したパラメーターは、コンストラクター内のコード呼び出しには影響しません。

注:

エンジンの混乱を避けるため、オブジェクト プロパティのタイプを呼び出すことはできません。したがって、プロモートされたパラメータも呼び出すことができません。他の型宣言も許可されます。

注:

コンストラクターの巻き上げパラメーターに配置されたプロパティは、プロパティとパラメーターとして同時にコピーされます。

静的作成メソッド

PHP の各クラスはコンストラクターを 1 つだけ持つことができます。ただし、さまざまな入力を使用してさまざまな方法でオブジェクトを構築する必要がある状況もあります。この場合、静的メソッドのラッピング構造を使用することをお勧めします。

例 #4 static を使用したメソッドの作成

<?php
class Product {
    private ?int $id;
    private ?string $name;
    private function __construct(?int $id = null, ?string $name = null) {
        $this->id = $id;
        $this->name = $name;
    }
    public static function fromBasicData(int $id, string $name): static {
        $new = new static($id, $name);
        return $new;
    }
    public static function fromJson(string $json): static {
        $data = json_decode($json);
        return new static($data[&#39;id&#39;], $data[&#39;name&#39;]);
    }
    public static function fromXml(string $xml): static {
        // 自定义代码逻辑。
        $data = convert_xml_to_array($xml);
        $new = new static();
        $new->id = $data[&#39;id&#39;];
        $new->name = $data[&#39;name&#39;];
        return $new;
    }
}
$p1 = Product::fromBasicData(5, &#39;Widget&#39;);
$p2 = Product::fromJson($some_json_string);
$p3 = Product::fromXml($some_xml_string);
ログイン後にコピー

コンストラクターを private または protected に設定して、自分で追加の呼び出しを防ぐことができます。現時点では、クラスをインスタンス化できるのは静的メソッドのみです。これらは同じ定義されたクラス内にあるため、プライベート メソッドにアクセスでき、同じオブジェクト インスタンス内にある必要はありません。もちろん、コンストラクターを private に設定する必要はありませんが、それが合理的かどうかは実際の状況によって異なります。

3 つの静的メソッドは、オブジェクトがさまざまな方法でインスタンス化される方法を示しています。

  • fromBasicData() 必要なパラメータをすべてコンストラクターに渡し、オブジェクトを作成して結果を返します。

  • fromJson() は、JSON 文字列を受け取り、それをコンストラクターに必要な形式に前処理して、新しいオブジェクトを返します。

  • fromXml() は、XML 文字列を受け取り、それを解析し、単純なオブジェクトを作成します。パラメーターはオプションであるため、すべてのパラメーターを無視してコンストラクターを呼び出すことができます。次に、オブジェクトのプロパティに値を割り当て、結果を返します。

上記の 3 つの例では、static キーワードはコードが配置されているクラスのクラス名に変換されます。この場合は「Product」です。

推奨学習: 「PHP ビデオ チュートリアル

以上がphpにコンストラクターはありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
php
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート