PHPのstdClassとは何ですか?


回答:


785

stdClassPHPの一般的な空のクラスで、ObjectJavaやobjectPythonのようなものです(編集:実際にはユニバーサル基本クラスとして使用されていません。@ Ciaranに 指摘していただきありがとうございます)。

匿名オブジェクト、動的プロパティなどに役立ちます。

StdClassを検討する簡単な方法は、連想配列の代わりとして使用することです。json_decode()StdClassインスタンスまたは連想配列を取得する方法を示す以下のこの例を参照してください。また、この例にSoapClient::__soapCallは示されていませんが、StdClassインスタンスを返します。

<?php
//Example with StdClass
$json = '{ "foo": "bar", "number": 42 }';
$stdInstance = json_decode($json);
echo $stdInstance->foo . PHP_EOL; //"bar"
echo $stdInstance->number . PHP_EOL; //42
//Example with associative array
$array = json_decode($json, true);
echo $array['foo'] . PHP_EOL; //"bar"
echo $array['number'] . PHP_EOL; //42

その他の例については、PHPおよびStdClassの動的プロパティを参照してください。


7
多分彼はmysql_fetch_objectを使用しました。間違えない限り、それはstdlcassのインスタンスを作成します。
ガレン

69
これは、Javaのオブジェクトのような基本クラスではありません。以下の私の回答を参照してください。
Ciaran McNulty

1
私はあなたがPython 3.0でのオブジェクトから導出する余儀なくされている少なくとも、ないまで...あなたは、そのオブジェクトがPythonで「全て」のオブジェクトの派生クラスではありません知っている願っています
monokrome

11
stdClassはJavaScriptの{}構造のようなものだと人々は言うべきだと思います。
Earth Engine

先生、記事が正しくないため、あなたの答えは部分的に正しくありません。このクラスを拡張することで得られる唯一の(そしてこれも間違っている)ことは、ヒントを入力するオプションです。つまりfunction(StdClass $a, array $params)$aオブジェクトとかどうかをチェックしますinstanceof
Dejan Marjanovic 2014

1114

stdClass他の型をオブジェクトにキャストするときに使用される一般的な「空の」クラスにすぎません。他の2つの答えが言うことにもかかわらず、PHPのオブジェクトの基本クラスでstdClassはありません。これはかなり簡単に示すことができます:

class Foo{}
$foo = new Foo();
echo ($foo instanceof stdClass)?'Y':'N';
// outputs 'N'

PHPにベースオブジェクトの概念があるとは思わない


4
stdは何の略ですか?
アダムウェイト2013年

47
STD =スタンダード-
トマスプラド

1
これはユーティリティクラスです。ところでこれが本当のコメントです!
グスタフ

16
実際、コードスニペットの後の最初の文が質問に答えます。
MauganRa 2014年

2
@Miro Markaravanes:stdClassだけでなく、動的属性をPHPの任意のクラスに割り当てることができます。
StanE 2015年

95

stdClassは、もう1つの優れたPHP機能です。匿名のPHPクラスを作成できます。例を確認してみましょう。

$page=new stdClass();
$page->name='Home';
$page->status=1;

ここで、ページオブジェクトで初期化し、それに基づいて実行する別のクラスがあると考えます。

<?php
class PageShow {

    public $currentpage;

    public function __construct($pageobj)
    {
        $this->currentpage = $pageobj;
    }

    public function show()
    {
        echo $this->currentpage->name;
        $state = ($this->currentpage->status == 1) ? 'Active' : 'Inactive';
        echo 'This is ' . $state . ' page';
    }
}

次に、Pageオブジェクトを使用して新しいPageShowオブジェクトを作成する必要があります。

ここでは、新しいクラステンプレートを作成する必要はありません。stdClassを使用して、その場でクラスを作成できます。

    $pageview=new PageShow($page);
    $pageview->show();

3
行を処理する便利な関数を備えた空のクラス。これも優れたコーディング標準です
borrel

1
配列を使用するのと同じです。実際、STDclassは、配列からオブジェクトへの変換のような型の変換時に生成されます。
varuog 2013年

1
コードのタイプミスを修正してください:($ this-> currentpage-> name == 1)は($ this->
currentpage-

7
「匿名のPHPクラスを作成できます」- 匿名クラスではありません。instanceof、get_class、...を使用できます
John Smith

2
この回答は、特にことを今混乱してPHPが実際に匿名クラスがあるとは非常に異なっています、stdClass
IMSoP 2018年

59

また注目に値するのは、stdClassオブジェクトはの使用からも作成できるということですjson_decode()


5
本当です。必要に応じて、json_encodeとjson_decodeを頻繁に使用して、配列をオブジェクトから配列に変換します。
ピンクバンシア

6
$ x = json_decode(json_encode($ object)、True)はオブジェクトを配列にデコードしますが、バイナリセーフではありません。基本的にプレーンテキストでない場合、JSONで壊れる可能性があります。
simontemplar 2013年

@simontemplar PHPでは記述すべきではありませんTrue。ブール値は小文字trueまたはfalseです。
BadHorsie 2016

2
@simontemplarマニュアルにはありませんが、PSR-2にはあります。そのため、何らかの標準に従っている場合は、小文字にする必要があります。もちろん、そのように記述したい場合は有効ですが、標準に従う必要があります。ブール値のマニュアルドキュメントは非常に古く、おそらく標準が形成される前に書かれています。正直に言うと、PHPはもともと標準のない完全な混乱として書かれていました(使用される変数/関数/オブジェクトの命名規則の広い範囲を参照してください)。正直なところ、開発者があなたのフォーマットを使用したPHPコードは見たことがありません。
BadHorsie 2016

2
True / False / Null以外のPSR-2に従い、クラスの独自の行に開き中かっこを付けます。それ以外は気にしません。ただし、他の人のコードを編集する場合は、彼らが使用している標準(もしあれば)を使用し(ある場合は通常なし)、失敗する場合はPSR-2を「正しい」方法で実行します。3つのキーワードの大文字の使用が私の心配の中で最も少ないという他の多くの問題を抱えた神の恐ろしいコードがたくさんあります。
simontemplar

26

stdClassを使用すると、独自のプロパティを持つ新しいオブジェクトを作成できます。ユーザーの詳細を連想配列として表す次の例を考えます。

$array_user = array();
$array_user["name"] = "smith john";
$array_user["username"] = "smith";
$array_user["id"] = "1002";
$array_user["email"] = "smith@nomail.com";

オブジェクトのプロパティと同じ詳細を表す必要がある場合は、以下のようにstdClassを使用できます。

$obj_user = new stdClass;
$obj_user->name = "smith john";
$obj_user->username = "smith";
$obj_user->id = "1002";
$obj_user->email = "smith@nomail.com";

あなたがJoomla開発者であるなら、さらに理解するためにJoomlaドキュメントこの例を参照してください。


24

同様に、

$myNewObj->setNewVar = 'newVal'; 

stdClassオブジェクトを生成-自動キャスト

私はスペルミスでこれを見つけました:

$GLOBASLS['myObj']->myPropertyObj->myProperty = 'myVal';

涼しい!


9
しかし、これによりE_NOTICEが発生します
Petah

3
@Petah PHP 5.3+でのみですが、正しいですか?しかし、確かにそれは悪い習慣です。
ChristoKiwi、2014

15

stdClassは匿名クラスまたは匿名オブジェクトではありません

ここでの回答にstdClassは、匿名クラスまたは匿名オブジェクトである式が含まれます。それは本当ではありません。

stdClassは通常の事前定義済みクラスです。これは、instanceof演算子または関数を使用して確認できますget_class。ここでは特別なことは何もありません。PHPは、他の値をオブジェクトにキャストするときにこのクラスを使用します。

stdClass有用な関数と、このユースケースが実際のオブジェクトではなくデータ構造を表すという事実により、プログラマーが使用する多くの場合、配列がより良いオプションです。


8

また、Castingを使用することで、@ Bandulaの回答のように実際にオブジェクトを作成する必要がないことにも注意してください。代わりに、配列をオブジェクトにキャストするだけで、stdClassが返されます。例えば:

$array = array(
    'Property1'=>'hello',
    'Property2'=>'world',
    'Property3'=>'again',
);

$obj = (object) $array;
echo $obj->Property3;

Output: again


大好きです。ずっときれい!
WebSpanner

7

実際に空のstdClassを作成して、速度を空のクラスと比較しました。

class emp{}

次に、1000個のstdClassesとempsの作成に進みました。空のクラスは約1100マイクロ秒で実行され、stdClassesは1700マイクロ秒以上かかりました。そのため、オブジェクトをあまり使いたくない場合は、データを格納するための独自のダミークラスを作成することをお勧めします(配列は書き込みと読み取りの両方ではるかに高速です)。


22
明らかに、この違いは名前の長さの違いが原因です。クラスを「averylongclassnamefornoapparentreason」と呼ぶと、作成にかなり時間がかかります。だから図に行きます。
セージ

27
うーん...時期尚早の最適化。600マイクロ秒の時間を節約するのではなく、速度に本当に関心がある場合は、複雑なSQLクエリやその他のネットワークのボトルネックを見つけたいと思います。実際、私はどちらかが600マイクロ秒高速であるかどうかを気にするよりも、最初にJavaScriptがフッターにあるかどうかを最初にチェックする方がよいでしょう。
Ardee Aram 2013

6
1000は、信頼できるベンチマークには小さすぎます。10億を試してください。
14

1
PHPの世界では、ほとんどの場合、配列を使用する方が優れています。
Vahid Amiri 2016

^そうではありません。大規模なプロジェクトのチームで作業する場合、配列の地獄は悪夢です。
Davie Dave

6

使用中のstdClassオブジェクト

stdClassを使用すると、匿名クラスを作成でき、オブジェクトキャストを使用して、連想配列のキーにOOPスタイルでアクセスできます。通常のオブジェクトプロパティにアクセスするのと同じです。

class Example {

  private $options;

  public function __construct(Array $setup)
  {
    // casting Array to stdClass object
    $this->options = (object) $setup;

    // access stdClass object in oop style - here transform data in OOP style using some custom method or something...
    echo $this->options->{'name'}; // ->{'key'}
    echo $this->options->surname;  // ->key
  }

}

$ob1 = new Example(["name" => "John", "surname" => "Doe"]);

エコーします

ジョン・ドウ


5

本に関するいくつかのデータを保持する新しいオブジェクトをすばやく作成したい場合。あなたはこのようなことをするでしょう:

$book = new stdClass;
$book->title = "Harry Potter and the Prisoner of Azkaban";
$book->author = "J. K. Rowling";
$book->publisher = "Arthur A. Levine Books";
$book->amazon_link = "http://www.amazon.com/dp/0439136369/";

詳細については、サイトを確認してください-http ://www.webmaster-source.com/2009/08/20/php-stdclass-storing-data-object-instead-array/


4

2つの空のstdClassesは厳密には等しくないことに注意してください。これは、あざける期待を書くときに非常に重要です。

php > $a = new stdClass();
php > $b = new stdClass();
php > var_dump($a === $b);
bool(false)
php > var_dump($a == $b);
bool(true)
php > var_dump($a);
object(stdClass)#1 (0) {
}
php > var_dump($b);
object(stdClass)#2 (0) {
}
php >

同じインスタンスではないため、互いに等しいことはできません。クラスの厳密な比較は、インスタンスの識別で機能します。クラスの各インスタンスには一意のIDがあります。
Bednic

3

php.netマニュアルはI、特に同じように、いくつかの固体の説明とはstdClassが何であるかのユーザーによって貢献した例があり、この1 http://php.net/manual/en/language.oop5.basic.php#92123https://でstackoverflow.com/a/1434375/2352773

stdClassはデフォルトのPHPオブジェクトです。stdClassには、プロパティ、メソッド、親はありません。マジックメソッドをサポートしておらず、インターフェイスも実装していません。

スカラーまたは配列をObjectとしてキャストすると、stdClassのインスタンスが取得されます。汎用オブジェクトインスタンスが必要なときはいつでもstdClassを使用できます。

stdClassは基本クラスではありません!PHPクラスは、どのクラスからも自動的に継承しません。別のクラスを明示的に拡張しない限り、すべてのクラスはスタンドアロンです。PHPは、この点で多くのオブジェクト指向言語とは異なります。

stdClassを拡張するクラスを定義することもできますが、stdClassは何もしないため、メリットはありません。


3

方法です クラスにデータを入れる必要がある場合にスクリプトの解釈を停止しないようにしますが、残念ながらこのクラスは定義されていません

例:

 return $statement->fetchAll(PDO::FETCH_CLASS  , 'Tasks');

ここで、データは事前​​定義された「タスク」に配置されます。しかし、次のようにコードを実行した場合:

 return $statement->fetchAll(PDO::FETCH_CLASS );

そうして 結果を入れます

単に :見て、私たちは良いKIDS [オブジェクト]を持っていますが、親はありません。だから、私たちはそれらを乳児養護施設に送ります :)


2

を使用objectして、選択したオブジェクトに配列をキャストすることもできます。

Class Example
{
   public $name;
   public $age;
}

タイプのオブジェクトを作成Exampleして初期化するには、次のいずれかを実行します。

$example = new Example();
$example->name = "some name";
$example->age = 22;

または

$example = new Example();
$example = (object) ['name' => "some name", 'age' => 22];

2番目の方法は、多くのプロパティを持つオブジェクトを初期化する場合に主に役立ちます。


1

stClassはphp自体によって作成された空のクラスであり、phpでのみ使用する必要があります。これは単なる「空の」クラスではないため、phpはstdClassを使用して配列をオブジェクトスタイルに変換します。 :1-配列を使用(クラスよりもはるかに高速)2-独自の空のクラスを作成して使用

//example 1
$data=array('k1'=>'v1' , 'k2'=>'v2',....);

//example 2
//creating an empty class is faster than instances an stdClass
class data={}
$data=new data();
$data->k1='v1';
$data->k2='v2';

配列スタイルではなくオブジェクトスタイルの使用について誰かに何を考えさせるのですか?


0

我々が持っている理由はstdClassは、 PHPで(JavaScriptであなたが持っているように連想配列から通常の配列を区別する方法がないためである{}オブジェクトについてと[]、それらを区別するために、アレイ)を。

したがって、これは空のオブジェクトの問題を引き起こします。これを例にとります。

PHP:

$a = [1, 2, 3]; // this is an array
$b = ['one' => 1, 'two' => 2]; // this is an associate array (aka hash)
$c = ['a' => $a, 'b' => $b]; // this is also an associate array (aka hash)

変数$ cをJSONエンコードしたいとします。

echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': {one: 1, two: 2}}

ここで、すべてのキーを削除$bして空にしたとします。$bは空になっているので(覚えているすべてのキーを削除しましたか?)、それを見る[]と、どちらが配列またはオブジェクトのいずれかであるように見えます。

したがって、json_encodeを再度実行すると、出力は異なります

echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': []}

これはbアソシエイト配列であるはずでしたが、PHP(またはjson_encodeのような関数)はそうではないため、これは問題です。

stdClassが助けになります。同じ例をもう一度取る

$a = [1, 2, 3]; // this is an array
$b = (object) ['one' => 1, 'two' => 2]; // this makes it an stdClass
$c = ['a' => $a, 'b' => $b]; // this is also an associate array (aka hash)

だから今からすべてのキーを削除しても $bて空にしても、それはstdClassであるため問題ではなく、json_encodeすると次のようになります。

echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': {}}

これも理由はあるjson_encodejson_decodeデフォルトの戻りはstdClassで。

 $c = json_decode('{"a": [1,2,3], "b": {}}', true); //true to deocde as array
 // $c is now ['a' => [1,2,3], 'b' => []] in PHP
 // if you json_encode($c) again your data is now corrupted
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.