0

MAppを使用し$database_objectます。プライベートなので使えないというエラーが出ました。ただし、保護に変更したところ、機能するようになりました。クラス階層では、MAppはMAppAMAdderの上にあることに注意してください。

保護とは、子クラスが親クラスではなくリソースを使用できることを意味すると思いました。PHPは他の言語とは異なりますか、それとも継承がどのように機能するかについての私の理解は正しくありませんか?

MAppAdderスニペット

class MAppAMAdder extends MApp
{
    protected $database_object; // private will cause a fail.

MApp

abstract class MApp extends M
{
    protected function getID($pipe)
    {
        $temp = $this->database_object->_pdoQuery('single', 'pull_id_by_h_token',
            array($pipe['server']['smalls']['h_token']));
        $pipe['id'] = $temp['id'];
        return $pipe;
    }
    protected function addTweetTop($pipe, $comment)
    {
        $input = array( $pipe['server']['smalls']['h_token'], 
                        $pipe['server']['smalls']['picture'], 
                        $pipe['server']['smalls']['name'], 
                        $comment, 
                        time(), 
                        $pipe['server']['smalls']['h_file'] );
        $this->database_object->_pdoQuery( 'none', 'tweet_insert', $input);
        return $pipe;
    }
}

エラー

致命的なエラー:プライベートプロパティMAppTweet ::$database_objectにアクセスできません...

4

2 に答える 2

6

PHPではprotected、親クラスもプロパティにアクセスできることを意味します。

保護されていると宣言されたメンバーには、クラス自体の内部、および継承されたクラスと親クラスからのみアクセスできます。

この振る舞いは、C++やJavaなどの強く型付けされた言語の「古典的な」振る舞いとは異なるという点で正しいです。このような言語(一般に静的型付けと呼ばれます)では、コンパイラーは、コンパイル時エラーを発行することによって、証明できない方法でクラスメンバーにアクセスすることを防ぎます。そのため、親クラスは子クラスで定義されたメンバーに投機的にアクセスできません。メンバーが実行時にそこに存在するという保証はありません。

一方、PHPは動的に型付けされており、まったく存在しないメンバーも含めて、任意のメンバーを参照できます(このnull場合のアクセス結果)。このようなメンバーの存在のチェックは実行時に実行され、さまざまな結果をもたらす可能性があります(通常とは異なるものから特定の場合の実行時エラーまで)。

于 2013-01-12T23:06:08.603 に答える
0

スーパークラスは、サブクラスでのみ定義されているフィールドをどのように使用できますか?それは正しく機能しません。publicまたはとして宣言されている限り、サブクラス内からスーパークラスの任意のフィールドにアクセスできますprotectedprivateサブクラスのフィールドにはアクセスできません。ただし、スーパークラスは、存在する可能性のあるサブクラスについては何も知りません。

于 2013-01-12T23:05:23.543 に答える