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

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

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

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

Q&A

解決済

1回答

597閲覧

PHPクラスの理解($this、super(), __constructとstaticの違い)

退会済みユーザー

退会済みユーザー

総合スコア0

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

0グッド

0クリップ

投稿2020/02/28 07:53

こんにちは。

いま、ドットインストールでphpの勉強しています。

クラスの理解についてよくわからない部分があるのでまとめて質問させていただきます。

https://qiita.com/7968/items/6f089fec8dde676abb5b

をみてわからない部分を抜粋します。

1.$this

インスタンス自身を指したいときに$thisを使うというのは、

そもそもclassのなかの変数にアクセスするという意味で、クラス自身を指すのではないかと
思って納得できません。

2.super();
super();の呼び出しは。子クラスに継承するときにしか使われないという
理解で大丈夫ですか?
親クラスを呼び出すことで、親クラスのメソッドやプロパティをつかえるようにしているのですか?

3.__construct() とstaticで定義するのは、

というのは、具体的にどいうい違いがあるのですか?

class Test {

public static $a = 8; public static function sum($b,$c) { echo $b + $c; }

}

class Test {

__construct(){
$a = 8;
function sum($b,$c) {
echo $b + $c;
}
}
}

で違いを説明してくれるとありがたいです。

応えてくださる方いたら、本当に困っているのでお願いします。

があったとして、

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

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

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

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

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

Y.H.

2020/02/28 08:04

↓は比較するまでもなくPHP Parse error: syntax error になり意味のないコードになります。 class Test { __construct(){ $a = 8; function sum($b,$c) { echo $b + $c; } } }
yambejp

2020/02/28 08:09

「1.$this 」の質問の意図がわかりません 「インスタンス自身を指したいときに$thisを使うというのは、そもそもclassのなかの変数にアクセスするという意味で、クラス自身を指すのではないかと思って納得できません。 」 もう少しわかりやすく質問できないでしょうか?
退会済みユーザー

退会済みユーザー

2020/02/28 08:53

「があったとして、」
guest

回答1

0

ベストアンサー

1.$this

インスタンス自身を指したいときに$thisを使うというのは、

そもそもclassのなかの変数にアクセスするという意味で、クラス自身を指すのではないかと

思って納得できません。

そもそも、変数には、メソッド内や関数内で使えるローカル変数と、
クラスに所属するメンバー変数と、
名前空間(namespace)に属する変数と、
グローバル変数があります。

php

1// 初学者が書きがちなコード例1 2<?php 3 4class Foo { 5 public $val; 6 7 public function bar() { 8 return $val; 9 } 10} 11 12$a = new Foo(); 13echo $a->bar() . PHP_EOL;

これを実行すると、「Notice: Undefined variable: val 」が発生します。

public $val;はclass Fooに属するメンバー変数$valですが、
class Fooに属するメソッドbar()の実装でreturn $val;と書いてしまうと、
メソッド内ローカル変数の意味で$valを参照しに行って、そんなものは定義されていない、ということです。

メソッドに属するメンバー変数を確実にアクセスするために、$thisがあります。

php

1// エラーなく動く例1 2<?php 3 4class Foo { 5 public $val; 6 7 public function bar() { 8 return $this->val; 9 } 10} 11 12$a = new Foo(); 13echo $a->bar() . PHP_EOL;

とするとエラーなく実行できます。(値を$valに入れていないから、実行しても何も表示しないけどね。)

また、(混乱しやすいけど)このコードも実行できて、結果は0(改行)0(改行)となります。
-1なんて表示されません。

php

1<?php 2 3class Foo { 4 public $val = 0; 5 6 public function bar() { 7 return $this->val; 8 } 9 10 public function baz() { 11 $val = -1; // ローカル変数$valに代入しているだけで、メンバー変数に介入していないことに注意。 12 } 13} 14 15$a = new Foo(); 16echo $a->bar() . PHP_EOL; 17$a->baz(); 18echo $a->bar() . PHP_EOL;

2.super();
super();の呼び出しは。子クラスに継承するときにしか使われないという
理解で大丈夫ですか?
親クラスを呼び出すことで、親クラスのメソッドやプロパティをつかえるようにしているのですか?

んー、子クラス内メソッドから、親クラス内メソッドを呼び出す話?
super()なんてあったかなぁ、他の言語の関数などを不用意に持ち出すと混乱するよ、注意してね。

子クラスを定義するときに、特に実装を書かなければ、
親クラスが持つメンバー変数やプロパティやメソッドを使えます。
ただし、アクセス権が設定されていて、子クラスで使えたり使えなかったりします。
PHP: アクセス権 - Manual
PHPのアクセス修飾子public, protected, privateの違い | UX MILK

で、わざわざparent::~();なんて書いて親クラスのメソッドを呼び出せるようにしているのは、
子クラスで同名メソッドを定義し直すと、定義し直したコトしか実行しないので、
ほんのちょっと挙動を変えたいだけで同じコードをまた書き直すのを省きたいとか、
親クラスで変更を加えた場合それを子クラスにも継承したいとか、
いくつかの理由があるんだろうな。と察する。


3.__construct() とstaticで定義するのは、

のコード例を示されても、
メンバー変数とローカル変数を混同しているコードでは意味がわかりませんよ。

__construct()は、newでインスタンスが生成されるときに自動的に呼び出されるメソッド、コンストラクタです。
PHP: コンストラクタとデストラクタ - Manual

staticをつけたメソッドは、クラスのインスタンスを生成しなくても呼べるという特徴があります。
PHP: static キーワード - Manual

もう一度情報を整理してください。

投稿2020/02/28 08:41

編集2020/02/28 09:21
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2020/02/28 16:33

ご回答してくださりありがとうございます。 変数の種類について今一度勉強します。 質問の仕方も悪かったのに、ここまで丁寧に解説とアドバイスをくださり、とても感謝しています
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問