質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Cloud9

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Q&A

解決済

2回答

1048閲覧

privateをつけてもサブクラスからメソッドにアクセスできてしまう

yuta_kg

総合スコア24

Cloud9

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

0グッド

1クリップ

投稿2020/02/20 05:42

前提・実現したいこと

privateな静的なメソッドを持つオブジェクトを継承する子クラスを作成し、子クラスから親クラスの静的メソッドを呼び出した時の挙動を確認しようとしました。

やったこと

privateな静的なメソッドを持つオブジェクトを継承する子クラスを作成しました。
そして子クラスから静的なメソッドを呼び出したところ、1度目は以下のエラーを生じるのですが、2回目以降はエラーを吐かずプログラムは最後まで実行されます。

発生している問題・エラーメッセージ

1回目のエラー:https://gyazo.com/a9e51367242f2aaf9e65f31969b05b78
2回目以降:https://gyazo.com/26fe73712d97f2958d29ae6ba2e7ce06

該当のソースコード

PHP

1<?php 2 3class StaticClass { 4 5 private static function get(){ 6 return "success!"; 7 } 8} 9 10class InheritedClass extends StaticClass { 11 12} 13 14print InheritedClass::get(); 15 16?> 17

補足情報(FW/ツールのバージョンなど)

PHP7.2.22
Cloud9

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2020/02/20 05:50

2回目ってなんでしょう? エラーがでたあとにブラウザをリロードするということですか?
m.ts10806

2020/02/20 06:20

どのように実行されてるのでしょうか
m.ts10806

2020/02/20 06:25

あとできれば画像はteratailの投稿機能を使って添付してください
yuta_kg

2020/02/20 08:33

2回目とはエラーが出た後にブラウザをリロードするということです
guest

回答2

0

回答じゃなくてすみません。
うーん。なんか変。どこかで何かがおかしい。

phpinfo()より<h1 class="p">PHP Version 7.2.19-0ubuntu0.18.04.2</h1>
php -vよりPHP 7.2.19-0ubuntu0.18.04.2 (cli) (built: Aug 12 2019 19:34:28) ( NTS )

・/var/www/html/test.php

php

1<?php 2ini_set('display_errors', 1); 3ini_set('error_reporting', E_ALL); 4 5class StaticClass { 6 private static function get(){ 7 return "success!"; 8 } 9} 10 11class InheritedClass extends StaticClass { 12} 13 14print InheritedClass::get();

console

1$ curl -i -s http://localhost/test.php 2HTTP/1.1 200 OK 3Date: Thu, 20 Feb 2020 07:52:08 GMT 4Server: Apache/2.4.29 (Ubuntu) 5Content-Length: 8 6Content-Type: text/html; charset=UTF-8 7 8success!

console

1$ php /var/www/html/test.php 2PHP Fatal error: Uncaught Error: Call to private method StaticClass::get() from context '' in /var/www/html/test.php:14 3Stack trace: 4#0 {main} 5 thrown in /var/www/html/test.php on line 14 6

投稿2020/02/20 08:10

Y.H.

総合スコア7914

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Y.H.

2020/02/20 09:04

あぁ、なんか自分だけわかってない。。。。 なぜにapache2.4でphpたたいた時callできてしまうんだろう。。。 時間取れたら調べてみよう・・・たぶん・・・きっと。。。
guest

0

ベストアンサー

参考資料:
PHP: オブジェクトの継承 - Manual
PHP: static キーワード - Manual

1回目のエラーは、
そもそもclass StaticClassにメソッドget()を実装していなかったっていう可能性はないですか?
from context ''
が何を差すのか。
質問文中に示されている13行目がエラーメッセージの示す13行目なのかどうか、
コーディング途中にアップロードして実行した可能性はありませんか。

メソッドにstaticをつけることで、
インスタンス化していなくても実行できるメソッドなら、
継承した小クラスにおいても同様に実行できて良いはずなので、
特別気にすることじゃない気がしますが。

真相はいかに。

投稿2020/02/20 07:11

編集2020/02/20 07:12
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuta_kg

2020/02/20 08:34

変更が反映される前に実行していたようです みなさんご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問