ホームページ  >  記事  >  バックエンド開発  >  PHP のクラス コンストラクター _construct() と _initialize() の違いを考える

PHP のクラス コンストラクター _construct() と _initialize() の違いを考える

不言
不言オリジナル
2018-06-07 11:20:381686ブラウズ

この記事では主に ThinkPHP のクラスのコンストラクター _construct() と _initialize() の違いについて説明しています。必要な方はぜひ参考にしてください。

前書き

THINKPHP に精通している PHP 者は基本的に _initialize() メソッドに精通していると思いますが、 _construct() を使用することはほとんどないようです。 > プラグインを自分で作成しない限り、使用されることはほとんどありません。 _initialize()这个方法,我们似乎也很少去使用_construct() ,除非自己写插件,否则还真是很少用到。

今天查看代码突然看到_construct()这个php自带的构造方法,我的第一感觉是比较陌生,虽然之前学习java时经常遇到,但是很久不用基本忘记。我平时的习惯是将知识的重点写

在我那本小笔记上,但是很久不写字,曾经高中那个那种飘逸灵动的书写笔法彻底丢到异次元。再加上之前的想法,所以就来学习学习技术大牛们写写博客,这不是为了装逼,而只是让自己工作成果的点点滴滴都能不随时间流逝而消散。下面来看看详细的介绍吧。

先贴上代码(我的环境是wamp,使用了TP框架):

创建的FatherAction.class.php文件

<?php


class FatherAction extends Action{
  public function __construct(){
    echo &#39;father&#39;;
  }
}

?>

创建的SonAction.class.php文件

<?php


class SonAction extends FatherAction{
  public function __construct(){
    echo &#39;son&#39;;
  }
function index(){

}
}

?>

运行子类SonAction里的index()可以看到输出的结果:

son

如果将子类改为:

<?php


class SonAction extends FatherAction{
   public function __construct(){
    parent::__construct();
    echo &#39;son&#39;;
   }
  function index(){

  }
}

?>

运行结果为;

fatherson

上面的结果可以得出结论:

在执行子类的构造函数时并不会自动调用父类的构造函数,如果你要调用的话,那么要加上parent::__construct()

当我们把上述的构造方法改为THINKPHP_initialize()方法时运行会发现:结果与前面的一致,若要执行父类的_initialize()方法,也需要使用这一句:parent::_initialize()

那是不是说明php自带的构造函数__construct()与THINKPHP的_initialize()方法一样的呢?

先贴上两段代码:

<?php


class FatherAction extends Action{
  public function __construct(){
    echo &#39;father&#39;;
  }
}

?>

<?php


class SonAction extends FatherAction{
  public function _initialize(){
    echo &#39;son&#39;;
  }


  function index(){

  }

}

?>

当执行子类SonAction的index方法时发现,输出的结果为:father

即子类调用了父类的构造函数,而没有调用子类的_initialize()方法

再贴上两段代码:

<?php


class FatherAction extends Action{
  public function __construct(){
    if(method_exists($this,"hello")){
      $this->hello();
    }
    echo &#39;father&#39;;
  }
}

?>

<?php


class SonAction extends FatherAction{
  public function _initialize(){
    echo &#39;son&#39;;
  }
  function index(){

  }

  function hello(){
    echo &#39;hello&#39;;
  }
}

?>

执行子类SonAction的index方法,发现输入的结果为hellofather

由此可以得出结论:

  当THINKPHP的父类有构造函数而子类没有时,THINKPHP不会去执行子类的_initialize()

  当THINKPHP的父类子类均有构造函数时,要调用父类的构造函数必须使用parent::__construct() ----------------- _initialize()同理;

  当THINKPHP的子类同时存在__construct构造函数和_initialize()方法,只会执行子类的__construct

今日コードを見ていたら、PHP に付属している構築メソッドである _construct() が目に留まりました。最初の印象は、よく目にするものでした。以前 Java を勉強していましたが、長い間忘れていました。私のいつもの習慣は知識の要点を小さなノートに書き込むことなのですが、長い間書いていなかったので、高校時代のエレガントでスマートな文体は完全に別次元に消えていました。これまでの考えに加えて、私はテクノロジーの専門家からブログの書き方を学ぶようになりました。これは自慢するためではなく、単に私の仕事の結果が時間の経過とともに消えてしまうのを防ぐためです。詳しい紹介を見てみましょう。


まずコードを貼り付けます(私の環境はTPフレームワークを使用したwampです):

FatherAction.class.phpファイルが作成されました

rrreee

🎜🎜 SonActionを作成しました。 class.php ファイル🎜🎜

🎜rrreee🎜🎜🎜 サブクラス SonAction で index() を実行して出力を確認します: 🎜

🎜rrreee 🎜🎜🎜🎜サブクラスを次のように変更すると、🎜🎜

🎜rrreee🎜🎜🎜🎜実行結果は次のようになります。🎜🎜

🎜rrreee 🎜🎜🎜🎜🎜上記の結果は次のように結論付けることができます: 🎜🎜🎜🎜 サブクラスのコンストラクターを実行するときに、親クラスのコンストラクターは自動的に呼び出されません。呼び出したい場合は、 parent ::__construct()を追加します。 >🎜🎜上記の構築メソッドを THINKPHP_initialize() メソッドに変更すると、結果が以前の親クラスの _initialize() メソッドと一致していることがわかります。 code> メソッドを使用するには、次の文も使用する必要があります: parent::_initialize()🎜🎜それは、PHP にはコンストラクター __construct() が付属しているという意味ですか? 同じですか? THINKPHP の _initialize() メソッドとして? 🎜🎜🎜最初に次の 2 つのコードを貼り付けます:🎜🎜

🎜rrreee🎜🎜

🎜rrreee🎜🎜🎜 サブクラス SonAction のインデックス メソッドを実行すると、結果は次のようになります。コードの:🎜🎜

🎜rrreee🎜🎜

🎜rrreee🎜🎜🎜 サブクラス SonAction の Index メソッドを実行し、入力結果が hellofather🎜🎜🎜次のように結論付けることができます: 🎜🎜🎜🎜 THINKPHP の親クラスにコンストラクターがあるが、サブクラスにはコンストラクターがない場合、THINKPHP はサブクラスの _initialize() を実行しません。 🎜🎜 THINKPHP の親クラスがそうでない場合 両方のサブクラスにコンストラクターがある場合、親クラスのコンストラクターを呼び出すには、 parent::__construct() を使用する必要があります----------- ----- _initialize() は同じです 🎜🎜 THINKPHP のサブクラスに __construct コンストラクターと _initialize() の両方がある場合。メソッドでは、__construct コンストラクターのみが実行されます (これは個人的にテストしましたが、上記のコードにはありません)。 🎜🎜関連する推奨事項: 🎜🎜🎜🎜ThinkPHP を使用したアップロード クラス UploadFile の使用法🎜🎜🎜🎜🎜🎜🎜🎜🎜

以上がPHP のクラス コンストラクター _construct() と _initialize() の違いを考えるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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