From: Nikita Popov Date: Mon, 4 Nov 2019 12:02:28 +0000 (+0100) Subject: Remove support for array_key_exists() with objects X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c46b2ed677aecfc2f07993eefad0326f31c5cc44;p=php Remove support for array_key_exists() with objects --- diff --git a/UPGRADING b/UPGRADING index 0bf9bccf43..1412162b6f 100644 --- a/UPGRADING +++ b/UPGRADING @@ -41,6 +41,8 @@ PHP 8.0 UPGRADE NOTES method, using Closure::fromCallable() or ReflectionMethod::getClosure(). . Also removed ability to unbind $this from proper closures that contain uses of $this. + . Removed ability to use array_key_exists() with objects. Use one of isset() + or property_exists() instead. . Any array that has a number n as its first numeric key will use n+1 for its next implicit key. Even if n is negative. RFC: https://wiki.php.net/rfc/negative_array_index diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 673840ace5..345335b708 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2458,7 +2458,7 @@ str_offset: } } -static zend_never_inline uint32_t ZEND_FASTCALL zend_array_key_exists_fast(HashTable *ht, zval *key OPLINE_DC EXECUTE_DATA_DC) +static zend_never_inline zend_bool ZEND_FASTCALL zend_array_key_exists_fast(HashTable *ht, zval *key OPLINE_DC EXECUTE_DATA_DC) { zend_string *str; zend_ulong hval; @@ -2470,11 +2470,11 @@ try_again: goto num_key; } str_key: - return zend_hash_find_ind(ht, str) != NULL ? IS_TRUE : IS_FALSE; + return zend_hash_find_ind(ht, str) != NULL; } else if (EXPECTED(Z_TYPE_P(key) == IS_LONG)) { hval = Z_LVAL_P(key); num_key: - return zend_hash_index_find(ht, hval) != NULL ? IS_TRUE : IS_FALSE; + return zend_hash_index_find(ht, hval) != NULL; } else if (EXPECTED(Z_ISREF_P(key))) { key = Z_REFVAL_P(key); goto try_again; @@ -2486,30 +2486,22 @@ num_key: goto str_key; } else { zend_error(E_WARNING, "array_key_exists(): The first argument should be either a string or an integer"); - return IS_FALSE; + return 0; } } -static zend_never_inline uint32_t ZEND_FASTCALL zend_array_key_exists_slow(zval *subject, zval *key OPLINE_DC EXECUTE_DATA_DC) +static ZEND_COLD void ZEND_FASTCALL zend_array_key_exists_error( + zval *subject, zval *key OPLINE_DC EXECUTE_DATA_DC) { - if (EXPECTED(Z_TYPE_P(subject) == IS_OBJECT)) { - zend_error(E_DEPRECATED, "array_key_exists(): " - "Using array_key_exists() on objects is deprecated. " - "Use isset() or property_exists() instead"); - - HashTable *ht = zend_get_properties_for(subject, ZEND_PROP_PURPOSE_ARRAY_CAST); - uint32_t result = zend_array_key_exists_fast(ht, key OPLINE_CC EXECUTE_DATA_CC); - zend_release_properties(ht); - return result; - } else { - if (UNEXPECTED(Z_TYPE_P(key) == IS_UNDEF)) { - ZVAL_UNDEFINED_OP1(); - } - if (UNEXPECTED(Z_TYPE_INFO_P(subject) == IS_UNDEF)) { - ZVAL_UNDEFINED_OP2(); - } - zend_type_error("array_key_exists() expects parameter 2 to be array, %s given", zend_get_type_by_const(Z_TYPE_P(subject))); - return IS_NULL; + if (Z_TYPE_P(key) == IS_UNDEF) { + ZVAL_UNDEFINED_OP1(); + } + if (Z_TYPE_P(subject) == IS_UNDEF) { + ZVAL_UNDEFINED_OP2(); + } + if (!EG(exception)) { + zend_type_error("array_key_exists() expects parameter 2 to be array, %s given", + zend_get_type_by_const(Z_TYPE_P(subject))); } } diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 492a2d3e1f..c73f6019f6 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -1841,7 +1841,6 @@ ZEND_API HashTable *zend_std_get_properties_for(zend_object *obj, zend_prop_purp case ZEND_PROP_PURPOSE_SERIALIZE: case ZEND_PROP_PURPOSE_VAR_EXPORT: case ZEND_PROP_PURPOSE_JSON: - case _ZEND_PROP_PURPOSE_ARRAY_KEY_EXISTS: ht = obj->handlers->get_properties(obj); if (ht && !(GC_FLAGS(ht) & GC_IMMUTABLE)) { GC_ADDREF(ht); diff --git a/Zend/zend_object_handlers.h b/Zend/zend_object_handlers.h index 713669f297..19b7ff993f 100644 --- a/Zend/zend_object_handlers.h +++ b/Zend/zend_object_handlers.h @@ -98,8 +98,6 @@ typedef enum _zend_prop_purpose { ZEND_PROP_PURPOSE_VAR_EXPORT, /* Used for json_encode(). */ ZEND_PROP_PURPOSE_JSON, - /* array_key_exists(). Not intended for general use! */ - _ZEND_PROP_PURPOSE_ARRAY_KEY_EXISTS, /* Dummy member to ensure that "default" is specified. */ _ZEND_PROP_PURPOSE_NON_EXHAUSTIVE_ENUM } zend_prop_purpose; diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index cd43820463..3ba0c41d63 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -6771,7 +6771,7 @@ ZEND_VM_HANDLER(194, ZEND_ARRAY_KEY_EXISTS, CV|TMPVAR|CONST, CV|TMPVAR|CONST) zval *key, *subject; HashTable *ht; - uint32_t result; + zend_bool result; SAVE_OPLINE(); @@ -6789,12 +6789,13 @@ ZEND_VM_C_LABEL(array_key_exists_array): ZEND_VM_C_GOTO(array_key_exists_array); } } - result = zend_array_key_exists_slow(subject, key OPLINE_CC EXECUTE_DATA_CC); + zend_array_key_exists_error(subject, key OPLINE_CC EXECUTE_DATA_CC); + result = 0; } FREE_OP2(); FREE_OP1(); - ZEND_VM_SMART_BRANCH(result == IS_TRUE, 1); + ZEND_VM_SMART_BRANCH(result, 1); } /* No specialization for op_types (CONST|TMPVAR|UNUSED|CV, ANY) */ diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 75cce58ffa..f754348bac 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -6180,7 +6180,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_CO zval *key, *subject; HashTable *ht; - uint32_t result; + zend_bool result; SAVE_OPLINE(); @@ -6198,11 +6198,12 @@ array_key_exists_array: goto array_key_exists_array; } } - result = zend_array_key_exists_slow(subject, key OPLINE_CC EXECUTE_DATA_CC); + zend_array_key_exists_error(subject, key OPLINE_CC EXECUTE_DATA_CC); + result = 0; } - ZEND_VM_SMART_BRANCH(result == IS_TRUE, 1); + ZEND_VM_SMART_BRANCH(result, 1); } /* No specialization for op_types (CONST|TMPVAR|UNUSED|CV, ANY) */ @@ -8281,7 +8282,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_TM zval *key, *subject; HashTable *ht; - uint32_t result; + zend_bool result; SAVE_OPLINE(); @@ -8299,12 +8300,13 @@ array_key_exists_array: goto array_key_exists_array; } } - result = zend_array_key_exists_slow(subject, key OPLINE_CC EXECUTE_DATA_CC); + zend_array_key_exists_error(subject, key OPLINE_CC EXECUTE_DATA_CC); + result = 0; } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - ZEND_VM_SMART_BRANCH(result == IS_TRUE, 1); + ZEND_VM_SMART_BRANCH(result, 1); } /* No specialization for op_types (CONST|TMPVAR|UNUSED|CV, ANY) */ @@ -10525,7 +10527,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_CV zval *key, *subject; HashTable *ht; - uint32_t result; + zend_bool result; SAVE_OPLINE(); @@ -10543,11 +10545,12 @@ array_key_exists_array: goto array_key_exists_array; } } - result = zend_array_key_exists_slow(subject, key OPLINE_CC EXECUTE_DATA_CC); + zend_array_key_exists_error(subject, key OPLINE_CC EXECUTE_DATA_CC); + result = 0; } - ZEND_VM_SMART_BRANCH(result == IS_TRUE, 1); + ZEND_VM_SMART_BRANCH(result, 1); } /* No specialization for op_types (CONST|TMPVAR|UNUSED|CV, ANY) */ @@ -14483,7 +14486,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_C zval *key, *subject; HashTable *ht; - uint32_t result; + zend_bool result; SAVE_OPLINE(); @@ -14501,11 +14504,12 @@ array_key_exists_array: goto array_key_exists_array; } } - result = zend_array_key_exists_slow(subject, key OPLINE_CC EXECUTE_DATA_CC); + zend_array_key_exists_error(subject, key OPLINE_CC EXECUTE_DATA_CC); + result = 0; } zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - ZEND_VM_SMART_BRANCH(result == IS_TRUE, 1); + ZEND_VM_SMART_BRANCH(result, 1); } /* No specialization for op_types (CONST|TMPVAR|UNUSED|CV, ANY) */ @@ -15863,7 +15867,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_T zval *key, *subject; HashTable *ht; - uint32_t result; + zend_bool result; SAVE_OPLINE(); @@ -15881,12 +15885,13 @@ array_key_exists_array: goto array_key_exists_array; } } - result = zend_array_key_exists_slow(subject, key OPLINE_CC EXECUTE_DATA_CC); + zend_array_key_exists_error(subject, key OPLINE_CC EXECUTE_DATA_CC); + result = 0; } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - ZEND_VM_SMART_BRANCH(result == IS_TRUE, 1); + ZEND_VM_SMART_BRANCH(result, 1); } /* No specialization for op_types (CONST|TMPVAR|UNUSED|CV, ANY) */ @@ -17137,7 +17142,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_C zval *key, *subject; HashTable *ht; - uint32_t result; + zend_bool result; SAVE_OPLINE(); @@ -17155,11 +17160,12 @@ array_key_exists_array: goto array_key_exists_array; } } - result = zend_array_key_exists_slow(subject, key OPLINE_CC EXECUTE_DATA_CC); + zend_array_key_exists_error(subject, key OPLINE_CC EXECUTE_DATA_CC); + result = 0; } zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - ZEND_VM_SMART_BRANCH(result == IS_TRUE, 1); + ZEND_VM_SMART_BRANCH(result, 1); } /* No specialization for op_types (CONST|TMPVAR|UNUSED|CV, ANY) */ @@ -39657,7 +39663,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ARRAY_KEY_EXISTS_SPEC_CV_CONST zval *key, *subject; HashTable *ht; - uint32_t result; + zend_bool result; SAVE_OPLINE(); @@ -39675,11 +39681,12 @@ array_key_exists_array: goto array_key_exists_array; } } - result = zend_array_key_exists_slow(subject, key OPLINE_CC EXECUTE_DATA_CC); + zend_array_key_exists_error(subject, key OPLINE_CC EXECUTE_DATA_CC); + result = 0; } - ZEND_VM_SMART_BRANCH(result == IS_TRUE, 1); + ZEND_VM_SMART_BRANCH(result, 1); } /* No specialization for op_types (CONST|TMPVAR|UNUSED|CV, ANY) */ @@ -43043,7 +43050,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ARRAY_KEY_EXISTS_SPEC_CV_TMPVA zval *key, *subject; HashTable *ht; - uint32_t result; + zend_bool result; SAVE_OPLINE(); @@ -43061,12 +43068,13 @@ array_key_exists_array: goto array_key_exists_array; } } - result = zend_array_key_exists_slow(subject, key OPLINE_CC EXECUTE_DATA_CC); + zend_array_key_exists_error(subject, key OPLINE_CC EXECUTE_DATA_CC); + result = 0; } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - ZEND_VM_SMART_BRANCH(result == IS_TRUE, 1); + ZEND_VM_SMART_BRANCH(result, 1); } /* No specialization for op_types (CONST|TMPVAR|UNUSED|CV, ANY) */ @@ -47888,7 +47896,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ARRAY_KEY_EXISTS_SPEC_CV_CV_HA zval *key, *subject; HashTable *ht; - uint32_t result; + zend_bool result; SAVE_OPLINE(); @@ -47906,11 +47914,12 @@ array_key_exists_array: goto array_key_exists_array; } } - result = zend_array_key_exists_slow(subject, key OPLINE_CC EXECUTE_DATA_CC); + zend_array_key_exists_error(subject, key OPLINE_CC EXECUTE_DATA_CC); + result = 0; } - ZEND_VM_SMART_BRANCH(result == IS_TRUE, 1); + ZEND_VM_SMART_BRANCH(result, 1); } /* No specialization for op_types (CONST|TMPVAR|UNUSED|CV, ANY) */ diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c index 06ed51b579..4e9f9bde3c 100644 --- a/ext/spl/spl_array.c +++ b/ext/spl/spl_array.c @@ -804,7 +804,6 @@ static HashTable *spl_array_get_properties_for(zend_object *object, zend_prop_pu break; case ZEND_PROP_PURPOSE_VAR_EXPORT: case ZEND_PROP_PURPOSE_JSON: - case _ZEND_PROP_PURPOSE_ARRAY_KEY_EXISTS: dup = 0; break; default: diff --git a/ext/spl/tests/bug61347.phpt b/ext/spl/tests/bug61347.phpt index 410d65b7e9..b83f48f7ff 100644 --- a/ext/spl/tests/bug61347.phpt +++ b/ext/spl/tests/bug61347.phpt @@ -12,7 +12,6 @@ var_dump(isset($b['no_exists'])); //false var_dump(empty($b['b'])); //true var_dump(empty($b[37])); //true -var_dump(array_key_exists('b', $b)); //true var_dump($b['b']); $a = array('b' => '', 37 => false); @@ -29,9 +28,6 @@ bool(false) bool(false) bool(true) bool(true) - -Deprecated: array_key_exists(): Using array_key_exists() on objects is deprecated. Use isset() or property_exists() instead in %s on line %d -bool(true) NULL bool(true) bool(true) diff --git a/ext/standard/array.c b/ext/standard/array.c index 413ed319d7..ffa695f26d 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -6332,23 +6332,13 @@ PHP_FUNCTION(array_map) PHP_FUNCTION(array_key_exists) { zval *key; - zval *array; HashTable *ht; ZEND_PARSE_PARAMETERS_START(2, 2) Z_PARAM_ZVAL(key) - Z_PARAM_ARRAY_OR_OBJECT(array) + Z_PARAM_ARRAY_HT(ht) ZEND_PARSE_PARAMETERS_END(); - if (EXPECTED(Z_TYPE_P(array) == IS_ARRAY)) { - ht = Z_ARRVAL_P(array); - } else { - ht = zend_get_properties_for(array, ZEND_PROP_PURPOSE_ARRAY_CAST); - php_error_docref(NULL, E_DEPRECATED, - "Using array_key_exists() on objects is deprecated. " - "Use isset() or property_exists() instead"); - } - switch (Z_TYPE_P(key)) { case IS_STRING: RETVAL_BOOL(zend_symtable_exists_ind(ht, Z_STR_P(key))); @@ -6363,10 +6353,6 @@ PHP_FUNCTION(array_key_exists) php_error_docref(NULL, E_WARNING, "The first argument should be either a string or an integer"); RETVAL_FALSE; } - - if (Z_TYPE_P(array) != IS_ARRAY) { - zend_release_properties(ht); - } } /* }}} */ diff --git a/ext/standard/tests/array/array_key_exists.phpt b/ext/standard/tests/array/array_key_exists.phpt index f66648f17d..551ef85a67 100644 --- a/ext/standard/tests/array/array_key_exists.phpt +++ b/ext/standard/tests/array/array_key_exists.phpt @@ -77,29 +77,16 @@ var_dump( array_key_exists(17.5, array(1,23) ) ) ; echo "\n*** Testing operation on objects ***\n"; class key_check { - private $private_var = "Priviate var"; - protected $protected_var = "Protected var"; - public $public_var = "Public var"; - public $arr = array("var" => "value", "1" => "one", ""=>"value"); - public function print_member() - { - echo $this->$private_var."\n"; - echo $this->$protected_var."\n"; - echo $this->$public_var."\n"; - } + public $public_var = "Public var"; } $key_check_obj = new key_check; //new object -/* array_key_exists() on an object, it should work on only public member variables */ -var_dump(array_key_exists("private_var", $key_check_obj)); // not found, private member -var_dump(array_key_exists("protected_var", $key_check_obj)); // not found, private member -var_dump(array_key_exists("public_var", $key_check_obj)); // found, public member -var_dump(array_key_exists("print_member", $key_check_obj)); // not found, its a function -var_dump(array_key_exists("arr", $key_check_obj)); //found, public member -var_dump(array_key_exists("var", $key_check_obj->arr)); //found, key is in member array +try { + var_dump(array_key_exists("public_var", $key_check_obj)); +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} -/* error condition, first argument as object */ -var_dump( array_key_exists($key_check_obj, $key_check_obj) ); echo "Done\n"; ?> --EXPECTF-- @@ -240,25 +227,5 @@ Warning: array_key_exists(): The first argument should be either a string or an bool(false) *** Testing operation on objects *** - -Deprecated: array_key_exists(): Using array_key_exists() on objects is deprecated. Use isset() or property_exists() instead in %s on line %d -bool(false) - -Deprecated: array_key_exists(): Using array_key_exists() on objects is deprecated. Use isset() or property_exists() instead in %s on line %d -bool(false) - -Deprecated: array_key_exists(): Using array_key_exists() on objects is deprecated. Use isset() or property_exists() instead in %s on line %d -bool(true) - -Deprecated: array_key_exists(): Using array_key_exists() on objects is deprecated. Use isset() or property_exists() instead in %s on line %d -bool(false) - -Deprecated: array_key_exists(): Using array_key_exists() on objects is deprecated. Use isset() or property_exists() instead in %s on line %d -bool(true) -bool(true) - -Deprecated: array_key_exists(): Using array_key_exists() on objects is deprecated. Use isset() or property_exists() instead in %s on line %d - -Warning: array_key_exists(): The first argument should be either a string or an integer in %s on line %d -bool(false) +array_key_exists() expects parameter 2 to be array, object given Done diff --git a/ext/standard/tests/array/array_key_exists_object1.phpt b/ext/standard/tests/array/array_key_exists_object1.phpt deleted file mode 100644 index 5386bd624c..0000000000 --- a/ext/standard/tests/array/array_key_exists_object1.phpt +++ /dev/null @@ -1,85 +0,0 @@ ---TEST-- -Test array_key_exists() function : object functionality ---FILE-- -var1 = $a; - $this->var2 = $b; - if (!is_null($c)) { - $this->var3 = $c; - } - } -} - -echo "\n-- Do not assign a value to \$class1->var3 --\n"; -$class1 = new myClass ('a', 'b'); -echo "\$key = var1:\n"; -var_dump(array_key_exists('var1', $class1)); -echo "\$key = var3:\n"; -var_dump(array_key_exists('var3', $class1)); -echo "\$class1:\n"; -var_dump($class1); - -echo "\n-- Assign a value to \$class2->var3 --\n"; -$class2 = new myClass('x', 'y', 'z'); -echo "\$key = var3:\n"; -var_dump(array_key_exists('var3', $class2)); -echo "\$class2:\n"; -var_dump($class2); - -echo "Done"; -?> ---EXPECTF-- -*** Testing array_key_exists() : object functionality *** - --- Do not assign a value to $class1->var3 -- -$key = var1: - -Deprecated: array_key_exists(): Using array_key_exists() on objects is deprecated. Use isset() or property_exists() instead in %s on line %d -bool(true) -$key = var3: - -Deprecated: array_key_exists(): Using array_key_exists() on objects is deprecated. Use isset() or property_exists() instead in %s on line %d -bool(true) -$class1: -object(myClass)#1 (3) { - ["var1"]=> - string(1) "a" - ["var2"]=> - string(1) "b" - ["var3"]=> - NULL -} - --- Assign a value to $class2->var3 -- -$key = var3: - -Deprecated: array_key_exists(): Using array_key_exists() on objects is deprecated. Use isset() or property_exists() instead in %s on line %d -bool(true) -$class2: -object(myClass)#2 (3) { - ["var1"]=> - string(1) "x" - ["var2"]=> - string(1) "y" - ["var3"]=> - string(1) "z" -} -Done diff --git a/ext/standard/tests/array/array_key_exists_object2.phpt b/ext/standard/tests/array/array_key_exists_object2.phpt deleted file mode 100644 index b550f71a79..0000000000 --- a/ext/standard/tests/array/array_key_exists_object2.phpt +++ /dev/null @@ -1,91 +0,0 @@ ---TEST-- -Test array_key_exists() function : object functionality - different visibilities ---FILE-- -var1 = $a; - $this->var2 = $b; - if (!is_null($c)) { - $this->var3 = $c; - } - } -} - -echo "\n-- Do not assign a value to \$class1->var3 --\n"; -$class1 = new myClass ('a', 'b'); -echo "\$key = var1:\n"; -var_dump(array_key_exists('var1', $class1)); -echo "\$key = var2:\n"; -var_dump(array_key_exists('var2', $class1)); -echo "\$key = var3:\n"; -var_dump(array_key_exists('var3', $class1)); -echo "\$class1:\n"; -var_dump($class1); - -echo "\n-- Assign a value to \$class2->var3 --\n"; -$class2 = new myClass('x', 'y', 'z'); -echo "\$key = var3:\n"; -var_dump(array_key_exists('var3', $class2)); -echo "\$class2:\n"; -var_dump($class2); - -echo "Done"; -?> ---EXPECTF-- -*** Testing array_key_exists() : object functionality *** - --- Do not assign a value to $class1->var3 -- -$key = var1: - -Deprecated: array_key_exists(): Using array_key_exists() on objects is deprecated. Use isset() or property_exists() instead in %s on line %d -bool(true) -$key = var2: - -Deprecated: array_key_exists(): Using array_key_exists() on objects is deprecated. Use isset() or property_exists() instead in %s on line %d -bool(false) -$key = var3: - -Deprecated: array_key_exists(): Using array_key_exists() on objects is deprecated. Use isset() or property_exists() instead in %s on line %d -bool(false) -$class1: -object(myClass)#1 (3) { - ["var1"]=> - string(1) "a" - ["var2":protected]=> - string(1) "b" - ["var3":"myClass":private]=> - NULL -} - --- Assign a value to $class2->var3 -- -$key = var3: - -Deprecated: array_key_exists(): Using array_key_exists() on objects is deprecated. Use isset() or property_exists() instead in %s on line %d -bool(false) -$class2: -object(myClass)#2 (3) { - ["var1"]=> - string(1) "x" - ["var2":protected]=> - string(1) "y" - ["var3":"myClass":private]=> - string(1) "z" -} -Done