si (como yo) vinieron aquí en busca de un generador de código fuente para Expandido> clase, realmente no podía encontrar ninguna, y luego se me ocurrió esto (un trabajo en progreso, no está bien probado o cualquier cosa, json_decode devuelve la matriz.):
<?php
declare(strict_types = 1);
$json = <<<'JSON'
{"object_kind":"push","event_name":"push","before":"657dbca6668a99012952c58e8c8072d338b48d20","after":"5ac3eda70dbb44bfdf98a3db87515864036db0f9","ref":"refs/heads/master","checkout_sha":"5ac3eda70dbb44bfdf98a3db87515864036db0f9","message":null,"user_id":805411,"user_name":"hanshenrik","user_email":"[email protected]","user_avatar":"https://secure.gravatar.com/avatar/e3af2bd4b5604b0b661b5e6646544eba?s=80\u0026d=identicon","project_id":3498684,"project":{"name":"gitlab_integration_tests","description":"","web_url":"https://gitlab.com/divinity76/gitlab_integration_tests","avatar_url":null,"git_ssh_url":"[email protected]:divinity76/gitlab_integration_tests.git","git_http_url":"https://gitlab.com/divinity76/gitlab_integration_tests.git","namespace":"divinity76","visibility_level":0,"path_with_namespace":"divinity76/gitlab_integration_tests","default_branch":"master","homepage":"https://gitlab.com/divinity76/gitlab_integration_tests","url":"[email protected]:divinity76/gitlab_integration_tests.git","ssh_url":"[email protected]:divinity76/gitlab_integration_tests.git","http_url":"https://gitlab.com/divinity76/gitlab_integration_tests.git"},"commits":[{"id":"5ac3eda70dbb44bfdf98a3db87515864036db0f9","message":"dsf\n","timestamp":"2017-06-14T02:21:50+02:00","url":"https://gitlab.com/divinity76/gitlab_integration_tests/commit/5ac3eda70dbb44bfdf98a3db87515864036db0f9","author":{"name":"hanshenrik","email":"[email protected]"},"added":[],"modified":["gitlab_callback_page.php"],"removed":[]}],"total_commits_count":1,"repository":{"name":"gitlab_integration_tests","url":"[email protected]:divinity76/gitlab_integration_tests.git","description":"","homepage":"https://gitlab.com/divinity76/gitlab_integration_tests","git_http_url":"https://gitlab.com/divinity76/gitlab_integration_tests.git","git_ssh_url":"[email protected]:divinity76/gitlab_integration_tests.git","visibility_level":0}}
JSON;
$arr = json_decode ($json, true);
var_dump (array_to_class ($arr));
/**
*
* @param array $arr
* @param string $top_class_name
*/
function array_to_class(array $arr, string $top_class_name = "TopClass"): string {
$top_class_name = ucfirst ($top_class_name);
$classes = array(); // deduplicated 'definition'=>true,array_keys();
$internal = function (array $arr, string $top_class_name) use (&$classes, &$internal) {
$curr = 'Class ' . $top_class_name . ' {' . "\n";
foreach ($arr as $key => $val) {
$type = gettype ($val);
if (is_array ($val)) {
$type = ucfirst ((string) $key);
$classes [$internal ($val, (string) $key)] = true;
}
$curr .= <<<FOO
/**
* @property $type \$$key
*/
FOO;
$curr .= "\n public $" . $key . ";\n";
}
$curr .= '}';
$classes [$curr] = true;
};
$internal ($arr, $top_class_name);
return implode ("\n", array_keys ($classes));
}
de salida:
Class project {
/**
* @property string $name
*/
public $name;
/**
* @property string $description
*/
public $description;
/**
* @property string $web_url
*/
public $web_url;
/**
* @property NULL $avatar_url
*/
public $avatar_url;
/**
* @property string $git_ssh_url
*/
public $git_ssh_url;
/**
* @property string $git_http_url
*/
public $git_http_url;
/**
* @property string $namespace
*/
public $namespace;
/**
* @property integer $visibility_level
*/
public $visibility_level;
/**
* @property string $path_with_namespace
*/
public $path_with_namespace;
/**
* @property string $default_branch
*/
public $default_branch;
/**
* @property string $homepage
*/
public $homepage;
/**
* @property string $url
*/
public $url;
/**
* @property string $ssh_url
*/
public $ssh_url;
/**
* @property string $http_url
*/
public $http_url;
}
Class author {
/**
* @property string $name
*/
public $name;
/**
* @property string $email
*/
public $email;
}
Class added {
}
Class modified {
/**
* @property string $0
*/
public $0;
}
Class removed {
}
Class 0 {
/**
* @property string $id
*/
public $id;
/**
* @property string $message
*/
public $message;
/**
* @property string $timestamp
*/
public $timestamp;
/**
* @property string $url
*/
public $url;
/**
* @property Author $author
*/
public $author;
/**
* @property Added $added
*/
public $added;
/**
* @property Modified $modified
*/
public $modified;
/**
* @property Removed $removed
*/
public $removed;
}
Class commits {
/**
* @property 0 $0
*/
public $0;
}
Class repository {
/**
* @property string $name
*/
public $name;
/**
* @property string $url
*/
public $url;
/**
* @property string $description
*/
public $description;
/**
* @property string $homepage
*/
public $homepage;
/**
* @property string $git_http_url
*/
public $git_http_url;
/**
* @property string $git_ssh_url
*/
public $git_ssh_url;
/**
* @property integer $visibility_level
*/
public $visibility_level;
}
Class TopClass {
/**
* @property string $object_kind
*/
public $object_kind;
/**
* @property string $event_name
*/
public $event_name;
/**
* @property string $before
*/
public $before;
/**
* @property string $after
*/
public $after;
/**
* @property string $ref
*/
public $ref;
/**
* @property string $checkout_sha
*/
public $checkout_sha;
/**
* @property NULL $message
*/
public $message;
/**
* @property integer $user_id
*/
public $user_id;
/**
* @property string $user_name
*/
public $user_name;
/**
* @property string $user_email
*/
public $user_email;
/**
* @property string $user_avatar
*/
public $user_avatar;
/**
* @property integer $project_id
*/
public $project_id;
/**
* @property Project $project
*/
public $project;
/**
* @property Commits $commits
*/
public $commits;
/**
* @property integer $total_commits_count
*/
public $total_commits_count;
/**
* @property Repository $repository
*/
public $repository;
}
No creo que necesite el {} en el valor $ this -> {$ key} = $; declaración – AntonioCS
@AntonioCS, no es necesario pero definitivamente enfatiza el acceso de una propiedad de nombre variable. También demuestra que '{}' se puede usar cuando la propiedad variable se vuelve más compleja; por ejemplo, '$ this -> {$ this-> foo ('bar')} -> do_something();' –
Realmente dos buenas soluciones. No tenía conocimiento de esos métodos mágicos, buenos trucos. – John