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

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

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

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

Q&A

解決済

2回答

8386閲覧

【PHP】クラス内で指定した変数を、同じクラス内の関数から取得するにはどうしたら良いでしょか?

hasshy

総合スコア102

PHP

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

0グッド

0クリップ

投稿2018/11/26 12:14

編集2018/11/26 14:51

クラス内で定義した変数を、同じクラス内の変数で呼び出せません。
何が原因でしょうか?

コード

構成は下記です。
ルートディレクトリ直下に全てのファイルがあります。

  • common.php: class自体が書かれたファイル
  • foo.json: classのコンストラクタで指定するjsonファイル
  • index.php: classを呼び出すファイル。

最初に、constructでjsonを読み込み複数の配列を取得します。
別のタイミングで、getFoo()で配列から対象の配列のみ返すと言う処理をします。

common.php

php

1<?php 2class CommonFunctions{ 3 private $_foo = []; 4 5 function __construct($dir) { 6 $this->_foo = json_decode(file_get_contents($dir . '/foo.json'), true); 7 // var_dump($this->_foo)で、jsonの中身を見れることは確認済み。 8 } 9 10 // jsonファイルから該当する配列を取得する 11 public function getFoo($id){ 12 $foos = $this->_foo; 13 $targetFoo = array_filter($foos, function($var) use ($id){ 14 return $var['id'] == $id; 15 }); 16 17 $result = []; 18 if(count($targetFoo) > 0) { 19 $result = current($targetFoo); 20 }; 21 22 return $result; 23 } 24} 25 ?> 26

foo.json

json

1[ 2 { 3 "id": 1, 4 "name": "test_1", 5 }, 6 { 7 "id": 2, 8 "name": "test_2", 9 } 10]

index.php

php

1<?php 2 require(__DIR__ . '/common.php'); 3 $commonFunctions = new CommonFunctions(__DIR__); 4 $getFoo = $commonFunctions::getFoo(1); 5 var_dump($getFoo); 6?>

エラー内容

Fatal error: Uncaught Error: Using $this when not in object context

selfで呼び出そうとした場合

蛇足かもしれませんが、self::_scenesでも確認しました。

Fatal error: Uncaught Error: Undefined class constant '_scenes'

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/11/26 13:53

第三者が再現できる、シンプルな構造のものは用意できませんか?
m.ts10806

2018/11/26 14:17

CommonFunctionsを呼び出している処理も合わせて記載してください
hasshy

2018/11/26 14:51

ご指摘ありがとうございます。再現できるように情報を追記しました。
guest

回答2

0

ベストアンサー

PHP

1 2 $getFoo = $commonFunctions::getFoo(1); 3

でgetFoo()をスタティックメソッドとして使おうとしているので、オブジェクト自身を指す$thisは使えません。

コンストラクタでインスタンス変数を指定する設計なのであれば、

PHP

1 2 $getFoo = $commonFunctions->getFoo(1); 3

とする必要があります。

staticキーワード

static メソッドはオブジェクトのインスタンスを生成せずに コールすることができるので、疑似変数 $this は、 static として宣言されたメソッドの内部から利用することはできません。

同ページのコード例を読むと挙動が理解しやすいかと思います。

投稿2018/11/26 17:12

編集2018/11/26 17:27
tanat

総合スコア18713

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

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

0

selfはクラス内定数にアクセスするときに使えるけど、
$thisとは目的が違うからね。
クラスの外でも、クラス内定数をpublic宣言しておけば参照することはできたりする。
PHP: オブジェクト定数 - Manual

array_filter()に与えている無名関数からは$thisのことがわからないので
そういうエラーを返しているのかと。
単純変数に一旦入れてからarray_filter()にかければ解決しそうな気がする。

投稿2018/11/26 12:29

編集2018/11/26 14:14
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

hasshy

2018/11/26 13:29

ご回答ありがとうございます! コード側も更新させていただきました。 単純変数に入れて見たのですが、その部分で同じエラーが出てしまいます。 無名関数ではなく、そもそも$thisで呼び出せないようです。
退会済みユーザー

退会済みユーザー

2018/11/26 13:56

エラーメッセージの示す行は、確実にそこですか? 他の箇所で同様な呼び出しをしていて、そこと間違っていませんか?(念のため確認)
hasshy

2018/11/26 14:53

エラーが発生した箇所は、「$foos = $this->_foo;」で間違いありませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問