2016-08-03 17 views
2

まず、引用:拡張クラス - 奇妙な行動マニュアルPHP(<a href="http://php.net/manual/en/keyword.extends.php" rel="nofollow">http://php.net/manual/en/keyword.extends.php</a>)から

The extended or derived class has all variables and functions of the 
base class (this is called 'inheritance' despite the fact that nobody 
died) and what you add in the extended definition. 

、なぜこの単純な例では動作しないということである。

<?php 

class A 
{ 
    private function a() 
    { 
     echo 'a'; 
    } 

    public function b() 
    { 
     echo 'b'; 
    } 

} 


class B extends A 
{ 
    //no extended definition, only what's inherited 
} 

$object_B = new B(); 

echo $object_B->b(); // fatal error: Call to private A::a() from invalid context 
?> 

いくつかの実験をした後、 メソッドをクラスA から削除すると機能します。そして私はどこでもそれを呼んでいません。

答えて

3

PHPクラスのコンストラクタと同じ名前のメソッドを使用できます。自分と同じ名前のメソッドを:

class First 
{ 
    private function another() 
    { 
     echo 'a'; 
    } 

    public function b() 
    { 
     echo 'b'; 
    } 
} 

は推奨されていません」__construct() vs SameAsClassName() for constructor in PHP

+0

実際には、コンストラクタを作成したくありませんでした。そして、PHP7から始めて、__constructが唯一正しい方法です。 継承をテストする簡単な方法を書いたかったのです。 クラス名と同じ名前をメソッドに使用していました(メソッド名は** a **、クラス名は** A **) I大文字と小文字の区別がPHPで一貫していないため、このような誤りは単に起こり続けると思います。 – confused

+0

さて、あなたが '__constructor'を作ろうとしていないと思ったので、あなたの' a'メソッドの名前を変更することを提案しました。これは、あまり知られていないPHPに関する "不具合"の1つです。 PHP7では、あなたは正しいです。しかし、ほとんどの環境ではまだ7が使用されていないため、これはまだ留意しておくべきことです。私の答えはあなたの質問に対処しましたか? :) –

+0

はい、私はあなたの答えを受け入れました。しかし、これを理解しようと多くの時間を浪費しているので、さらに明確にするために、私はすぐにそれを忘れるでしょう: 1.関数名、メソッド名、クラス名はPHPでは大文字と小文字が区別されません 2.変数名、定数名、クラスプロパティ、クラス定数はPHPで大文字と小文字が区別されます 地球上で最も重要な媒体の中で最も人気のあるプログラミング言語の多くの癖があります。 – confused

0

を参照してください:だから、あなたの方法aは、あなたの方法を変更し、それが動作するはずクラスAのコンストラクタ

として機能していますクラスはPHPの将来のバージョンではコンストラクタにはなりません " - サンプルコードを実行した後にPHP 7を報告します。

私はクラスと同じ名前でメソッドの名前を付けることはできないと思います。古いPHPバージョンでは、クラスのようなメソッドに名前を付けてクラスのコンストラクタを定義することができます。 PHPは、関数をコンストラクタとみなします。だからそんなことはできません。

Zac Brown氏によると、__construct()メソッドを使用する必要があります。

0

クラスAでは、クラス名と同じ名前のa()メソッドを定義しています。 Aクラスのコンストラクタメソッドです。 PHPではプライベートコンストラクタメソッドを作成することはできません。あなたのコードはこのようにすべきです。ここで

<?php 
class A 
{ 
    public function a() 
    { 
     echo 'a'; 
    } 

    public function b() 
    { 
     echo 'b'; 
    } 

} 


class B extends A 
{ 
    //no extended definition, only what's inherited 
} 

$object_B = new B(); 

echo $object_B->b(); 
0

は明確です:

あなたはClass Amethod a()を定義しています。彼らは同じ名前を持っているので、method a()constructorとして扱われ、Class Aです。したがっての初期化の瞬間、にが拡張され、Bが延長され、constructorメソッドが呼び出されるため、Class Aも初期化されます。コンストラクタメソッドを持つクラスは、新しく作成されたオブジェクトごとにこのメソッドを呼び出します。PHP Constructor。したがってエラーです。

これは疑問を明確にしていると思います。

関連する問題