Json_encode problem under thinkphp5

  1. I set up User.php, User.php under the model layer and have a method getUserInfo to query the data, as follows:

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

    the first printed data is as follows

       object(app\index\model\User)-sharp10 (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
       }

    and call the json_encode method to print json like this

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

    I test the value of json_encode myself. If it is an object, it will output the public properties of the object. The test code is as follows:

        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));

    print out string (15) "{" foo ":" Hello "}". Why does json_encode under thinkphp print such data

    ?
Feb.28,2021

the original Model.php under thinkphp5 implements the JSON serialization interface and calls the toArray method of Model.php, so json_encode outputs such data.

classes that implement JsonSerializable can customize their JSON presentation when json_encode ()
// JsonSerializable
public function jsonSerialize()
{
    return $this->toArray();
}

Resources:
JSON Serialization Interface

Menu