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

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

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

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

Q&A

解決済

2回答

4008閲覧

[PHP]クラス変数やインスタンスの使い方を知りたい。

fearless0603

総合スコア41

PHP

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

0グッド

0クリップ

投稿2016/04/04 06:10

以下のphpでechoで$uploadを呼び出したときに、functionの中の$global_strにアクセスしてると思うのですが、なぜ「888」の値ではなく、変数の$filenameが出力されるのでしょうか?

ご教授お願いします

PHP

1//定義したクラスからオブジェクト(型)を生成する。$uploadはインスタンス 2$upload = new upload(); 3// 引数定義(配列で) 4$filename = 'certification'; 5// function呼び出し 6$ret1 = $upload->check($filename); 7echo $upload->global_str; 8 9class upload{ 10 public $global_str; 11 12 // function定義 13 //バリデーションメソッドを定義 14 function check($filename){ 15 16 // グローバル変数に引数の値を設定する 17 $global_str =888; 18 $this->global_str = $filename; 19 } 20} 21

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

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

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

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

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

guest

回答2

0

ベストアンサー

あなたがグローバル変数と仰られているものはグローバル変数ではありません.グローバル変数はグローバルスコープに作られるものです.一切のクラス,メソッド,関数に括られていない場所です.

php

1<?php 2 3$variable = 'グローバル変数'; 4 5class Example 6{ 7 private $variable = 'インスタンス変数の初期値'; 8 9 public function __construct() 10 { 11 $variable = 'ローカル変数への代入'; 12 $this->variable = 'インスタンス変数を上書きします'; 13 } 14}

PHPの構文上一貫性が無くてわかりづらいのですが,private $variable$this->variableは同一のものを指しています.逆に $variableとだけ書いたものは全くの別物です.

また,**クラス変数(プロパティ)というとstatic宣言されたものを指すことが多いので,インスタンスに属するものの場合はインスタンス変数(プロパティ)**と呼ぶべきです.

php

1<?php 2 3class Example 4{ 5 private static $classProperty = 1; 6 private $instanceProperty = 2; 7 8 public static function classMethod() 9 { 10 echo self::classProperty; 11 // echo $this->instanceProperty; これは出来ない 12 } 13 14 public function instanceMethod() 15 { 16 echo self::classProperty; 17 echo $this->instanceProperty; 18 } 19}

蛇足ですが,基本的に以下の設計に従ってクラスを設計するほうが見通しが良くなります.

  • プロパティはprivateまたはprotectedにし,可能な限りpublicを避ける.外部に公開する必要がある場合はgetXXX()メソッドを定義する.逆に値を代入するsetXXX()メソッドも用意してもいいが,コンストラクタでの代入のみに抑えられる場合はそうしておいたほうがイミュータブル(オブジェクトの内部状態がコンストラクタで作ったきり一切変化しないこと)が保証されるメリットがある.
  • メソッドの可視性は省略せずに必ず宣言する.(省略した場合はpublicになるが省略しないことがPSR-12というコーディング規約で推奨されている)

投稿2016/04/04 08:00

編集2016/04/04 16:26
mpyw

総合スコア5223

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

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

0

function check($filename)の中身を見てみますか。

$this->global_str = $filename;

。。。いや、ここでuploadインスタンスのメンバ変数に代入してるじゃないすか。
つまり、

public $global_str;

このメンバ変数の値はfunction checkの引数に渡された値が入るってことっすよ。

これで

$ret1 = $upload->check($filename);

こうして

echo $upload->global_str;

こうしたら、「certification」って出力されるのは当たり前では。。。

ちなみに「クラス変数」って言ってるのがstaticのことをいいたいのなら、書き方は

class upload { static $global_str;

などとしなければ。

投稿2016/04/04 06:59

編集2016/04/04 07:05
tkturbo

総合スコア5572

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問