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

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

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

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

Q&A

解決済

2回答

460閲覧

インスタンス化後のクラスアクセスについて

nedekee

総合スコア4

PHP

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

0グッド

0クリップ

投稿2020/06/29 06:16

皆さまこんにちは、本日はクラス関連でご質問です。

まずはコードを提示します。

<?php // Your code here! class Hoge { private $name; public function __construct($name) { $this->name = $name; } public static function getName() { return $this->name; } } $arr = [ 'りんご', 'コアラ', 'ラッパ', ]; $hoge = new Hoge('りんご'); $nam = $hoge::getName(); function getFruit($arr, $name) { foreach ($arr as $name) { if ($name == $name) { echo '一致します'; } } } $result = getFruit($arr, $nam);

やりたい事としては、リクエストで投げられる値[name]を遷移先のHogeクラスプロパティ[name]
と比較し、一致した際に処理をさせたいです。
しかし現状のソースでは下記のエラーが出てしまい、値の取得が出来ませんでした。

PHP Fatal error: Uncaught Error: Using $this when not in object context Hoge.php line 7

アクセス権については、以下の認識はあります。
public......どこからでもアクセス可
protected・・・・・・そのクラスと、そのクラスを継承したクラス内からのみアクセス可
private・・・・・・そのメンバを定義したクラス内からのみアクセス可

なおgetNameメソッドをstaticとしているのは、静的な呼び出しの練習も兼ねて
あえてstaticとしています。

何卒有識者様方々のお力をどうかお貸しください。
宜しくお願い致しますm(_ _)m

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

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

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

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

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

guest

回答2

0

ベストアンサー

PHP: static キーワード

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

投稿2020/06/29 06:22

ozwk

総合スコア13553

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

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

nedekee

2020/06/29 06:41

ozwk様 ご回答有り難う御座います。 なるほど、staticがある場合、同クラスならself::getName()、外部ならHoge::getName()として 呼べるのですね。 因みにprivateで宣言されたメンバプロパティが、同クラスのstaticなメソッドで呼ばれている 場合、外部からアクセスするにはどうしたらよいでしょうか? --- class Hoge { private $name; public function __construct($name) { $this->name = $name; } public static function getName() { return self::$name; } public static function setName($name) { self::$name = $name; } } --- 上記のgetName()を外部から参照したい場合です。 Hoge::getName(); を試してみましたがこれでは取れませんでした。
ozwk

2020/06/29 06:53

staticからはstaticなものしか扱えません。
nedekee

2020/06/29 07:13

staticで宣言される、というところがはっきりしませんでした。 この場合メンバ変数のprivate $nameのことですね。少しだけ理解出来た気がします。 有り難う御座います。
ozwk

2020/06/29 07:26

仮にstaticメソッドであるHoge::getName()が 非staticなメンバであるnameにアクセスできるとした場合 $hoge1 = new Hoge('one'); $hoge2 = new Hoge('two'); Hoge::getName(); でどっちのnameを見たらいいかで困ったことになります。 なのでstaticからはstaticなものしか扱えません。
nedekee

2020/06/29 22:23

ozwkさん >>どっちのnameを見たらいいかで困ったことになります。 この一文で直感的に理解が深まったのでBAとさせて頂きます。 有り難う御座いました!
guest

0

流れ的にはこんな感じです

投稿2020/06/29 06:47

yambejp

総合スコア116724

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

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

yambejp

2020/06/29 06:48

class Hoge { private static $name; public function __construct($name) { $this->setName($name); } private static function setName($name) { self::$name = $name; } public static function getName() { return self::$name; } } $hoge = new Hoge('りんご'); $name = $hoge->getName(); print_r($name);
nedekee

2020/06/29 07:12

ああああメンバー変数にもstaticがいるのですね! ということは実装的にはstaticのある無しのメンバやメソッドが混在している コード自体があり得ないってことですよね^^;
yambejp

2020/06/29 07:24

privateのメンバ変数はstaticしなくても直接参照できないので同じですけどね インスタンス化した上で実行する関数以外は原則privateでstaticに運用すべきです。
nedekee

2020/06/29 22:23

なるほど、これは継承やインターフェース、トレイトが絡んだら混乱しそう^^; インスタンス化した上で実行する関数とそうではない関数という 括りの理解はこれからしていこうと思います。 yambejpさん有難うございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問