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

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

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

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

解決済

7回答

2723閲覧

オブジェクト指向の意味

kanta_m

総合スコア16

PHP

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

1グッド

2クリップ

投稿2016/03/16 06:04

PHPの学習本にオブジェクト指向の説明の箇所があり、下記のように記載されているのですが、
「インスタンス」と「オブジェクト」の違いが理解できません。
違いをお教えいただけないでしょうか。

============================================================
書籍本文

「オブジェクト指向ではプログラムの再利用がしやすいように、クラスという「処理の設計図」からインスタンスと呼ばれる「実体」を作成します。この作成した実体のことをオブジェクトというため、オブジェクト指向と呼ばれています。

marimokomokmOk👍を押しています

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

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

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

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

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

guest

回答7

0

ベストアンサー

簡潔に言えば、どちらもモノとしては同じなのですが、「オブジェクト」は「インスタンス」より広い概念です。

「インスタンス」は、クラスと対応した概念で、「DateTimeのインスタンス」というように使います。こちらを「DateTimeオブジェクト」と言っても間違いではありません。

一方で、「オブジェクト」はクラスに限らず「同じ特徴を持ったもの」みたいに使うこともあります。たとえばインターフェースであるDateTimeInterfaceについて、「DateTimeInterfaceを実装したオブジェクト」あるいは「DateTimeInterfaceオブジェクト」ということはあっても、「DateTimeInterfaceのインスタンス」と呼ばれることはふつうありません。

Javaでの例ですが、他の言語でも概ね同じです。

投稿2016/03/16 06:27

maisumakun

総合スコア145183

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

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

0

家を建てる時に設計図を描きます。
設計図を元に家を建てると家が現実の物体として存在するようになります。
このイメージに当てはめて考えると、クラス(家の設計図)をインスタンス化(家の建築)
すると家(オブジェクト)ができあがります。
抽象的な状態の物(クラスという定義)を具現化するとインスタンスになります。
インターフェースは実装する物で具現化する物とは違うのでインスタンスとは表現しません。
インターフェースを含めて全ての型はオブジェクトという表現は可能です。
なのでインスタンスはオブジェクトである、とは言えますがその逆は成立しません。

投稿2016/03/16 06:43

HiroshiWatanabe

総合スコア2160

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

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

0

「インスタンス」と「オブジェクト」の違いが理解できません。

たしかに、基本同じものだからね
型(クラス)から車ができてその車の実体そのものがオブジェクト
走っている車がインスタンス
なのでアマゾンのクラウドサーバーでは実体をオブジェクトとは呼ばす
インスタンスと呼んでいる
object(物体)とinstance(事実)の違い

投稿2016/03/17 07:45

keytan

総合スコア51

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

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

0

さて,「ざっくりした」回答をさせていただきます.
イメージしてください.

私達は**「人間クラス」の「インスタンス」**です.

人間クラスには,「眼の色」や「身長」,「体重」「名前」「性別」…などのオブジェクト(物質)の情報がセットできます.
(書籍で言う「処理の設計図」)

では,この人間クラスを使って,人間を作ってみましょう.
眼の色:黒
身長:160センチ
性別:男
etc...
このようにして属性をセットしていったものをインスタンスと呼びます.

そして,オブジェクトとは,使った設計図(クラス)と作った制作物(インスタンス)を指す言葉です.

投稿2016/03/16 06:47

編集2016/03/16 06:53
nnahito

総合スコア2004

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

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

marimokomokmOk

2017/03/10 04:13

わかりやすいです ありがとうございます
nnahito

2017/03/19 03:22

参考になったようで、嬉しいです
guest

0

始めに、これからする話はPHP特有のことではなく、プログラミング言語一般で話をします。最後に、PHPに戻ります。


###オブジェクトとは何か

オブジェクト(object)という用語はオブジェクト指向(object-oriented)という概念が誕生する以前からありました。むしろ、オブジェクト指向の「オブジェクト」はこのオブジェクトから取られたものです。しかし、オブジェクト指向言語を説明する場合において、しばしばこの話は忘れ去られ、混乱している場合があります。元々の意味のオブジェクトを広義のオブジェクト、そして、オブジェクト指向について限定されたオブジェクトを狭義のオブジェクトとして、説明します。オブジェクトがどちらを意味しているのかは、各言語間でも言語仕様書内での定義が異なり、また、各文章においても、何に言及しているかによって異なります。

####広義のオブジェクト

広義のオブジェクトから説明しましょう。この用語はオブジェクト指向とは独立した概念です。

C11仕様書ドラフト(n1570)p.6ではobjectという用語について次のように定義しています。(C11はC言語の2011年版の仕様と言うことです。C言語はオブジェクト指向言語ではありません。)

region of data storage in the execution environment, the contents of which can represent values
実行環境でのデータ記憶域であり、その中身はなんらかの値を表現できる (適当な意訳)

プログラミングでは何かしらのデータを処理します。真偽値、整数、浮動小数点数等の基本的な物から、文字列、複素数、有理数、配列、連想配列、タプル、セットなどより高度な物、そして、複数のデータをまとめた構造体、クラス、レコードと言ったさらに複雑な物まで様々です。これらのデータは何らかの形でコンピュータ上に存在し、記録され、そのデータを表すことができる形式で保存されています。これがオブジェクトです。さらに言うと、プログラミングとは、オブジェクトを作成し、それらを使って加工していくという一連の流れです。

このようにオブジェクトはプログラミングにおいて重要な概念です。一般的に使用されている言語はオブジェクトに対する何らかの操作の集合体で作成されています。オブジェクト指向とは関係がない言語、LISPやC、Haskellにおいてもオブジェクトはオブジェクトです。これが広義のオブジェクトです。

※ プログラミング言語にオブジェクトが必須というわけではありません。BrainfuckやLazy Kにはオブジェクトという概念は存在しませんが、チューリング完全(他のプログラミング言語と同等の計算が可能)です。

####狭義のオブジェクト

ここにオブジェクト指向という話が加わると少し様相が変わってきます。オブジェクト指向以前において、オブジェクトと関数は独立でした。それぞれのオブジェクトを加工していく関数群がそれぞれ動くという物でした。パッケージ化やライブラリ化である程度整理はできますが、オブジェクトをどう扱うかは関数に委ねられており、オブジェクトの中身を知らないと関数も作れませんでした。

そこで、オブジェクト同士の相互作用、オブジェクト同士が互いにメッセージを送り、オブジェクト側がそのメッセージをどのように処理するかを決めるという方法を考えました。それがオブジェクト指向です。紆余曲折を経て、メッセージングという側面はSmalltalkやRubyぐらいしか残っていませんが、オブジェクトを中心に考え、オブジェクト側に処理を決定させる(つまり、メソッドを持たせる)というところはあまり変わりありません。そして、カプセル化や多態性などの概念が追加されていきました。

そうなるとオブジェクト指向的な動作ができる__なにか__だけをオブジェクトというようになりました。これが狭義のオブジェクトです。現代において、オブジェクト指向自体がかなり広い概念と多種多様な実装方法があるため、レシーバとメソッド呼び出しという形(レシーバ.メソッド(引数)またはレシーバ->メソッド(引数))をとるという事ぐらいしか共通点がありませんが、ある言語においてオブジェクト指向におけるオブジェクトというと、このレシーバになれるなんらかのデータを示すことになりました。

狭義のオブジェクトは広義のオブジェクトに常に含まれる形になります。

###オブジェクトとインスタンスとの関係

広義のオブジェクトでは、扱っている全てのデータがオブジェクトですので、除け者はいません。なので、狭義のオブジェクト、つまり、オブジェクト指向におけるオブジェクトについて、インスタンスとの関係を述べます。

一般的に、クラスベースのオブジェクト指向において、全てのオブジェクトは何らかのクラスのインスタンスです。例外はありません。

狭義のオブジェクトの話をするときに、オブジェクト指向的に扱えるのがオブジェクトと話したと思います。それは、レシーバになれること、メソッド呼び出し(メッセージ送信)されることを意味します。通常のクラスベースオブジェクト指向ではメソッド呼び出しはそのオブジェクトを形作っているクラスのインスタンスメソッドを見に行きます。つまり、必ず、何らかのクラスのインスタンスである必要があります。抽象クラスやインタフェースというインスタンスを作れない仕組みが用意されている言語もありますが、そこから直接オブジェクトは作れません。それらを継承する具体化されたクラス(一時クラスの場合もある)をインスタンス化することで、はじめてオブジェクトになります。「○○インターフェース(の直接)のインスタンス」は存在しませんが「○○インタフェース(を継承したクラス)のインスタンス」は存在することに注意してください。わかりきっていることのため、後者の意味で使ってもほとんどの場合は通じると思います。

※ Rubyでは、特異メソッドというそのオブジェクト専用のメソッドが定義できますが、そのオブジェクト専用の特異クラス上にインスタンスメソッドとして定義されるという扱いです。

逆にクラスのインスタンスも、例外なく、オブジェクト指向におけるオブジェクトです。つまり、この二つは同じモノを指しています。しかし、「オブジェクト」は先ほども言ったとおり広義のオブジェクトの意味で言われるときがあります。そこでは完全に同じになるというわけではありません。

###各言語においてのオブジェクト

ここまでは一般論です。各言語仕様においては、オブジェクトを上のどちらか、または、全く別に定義している場合があります。

  • PHP

PHPでは、オブジェクトはクラスのインスタンスです。狭義のオブジェクトと同じ意味です。
参考: PHP: オブジェクト - Manual

  • Java

Javaでは、オブジェクトはクラスのインスタンスと配列です。いわゆる参照型に入る物がオブジェクトです。Javaにおけるオブジェクトは広義のオブジェクトとも狭義のオブジェクトととも異なります
参考: 4.3.1. Objects | Java Laguage Sepcification - Java SE 8 Edition |

  • Ruby

Rubyでは、全てがオブジェクトです。 Rubyにおいて広義のオブジェクトと狭義のオブジェクトは同じ物になります。全てが何らかのクラスのインスタンスです。
参考: オブジェクト - Ruby リファレンスマニュアル

  • ECMAScript (JavaScript)

ECMAScriptでは、Object型の何かです。プロパティを持ちます。プロトタイプベースであるため、全く同じというわけではありませんが、狭義のオブジェクトに近いです。
参考: 4.3.3 object | ECMAScript® 2016 Language Specification

投稿2017/03/19 08:34

raccy

総合スコア21735

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

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

0

インスタンスと呼ぶ場合、それは「どのクラスの」という関連がはっきりしているはすです。
「さっきまでここに'子供'が居ました」
「さっきまでここに'息子'が居ました」
後者のほうは恐らく話者か聞き手の子供でしょう。
オブジェクトとインスタンスもこんな感じかも。

投稿2016/03/16 10:51

hirohiro

総合スコア2068

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

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

0

解説しているサイトを見つけました。

クラス,インスタンス,オブジェクト

投稿2016/03/16 06:32

編集2016/03/16 06:33
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問