PHPカラム名のプロパティを持つオブジェクトを生成するとき、渡すクラスの定義とfetchロジックを以下のように同一のファイル内にまとめることは出来ます。

./index.php

```

    <?php
      class Message
      {
        public $id;
        public $body;
      }
      $sql = "SELECT  id, body FROM message";
      $names = $pdo->query($sql)->fetchAll(PDO::FETCH_CLASS, "Message");
    
```

これを、クラス定義を外部ファイルにして

./Message.php

```

    <?php
     class Message
      {
        public $id;
        public $body;
      }
    
```

それをfetchロジック側に読み込んで使いたいのですが、出来ませんでした。

./index.php

```

    <?php
    include("./Message.php");
    $sql = "SELECT  id, body FROM message";
    $stmt = $pdo->query($sql)->fetchAll(PDO::FETCH_CLASS, "Message");
    
    
```

インスタンス生成は出来たので、ファイル内にクラスの読み込み自体は出来ています。

index.php

```

    $m = new Message(1, "hello world");
    
```

色々調べましたが、ORMapperよろしくモデルクラス内にアクセスするメソッドを定義する方法が主でした。  
やはりクラス内にfetchロジックを置くのが好ましいのでしょうか？  
クラス定義をfetchから分離して置く方法をお教えいただきたいです。
CC BY-SA 4.0
2020-02-29T03:15:57.110
63450
2020-03-02T15:21:22.500
2020-02-29T08:00:16.080
3060
34700
question
php database pdo
fetch(PDO::FETCH_CLASS)するときに、クラス定義を外部ファイルにしたい
こんにちは、はじめまして。

sqlite3でファイルを分割して、同様の環境を作ってみましたところ、  
結果がMessageにマップされている状態で出力されました。コードの全体像がご質問からはわかりませんので比較していただければと思います。

以下こちらで作成したコードです。

  * 外部クラスの読み込みのときはrequire_onceを利用するのがベターです。
  * Attributeも読み込み内容に関係しますのでそちらも確認してみてください

Message.class.php

```

    <?php
    class Message
    {
        public $id;
        public $body;
        public $unknown;
    }
    
```

test.php

```

    <?php
    require_once(__DIR__."/Message.class.php");
    
    $pdo = new \PDO('sqlite::memory:', null, null);
    
    $pdo->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE, \PDO::FETCH_OBJ);
    
    $pdo->prepare("CREATE TABLE IF NOT EXISTS message (`id` INTEGER NULL,`body` text)")->execute();
    
    $pdo->prepare("INSERT INTO message (id,body) VALUES (1,'a')")->execute();
    $pdo->prepare("INSERT INTO message (id,body) VALUES (2,'b')")->execute();
    $pdo->prepare("INSERT INTO message (id,body) VALUES (3,'c')")->execute();
    
    $selectQuery = "SELECT id as id,body as body FROM message";
    
    $stm = $pdo->prepare($selectQuery);
    $stm->execute(array());
    
    print_r($stm->fetchAll(\PDO::FETCH_CLASS, "Message")); 
    
```
CC BY-SA 4.0
2020-03-02T08:31:46.037
63489
2020-03-02T15:21:22.500
2020-03-02T15:21:22.500
32986
37777
63450
answer