3v4l.org

run code in 300+ PHP versions simultaneously
<?php function sanitize_term($data) { return $data; } #[AllowDynamicProperties] class WP_Term { public $term_id; public $name = ''; public $slug = ''; public $term_group = ''; public $term_taxonomy_id = 0; public $taxonomy = ''; public $description = ''; public $parent = 0; public $count = 0; public $filter = 'raw'; // public $data; // public $object_id; // // Added by wp_tag_cloud(). // public $id; // public $link = ''; // // Added by _make_cat_compat(). // public $cat_ID; // public $category_count; // public $category_description; // public $cat_name; // public $category_nicename; // public $category_parent; public function to_array() { return get_object_vars( $this ); } public function __get( $name ) { switch ( $name ) { case 'data': $data = new stdClass(); // db columns for the terms and term_taxonomy tables. $columns = array( 'term_id', 'name', 'slug', 'term_group', 'term_taxonomy_id', 'taxonomy', 'description', 'parent', 'count' ); foreach ( $columns as $column ) { $data->{$column} = isset( $this->{$column} ) ? $this->{$column} : null; } // adds the 'filter' field. return sanitize_term( $data, $data->taxonomy, 'raw' ); }; } } class Tester { private $term; private $dyanmic_properties = array( 'data', 'link', 'unknown'); public function __construct($term) { $this->term = $term; } public function test() { $this->test_isset('before'); $this->test_get(); $this->test_set(); $this->test_isset('after'); $this->dump_to_array(); $this->test_unset(); } private function test_get() { $term_data = (array) $this->term->data; } private function test_isset($message) { echo "\nTesting isset() $message set/get..\n"; foreach ($this->dyanmic_properties as $prop) { printf( "\tWP_Term::$%s: %s\n", $prop, isset($this->term->$prop) ? 'True' : 'False' ); } } private function test_set() { $this->term->unknown = 'unknown dynamic property'; $this->term->link = 'https://example.com/'; } private function test_unset() { unset($this->term->link); printf( "\nTesting unset(): Did WP_Term::\$link unset? \n%s\n", isset( $this->term->link) ? 'No' : 'Yes' ); } private function dump_to_array() { $via_to_array = $this->term->to_array(); $via_to_array_props = array_keys($via_to_array); $via_typecast = (array) $this->term; $via_typecast_props = array_keys($via_typecast); $diff1 = array_diff($via_to_array_props, $via_typecast_props); $diff2 = array_diff($via_typecast_props, $via_to_array_props); echo "\n\nAre the results the same between WP_Term::to_array() and(array) \$term?\n"; if (empty($diff1) && empty($diff2)) { echo "Yes\n"; printf( "\n\nAdditional props: %s\n", implode(', ', $this->get_additional_props_from_object_as_array( $via_to_array_props ) ) ); } else { echo "No\n"; if (! empty($diff1)) { echo "\nWP_Term::to_array() vs (array) \$term\n"; var_dump($diff1); } if (! empty($diff2)) { echo "\n(array) \$term vs WP_Term::to_array()\n"; var_dump($diff2); } printf( "\n\nAdditional props via WP_Term::to_array(): %s\n", implode(', ', $this->get_additional_props_from_object_as_array( $via_to_array_props ) ) ); printf( "\n\nAdditional props via (array) \$terms: %s\n", implode(', ', $this->get_additional_props_from_object_as_array( $via_to_array_props ) ) ); } } private function get_additional_props_from_object_as_array($object_as_array) { $base_declared_props = array('term_id', 'name', 'slug', 'term_group', 'term_taxonomy_id','taxonomy', 'description', 'parent', 'count', 'filter'); $additional_props = array(); foreach ($object_as_array as $prop) { if ( in_array( $prop, $base_declared_props, true)) { continue; } $additional_props[] = $prop; } return $additional_props; } } (new Tester( new WP_Term() ) )->test();
Output for 8.1.0 - 8.1.31, 8.2.0 - 8.2.26, 8.3.0 - 8.3.14, 8.4.1
Testing isset() before set/get.. WP_Term::$data: False WP_Term::$link: False WP_Term::$unknown: False Testing isset() after set/get.. WP_Term::$data: False WP_Term::$link: True WP_Term::$unknown: True Are the results the same between WP_Term::to_array() and(array) $term? Yes Additional props: unknown, link Testing unset(): Did WP_Term::$link unset? Yes

preferences:
53.6 ms | 407 KiB | 5 Q