回答編集履歴

4 見直し

m6u

m6u score 10216

2018/12/12 10:53  投稿

> サブクラスから parent:: で親クラスのインスタンスメソッド、静的メソッドの両方にアクセスできます。
違うなぁ。混乱しやすいのかもしれないけど。
インスタンス(動的プロパティ、動的メソッド)にアクセスするのはアロー演算子、
クラス(静的プロパティ、静的メソッド)にアクセスするのがダブルコロン。
お約束のリファレンスより。
[PHP: スコープ定義演算子 (::) - Manual](http://jp2.php.net/manual/ja/language.oop5.paamayim-nekudotayim.php)
self:: で自クラスのプロパティ、静的メソッドにアクセスできる。
parent:: で親クラスのプロパティ、静的メソッドにアクセスできる。
[PHP: アクセス権 - Manual](http://jp2.php.net/manual/ja/language.oop5.visibility.php)
> public 宣言されたクラスのメンバーには、どこからでもアクセス可能です。
> protected 宣言されたメンバーには、 そのクラス自身、そのクラスを継承したクラス、および親クラスからのみアクセスできます。
> private 宣言されたメンバーには、そのメンバーを定義したクラスからのみアクセスできます。
[PHP: static キーワード - Manual](http://jp2.php.net/manual/ja/language.oop5.static.php)
> クラスプロパティもしくはメソッドを static として宣言することで、 クラスのインスタンス化の必要なしにアクセスすることができます。 static なプロパティは、インスタンス化されたクラスオブジェクトから アクセスすることはできません (static なメソッドにはアクセスできます)。
[PHP: オブジェクトの継承 - Manual](http://jp2.php.net/manual/ja/language.oop5.inheritance.php)
> クラスを拡張するとき、サブクラスは親クラスから public と、protected のメソッドをすべてを引き継ぎます。
すっごく時間をかけて説明文を書いてみたけど、
説明が危うく拙い気がしたので、消して、
もうちょっとわかりやすい記事を探してみた。
[PHPを愛する試み 〜self:: parent:: static:: および遅延静的束縛〜 - maeharinの日記](http://maeharin.hatenablog.com/entry/20130202/php_late_static_bindings)
[PHPの「$this」と「self::」の違い - Qiita](https://qiita.com/Otake_M/items/1349e761ce3f465c7f9f)
---
検証コードを書きながら、
親クラスからの継承の話と、
おなじ命名空間での他クラスからのアクセスの話も知っといたほうがいいと思えてきました。
謎なコードを示します。
```php
<?php
class foo {
   public function hoge() { echo 'hoge'; }
   public static function fuga() { echo 'fuga'; }
}
class bar {
   public function piyo() {
       echo foo::hoge();
   }
}
$x = new bar();
$x->piyo();
```
これ、実行すると、
「Deprecated: Non-static method foo::hoge() should not be called statically」
ってエラーメッセージが出ますが、
「hoge」って出力されます。
```php
class bar {
   public function piyo() {
       echo foo::fuga();
   }
}
```
とすることでエラーメッセージなしに「fuga」って出力されます。
**クラスfooとbarの間には継承の関係はありません**。
同じ命名空間にいるだけです。
```php
<?php
class foo {
   public const X = 1;
   public static $y = 2;
   public static $y = 2; // staticがないとFatal error
}
class bar {
   public function piyo() {
       echo foo::X . PHP_EOL;
       echo foo::$y . PHP_EOL;
   }
}
$x = new bar();
$x->piyo();
```
結果は「1(改行)2(改行)」です。
クラスうんぬんいうまえに、スコープ演算子と命名空間のことも知っとかないと、
危ういと思います。
(これが理解できると、フレームワークのソースコードも読めるようになるのかも。)
3 加筆修正

m6u

m6u score 10216

2018/12/12 10:52  投稿

> サブクラスから parent:: で親クラスのインスタンスメソッド、静的メソッドの両方にアクセスできます。
違うなぁ。混乱しやすいのかもしれないけど。
インスタンス(動的プロパティ、動的メソッド)にアクセスするのはアロー演算子、
クラス(静的プロパティ、静的メソッド)にアクセスするのがダブルコロン。
お約束のリファレンスより。
[PHP: スコープ定義演算子 (::) - Manual](http://jp2.php.net/manual/ja/language.oop5.paamayim-nekudotayim.php)
self:: で自クラスのプロパティ、静的メソッドにアクセスできる。
parent:: で親クラスのプロパティ、静的メソッドにアクセスできる。
[PHP: アクセス権 - Manual](http://jp2.php.net/manual/ja/language.oop5.visibility.php)
> public 宣言されたクラスのメンバーには、どこからでもアクセス可能です。
> protected 宣言されたメンバーには、 そのクラス自身、そのクラスを継承したクラス、および親クラスからのみアクセスできます。
> private 宣言されたメンバーには、そのメンバーを定義したクラスからのみアクセスできます。
[PHP: static キーワード - Manual](http://jp2.php.net/manual/ja/language.oop5.static.php)
> クラスプロパティもしくはメソッドを static として宣言することで、 クラスのインスタンス化の必要なしにアクセスすることができます。 static なプロパティは、インスタンス化されたクラスオブジェクトから アクセスすることはできません (static なメソッドにはアクセスできます)。
[PHP: オブジェクトの継承 - Manual](http://jp2.php.net/manual/ja/language.oop5.inheritance.php)
> クラスを拡張するとき、サブクラスは親クラスから public と、protected のメソッドをすべてを引き継ぎます。
すっごく時間をかけて説明文を書いてみたけど、
説明が危うく拙い気がしたので、消して、
もうちょっとわかりやすい記事を探してみた。
[PHPを愛する試み 〜self:: parent:: static:: および遅延静的束縛〜 - maeharinの日記](http://maeharin.hatenablog.com/entry/20130202/php_late_static_bindings)
[PHPの「$this」と「self::」の違い - Qiita](https://qiita.com/Otake_M/items/1349e761ce3f465c7f9f)
[PHPの「$this」と「self::」の違い - Qiita](https://qiita.com/Otake_M/items/1349e761ce3f465c7f9f)
---
検証コードを書きながら、
親クラスからの継承の話と、
おなじ命名空間での他クラスからのアクセスの話も知っといたほうがいいと思えてきました。
謎なコードを示します。
```php
<?php
class foo {
   public function hoge() { echo 'hoge'; }
   public static function fuga() { echo 'fuga'; }
}
class bar {
   public function piyo() {
       echo foo::hoge();
   }
}
$x = new bar();
$x->piyo();
```
これ、実行すると、
「Deprecated: Non-static method foo::hoge() should not be called statically」
ってエラーメッセージが出ますが、
「hoge」って出力されます。
```php
class bar {
   public function piyo() {
       echo foo::fuga();
   }
}
```
とすることでエラーメッセージなしに「fuga」って出力されます。
**クラスfooとbarの間には継承の関係はありません**。
同じ命名空間にいるだけです。
```php
<?php
class foo {
   public const X = 1;
   public static $y = 2;
}
class bar {
   public function piyo() {
       echo foo::X . PHP_EOL;
       echo foo::$y . PHP_EOL;
   }
}
$x = new bar();
$x->piyo();
```
結果は「1(改行)2(改行)」です。
クラスうんぬんいうまえに、スコープ演算子と命名空間のことも知っとかないと、
危ういと思います。
(これが理解できると、フレームワークのソースコードも読めるようになるのかも。)
2 見直し

m6u

m6u score 10216

2018/12/11 19:44  投稿

> サブクラスから parent:: で親クラスのインスタンスメソッド、静的メソッドの両方にアクセスできます。
違うなぁ。混乱しやすいのかもしれないけど。
インスタンス(動的プロパティ、動的メソッド)にアクセスするのはアロー演算子、  
クラス(静的プロパティ、静的メソッド)にアクセスするのがダブルコロン。  
お約束のリファレンスより。
[PHP: スコープ定義演算子 (::) - Manual](http://jp2.php.net/manual/ja/language.oop5.paamayim-nekudotayim.php)
self:: で自クラスのプロパティ、静的メソッドにアクセスできる。
parent:: で親クラスのプロパティ、静的メソッドにアクセスできる。
[PHP: アクセス権 - Manual](http://jp2.php.net/manual/ja/language.oop5.visibility.php)
> public 宣言されたクラスのメンバーには、どこからでもアクセス可能です。
> protected 宣言されたメンバーには、 そのクラス自身、そのクラスを継承したクラス、および親クラスからのみアクセスできます。
> private 宣言されたメンバーには、そのメンバーを定義したクラスからのみアクセスできます。
[PHP: static キーワード - Manual](http://jp2.php.net/manual/ja/language.oop5.static.php)
> クラスプロパティもしくはメソッドを static として宣言することで、 クラスのインスタンス化の必要なしにアクセスすることができます。 static なプロパティは、インスタンス化されたクラスオブジェクトから アクセスすることはできません (static なメソッドにはアクセスできます)。
[PHP: オブジェクトの継承 - Manual](http://jp2.php.net/manual/ja/language.oop5.inheritance.php)
> クラスを拡張するとき、サブクラスは親クラスから public と、protected のメソッドをすべてを引き継ぎます。
すっごく時間をかけて説明文を書いてみたけど、
説明が危うく拙い気がしたので、消して、
もうちょっとわかりやすい記事を探してみた。
[PHPを愛する試み 〜self:: parent:: static:: および遅延静的束縛〜 - maeharinの日記](http://maeharin.hatenablog.com/entry/20130202/php_late_static_bindings)
[PHPの「$this」と「self::」の違い - Qiita](https://qiita.com/Otake_M/items/1349e761ce3f465c7f9f)
1 見直し

m6u

m6u score 10216

2018/12/11 19:43  投稿

> サブクラスから parent:: で親クラスのインスタンスメソッド、静的メソッドの両方にアクセスできます。
違うなぁ。混乱しやすいのかもしれないけど。
お約束のリファレンスより。
[PHP: スコープ定義演算子 (::) - Manual](http://jp2.php.net/manual/ja/language.oop5.paamayim-nekudotayim.php)
self:: で自クラスのプロパティ、静的メソッドにアクセスできる。
parent:: で親クラスのプロパティ、静的メソッドにアクセスできる。
[PHP: アクセス権 - Manual](http://jp2.php.net/manual/ja/language.oop5.visibility.php)
> public 宣言されたクラスのメンバーには、どこからでもアクセス可能です。
> protected 宣言されたメンバーには、 そのクラス自身、そのクラスを継承したクラス、および親クラスからのみアクセスできます。
> private 宣言されたメンバーには、そのメンバーを定義したクラスからのみアクセスできます。
[PHP: static キーワード - Manual](http://jp2.php.net/manual/ja/language.oop5.static.php)
> クラスプロパティもしくはメソッドを static として宣言することで、 クラスのインスタンス化の必要なしにアクセスすることができます。 static なプロパティは、インスタンス化されたクラスオブジェクトから アクセスすることはできません (static なメソッドにはアクセスできます)。
[PHP: オブジェクトの継承 - Manual](http://jp2.php.net/manual/ja/language.oop5.inheritance.php)
> クラスを拡張するとき、サブクラスは親クラスから public と、protected のメソッドをすべてを引き継ぎます。
すっごく時間をかけて説明文を書いてみたけど、
もうちょっとわかりやすい記事を探してみた。
[PHPを愛する試み 〜self:: parent:: static:: および遅延静的束縛〜 - maeharinの日記](http://maeharin.hatenablog.com/entry/20130202/php_late_static_bindings)
[PHPの「$this」と「self::」の違い - Qiita](https://qiita.com/Otake_M/items/1349e761ce3f465c7f9f)

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る