web-dev-qa-db-ja.com

PHPのstdClassとは何ですか?

stdClassが何であるかを定義してください。

981
Keira Nighly

stdClassはPHPの一般的な空のクラスで、JavaのObjectまたはPythonのobjectのようなものです(編集:しかし、実際には普遍的な基本クラスとして使用されていません;ありがとう@ Ciaran forpointing this out )。

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

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の動的プロパティ を参照してください。

744
Alex Martelli

stdClassは、他の型をオブジェクトにキャストするときに使われる単なる一般的な「空の」クラスです。他の2つの答えが言っていることにもかかわらず、stdClassではなくPHPのオブジェクトの基本クラスです。これはかなり簡単に実証できます。

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

PHPには基本オブジェクトという概念があるとは思わない

1089
Ciaran McNulty

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

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

ページオブジェクトで初期化し、それに基づいて実行するクラスがもう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();
89
Mrinmoy Ghoshal

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

59
mdpatrick

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

$array_user = array();
$array_user["name"] = "smith john";
$array_user["username"] = "smith";
$array_user["id"] = "1002";
$array_user["email"] = "[email protected]";

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

$obj_user = new stdClass;
$obj_user->name = "smith john";
$obj_user->username = "smith";
$obj_user->id = "1002";
$obj_user->email = "[email protected]";

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

25

同様に

$myNewObj->setNewVar = 'newVal'; 

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

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

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

クール!

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

ここでの回答には、stdClassが匿名クラスまたは匿名オブジェクトであるという表現が含まれています。そうではありません。

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

プログラマによってstdClassが使われる多くの場合、便利な関数とこのユースケースが実際のオブジェクトではなくデータ構造を表すという事実のために、配列はより良い選択です。

9
John Smith

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

class emp{}

その後、1000個のstdClassesとempを作成しました... stdClassesが1700マイクロ秒を超える間、空のクラスは約1100マイクロ秒で行われました。オブジェクトをそれほどひどく使用したくない場合は、データを格納するための独自のダミークラスを作成することをお勧めします(配列の方が書き込みと読み取りの両方ではるかに高速です)。

7
Sage

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

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

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

Output: again

5
Antony

使用中の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
DevWL

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

$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/ もっと詳しく.

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

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 >
4
jakub wrona

stdclass は、 php がスクリプトの解釈を停止しないようにする方法です。クラスに入れるべきデータがいくつかありますが、残念ながらこのクラスは定義されていません

例:

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

ここでデータは定義済みの 'タスク'に配置されます。しかし、私たちがこのようにコードをしたならば:

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

それから phpstdclass に結果を入れます。

単純に php は次のように述べています。見て、私たちには良いKIDSがあります。だから、私たちはそれらを幼児の子供たちのケアホーム stdclass :)に送ります。

3
Nasir Nasrallah

php.netマニュアルには、stdClassが何であるかについてのユーザーから寄せられたいくつかのしっかりした説明と例があります、私は特にこれが好きです 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は何もしないので、何の利益も得られません。

2
Danijel

stClassは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';

配列スタイルの代わりにオブジェクトスタイルを使用することを誰かに考えさせるのはなぜですか。

1
Sherif Eldeeb

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

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

Example型のオブジェクトを作成し、それを初期化するために、次のいずれかを実行できます。

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

OR

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

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

1
Vahid Amiri