mirror of
https://github.com/php/php-src.git
synced 2025-08-15 21:48:51 +02:00
Declare Transliterator::$id as readonly to unlock subclassing it
Closes GH-9167.
This commit is contained in:
parent
962baf771d
commit
dd9f47758e
5 changed files with 36 additions and 67 deletions
4
NEWS
4
NEWS
|
@ -23,6 +23,10 @@ PHP NEWS
|
||||||
. Fixed bug GH-9090 (Support assigning function pointers in FFI). (Adam
|
. Fixed bug GH-9090 (Support assigning function pointers in FFI). (Adam
|
||||||
Saponara)
|
Saponara)
|
||||||
|
|
||||||
|
- Intl:
|
||||||
|
. Declared Transliterator::$id as readonly to unlock subclassing it. (Nicolas
|
||||||
|
Grekas)
|
||||||
|
|
||||||
- PCNTL:
|
- PCNTL:
|
||||||
. Fixed pcntl_(get|set)priority error handling for MacOS. (Juan Morales)
|
. Fixed pcntl_(get|set)priority error handling for MacOS. (Juan Morales)
|
||||||
|
|
||||||
|
|
26
ext/intl/tests/transliterator_child.phpt
Normal file
26
ext/intl/tests/transliterator_child.phpt
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
--TEST--
|
||||||
|
Subclass Transliterator
|
||||||
|
--EXTENSIONS--
|
||||||
|
intl
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
class ChildTransliterator extends Transliterator
|
||||||
|
{
|
||||||
|
public readonly string $id;
|
||||||
|
|
||||||
|
public static function new()
|
||||||
|
{
|
||||||
|
$tr = (new \ReflectionClass(ChildTransliterator::class))->newInstanceWithoutConstructor();
|
||||||
|
$tr->id = 'abc';
|
||||||
|
|
||||||
|
return $tr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$tr = ChildTransliterator::new();
|
||||||
|
|
||||||
|
var_dump($tr->id);
|
||||||
|
?>
|
||||||
|
--EXPECT--
|
||||||
|
string(3) "abc"
|
|
@ -5,7 +5,7 @@
|
||||||
/** @not-serializable */
|
/** @not-serializable */
|
||||||
class Transliterator
|
class Transliterator
|
||||||
{
|
{
|
||||||
public string $id;
|
public readonly string $id;
|
||||||
|
|
||||||
final private function __construct() {}
|
final private function __construct() {}
|
||||||
|
|
||||||
|
|
4
ext/intl/transliterator/transliterator_arginfo.h
generated
4
ext/intl/transliterator/transliterator_arginfo.h
generated
|
@ -1,5 +1,5 @@
|
||||||
/* This is a generated file, edit the .stub.php file instead.
|
/* This is a generated file, edit the .stub.php file instead.
|
||||||
* Stub hash: 8ef1f285c6138fbc58c1e4cef04d4ac09dfc3fef */
|
* Stub hash: 11e030b63f10d1362c41cc5c71aa0d4f014c1ffb */
|
||||||
|
|
||||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Transliterator___construct, 0, 0, 0)
|
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Transliterator___construct, 0, 0, 0)
|
||||||
ZEND_END_ARG_INFO()
|
ZEND_END_ARG_INFO()
|
||||||
|
@ -66,7 +66,7 @@ static zend_class_entry *register_class_Transliterator(void)
|
||||||
zval property_id_default_value;
|
zval property_id_default_value;
|
||||||
ZVAL_UNDEF(&property_id_default_value);
|
ZVAL_UNDEF(&property_id_default_value);
|
||||||
zend_string *property_id_name = zend_string_init("id", sizeof("id") - 1, 1);
|
zend_string *property_id_name = zend_string_init("id", sizeof("id") - 1, 1);
|
||||||
zend_declare_typed_property(class_entry, property_id_name, &property_id_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
|
zend_declare_typed_property(class_entry, property_id_name, &property_id_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_READONLY, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
|
||||||
zend_string_release(property_id_name);
|
zend_string_release(property_id_name);
|
||||||
|
|
||||||
return class_entry;
|
return class_entry;
|
||||||
|
|
|
@ -144,22 +144,11 @@ static zend_object *Transliterator_clone_obj( zend_object *object )
|
||||||
|
|
||||||
if( to_orig->utrans != NULL )
|
if( to_orig->utrans != NULL )
|
||||||
{
|
{
|
||||||
zval tempz; /* dummy zval to pass to transliterator_object_construct */
|
|
||||||
|
|
||||||
/* guaranteed to return NULL if it fails */
|
/* guaranteed to return NULL if it fails */
|
||||||
UTransliterator *utrans = utrans_clone( to_orig->utrans, TRANSLITERATOR_ERROR_CODE_P( to_orig ) );
|
UTransliterator *utrans = utrans_clone( to_orig->utrans, TRANSLITERATOR_ERROR_CODE_P( to_orig ) );
|
||||||
|
|
||||||
if( U_FAILURE( TRANSLITERATOR_ERROR_CODE( to_orig ) ) )
|
if( U_FAILURE( TRANSLITERATOR_ERROR_CODE( to_orig ) ) ) {
|
||||||
goto err;
|
|
||||||
|
|
||||||
ZVAL_OBJ(&tempz, ret_val);
|
|
||||||
transliterator_object_construct( &tempz, utrans,
|
|
||||||
TRANSLITERATOR_ERROR_CODE_P( to_orig ) );
|
|
||||||
|
|
||||||
if( U_FAILURE( TRANSLITERATOR_ERROR_CODE( to_orig ) ) )
|
|
||||||
{
|
|
||||||
zend_string *err_msg;
|
zend_string *err_msg;
|
||||||
err:
|
|
||||||
|
|
||||||
if( utrans != NULL )
|
if( utrans != NULL )
|
||||||
transliterator_object_destroy( to_new );
|
transliterator_object_destroy( to_new );
|
||||||
|
@ -173,7 +162,8 @@ err:
|
||||||
err_msg = intl_error_get_message( TRANSLITERATOR_ERROR_P( to_orig ) );
|
err_msg = intl_error_get_message( TRANSLITERATOR_ERROR_P( to_orig ) );
|
||||||
zend_throw_error( NULL, "%s", ZSTR_VAL(err_msg) );
|
zend_throw_error( NULL, "%s", ZSTR_VAL(err_msg) );
|
||||||
zend_string_free( err_msg ); /* if it's changed into a warning */
|
zend_string_free( err_msg ); /* if it's changed into a warning */
|
||||||
/* do not destroy tempz; we need to return something */
|
} else {
|
||||||
|
to_new->utrans = utrans;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -186,54 +176,6 @@ err:
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
/* {{{ get_property_ptr_ptr handler */
|
|
||||||
static zval *Transliterator_get_property_ptr_ptr( zend_object *object, zend_string *name, int type, void **cache_slot )
|
|
||||||
{
|
|
||||||
if (zend_string_equals_literal(name, "id")) {
|
|
||||||
return NULL; /* fallback to read_property */
|
|
||||||
}
|
|
||||||
return zend_std_get_property_ptr_ptr( object, name, type, cache_slot );
|
|
||||||
}
|
|
||||||
/* }}} */
|
|
||||||
|
|
||||||
/* {{{ read_property handler */
|
|
||||||
static zval *Transliterator_read_property( zend_object *object, zend_string *name, int type, void **cache_slot, zval *rv )
|
|
||||||
{
|
|
||||||
zval *retval;
|
|
||||||
|
|
||||||
if ((type != BP_VAR_R && type != BP_VAR_IS) && zend_string_equals_literal(name, "id")) {
|
|
||||||
zend_throw_error(NULL, "Transliterator::$id is read-only");
|
|
||||||
retval = &EG( uninitialized_zval );
|
|
||||||
} else {
|
|
||||||
retval = zend_std_read_property( object, name, type, cache_slot, rv );
|
|
||||||
}
|
|
||||||
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* }}} */
|
|
||||||
|
|
||||||
/* {{{ write_property handler */
|
|
||||||
static zval *Transliterator_write_property( zend_object *object, zend_string *name, zval *value,
|
|
||||||
void **cache_slot )
|
|
||||||
{
|
|
||||||
zend_class_entry *scope;
|
|
||||||
|
|
||||||
if (EG(fake_scope)) {
|
|
||||||
scope = EG(fake_scope);
|
|
||||||
} else {
|
|
||||||
scope = zend_get_executed_scope();
|
|
||||||
}
|
|
||||||
if ((scope != Transliterator_ce_ptr) && zend_string_equals_literal(name, "id")) {
|
|
||||||
zend_throw_error(NULL, "Transliterator::$id is read-only");
|
|
||||||
} else {
|
|
||||||
value = zend_std_write_property( object, name, value, cache_slot );
|
|
||||||
}
|
|
||||||
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
/* }}} */
|
|
||||||
|
|
||||||
/* {{{ transliterator_register_Transliterator_class
|
/* {{{ transliterator_register_Transliterator_class
|
||||||
* Initialize 'Transliterator' class
|
* Initialize 'Transliterator' class
|
||||||
*/
|
*/
|
||||||
|
@ -246,9 +188,6 @@ void transliterator_register_Transliterator_class( void )
|
||||||
Transliterator_handlers.offset = XtOffsetOf(Transliterator_object, zo);
|
Transliterator_handlers.offset = XtOffsetOf(Transliterator_object, zo);
|
||||||
Transliterator_handlers.free_obj = Transliterator_objects_free;
|
Transliterator_handlers.free_obj = Transliterator_objects_free;
|
||||||
Transliterator_handlers.clone_obj = Transliterator_clone_obj;
|
Transliterator_handlers.clone_obj = Transliterator_clone_obj;
|
||||||
Transliterator_handlers.get_property_ptr_ptr = Transliterator_get_property_ptr_ptr;
|
|
||||||
Transliterator_handlers.read_property = Transliterator_read_property;
|
|
||||||
Transliterator_handlers.write_property = Transliterator_write_property;
|
|
||||||
|
|
||||||
/* constants are declared in transliterator_register_constants, called from MINIT */
|
/* constants are declared in transliterator_register_constants, called from MINIT */
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue