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

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

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

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

Q&A

解決済

1回答

1630閲覧

親クラスで定義した関数から子クラスの定数を呼び出す方法

satoshih

総合スコア799

PHP

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

0グッド

0クリップ

投稿2021/07/01 09:18

いつもお世話になっております。

前提・実現したいこと

親クラスで定義した定数(連想配列)を子クラスで定義した定数(連想配列)で一部上書きする関数を親クラスに作成したいと考えています。
親クラスで定義された関数を子クラスのインスタンスから呼び出すと、 self::定数名 で取得した値が親クラスで定義した定数の値になります。
子クラスの定数をうまく取得する方法はないでしょうか?

現状動作しているのですが、もっと良い方法があればご教示いただきたいです。

環境・バージョン

OS: CentOS 7.6
言語: PHP 5.6

ソースコード

ParentClass

php

1<?php 2 3class ParentClass 4{ 5 const BASE_LIST = [ 6 "KeyA" => "hogehoge", 7 "KeyB" => "hugahuga", 8 "KeyC" => "hungaaaa", 9 ]; 10 const OVERRIDE_LIST = []; 11 12 public function get_list() 13 { 14 $class = str_replace('/', '\',get_class($this)); 15 $base = eval('return '.$class."::BASE_LIST;"); 16 $list = eval('return '.$class."::OVERRIDE_LIST;"); 17 return array_merge($base, $list); 18 } 19}

ChildClass

php

1<?php 2 3use ParentClass; 4 5class ChildClass extends ParentClass 6{ 7 const OVERRIDE_LIST = [ 8 "KeyA" => "piyopiyo", 9 "KeyB" => "puyopuyo", 10 ]; 11}

期待する結果

>>> $child = new ChildClass(); >>> $child->get_list(); => [ "KeyA" => "piyopiyo", "KeyB" => "puyopuyo", "KeyC" => "hungaaaa", ]

以上、よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

普通に期待値の通りになっていると思います
(気持ち悪いゲッタを使っていますが)

PHP

1class ParentClass{ 2 const BASE_LIST = [ 3 "KeyA" => "hogehoge", 4 "KeyB" => "hugahuga", 5 "KeyC" => "hungaaaa", 6 ]; 7 const OVERRIDE_LIST = []; 8 9 public function get_list() 10 { 11 $base = SELF::BASE_LIST; 12 $list = STATIC::OVERRIDE_LIST; 13 return array_merge($base, $list); 14 } 15} 16class ChildClass extends ParentClass 17{ 18 const OVERRIDE_LIST = [ 19 "KeyA" => "piyopiyo", 20 "KeyB" => "puyopuyo", 21 ]; 22} 23 24$child = new ChildClass(); 25print_r($child->get_list());

投稿2021/07/01 12:09

編集2021/07/02 01:37
yambejp

総合スコア116835

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

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

satoshih

2021/07/02 01:25

回答ありがとうございます。 > 普通に期待値の通りになっていると思います はい、動作としては問題なく動いています。 > (気持ち悪いゲッタを使っていますが) おっしゃる通りです。 質問の意図としては、メタプログラミング(eval)を利用せず簡潔に書く方法があればと思い投稿しました。
yambejp

2021/07/02 01:37

失礼しました、リファクタリングということですね? 追記しておきます
satoshih

2021/07/02 02:38

追記ありがとうございます!大変勉強になります。 インスタンスメソッド内での挙動を下記のように理解しました。 ``` $this -> レシーバー自身(インスタンス) static -> レシーバーのクラス self -> 定義元クラス ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問