鍍金池/ 問答/PHP  網(wǎng)絡安全/ thinkphp5下json_encode問題

thinkphp5下json_encode問題

  1. 我在model層下建立User.php, User.php里有個方法getUserInfo來查詢數(shù)據(jù)的,如下:

    public function getUser()
       {
           return $this->where('id', 8)->find();
       }

    然后在controller控制器下, 實例化該用戶模型, 調用實例的getUserInfo,打印數(shù)據(jù)

    $userModel = new UserModel;
    dump($userModel->getUser());
    dump(json_encode($userModel->getUser()));

    第一個打印出來的數(shù)據(jù)如下

       object(app\index\model\User)#10 (32) {
         ["dateFormat":protected] => string(5) "Y/m/d"
         ["type":protected] => array(1) {
           ["birthday"] => string(9) "timestamp"
         }
         ["insert":protected] => array(1) {
           ["status"] => int(1)
         }
         ["connection":protected] => array(0) {
         }
         ["parent":protected] => NULL
         ["query":protected] => NULL
         ["name":protected] => string(4) "User"
         ["table":protected] => NULL
         ["class":protected] => string(20) "app\index\model\User"
         ["error":protected] => NULL
         ["validate":protected] => NULL
         ["pk":protected] => NULL
         ["field":protected] => array(0) {
         }
         ["readonly":protected] => array(0) {
         }
         ["visible":protected] => array(0) {
         }
         ["hidden":protected] => array(0) {
         }
         ["append":protected] => array(0) {
         }
         ["data":protected] => array(7) {
           ["id"] => int(8)
           ["nickname"] => string(4) "1111"
           ["name"] => string(4) "c某"
           ["password"] => string(6) "111111"
           ["create_time"] => int(0)
           ["update_time"] => int(0)
           ["status"] => int(0)
         }
         ["origin":protected] => array(7) {
           ["id"] => int(8)
           ["nickname"] => string(4) "1111"
           ["name"] => string(4) "c某"
           ["password"] => string(6) "111111"
           ["create_time"] => int(0)
           ["update_time"] => int(0)
           ["status"] => int(0)
         }
         ["relation":protected] => array(0) {
         }
         ["auto":protected] => array(0) {
         }
         ["update":protected] => array(0) {
         }
         ["autoWriteTimestamp":protected] => bool(true)
         ["createTime":protected] => string(11) "create_time"
         ["updateTime":protected] => string(11) "update_time"
         ["isUpdate":protected] => bool(true)
         ["updateWhere":protected] => array(1) {
           ["id"] => array(2) {
             [0] => string(2) "eq"
             [1] => int(8)
           }
         }
         ["failException":protected] => bool(false)
         ["useGlobalScope":protected] => bool(true)
         ["batchValidate":protected] => bool(false)
         ["resultSetType":protected] => string(5) "array"
         ["relationWrite":protected] => NULL
       }

    而調用json_encode方法打印json是這樣子

       string(132) "{"id":8,"nickname":"1111","name":"c\u67d0","password":"111111","create_time":"1970\/01\/01","update_time":"1970\/01\/01","status":0}"

    我自己測試json_encode的value如果是對象,則會輸出對象的公共屬性, 測試代碼如下:

        class TestClass
       {
           public $foo;
       
           public function __construct($foo) 
           {
               $this->foo = $foo;
           }
       
           public function __toString() {
               return $this->foo;
           }
       }
       
       $class = new TestClass('Hello');
       var_dump(json_encode($class));

    打印出則是string(15) "{"foo":"Hello"}" , 為什么thinkphp下的json_encode會打印這樣的數(shù)據(jù)

回答
編輯回答
我甘愿

原來在thinkphp5下的Model.php實現(xiàn)了JSON 序列化接口, 調用了Model.php的toArray方法,所以json_encode才會輸出這樣的數(shù)據(jù)出來.

實現(xiàn) JsonSerializable 的類可以在 json_encode() 時定制他們的 JSON 表示
// JsonSerializable
public function jsonSerialize()
{
    return $this->toArray();
}

參考資料:
JSON 序列化接口

2017年5月14日 12:56