|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2011-10-28 21:23 UTC] fruit dot dev at gmail dot com
Description:
------------
In case, when user overrides invalid traits method, PHP should check whether specified method belongs to given trait.
The code given below is valid for preprocessing. Meanwhile trait "A" does not have method "getTitle", as well as trait "B" does contains "getSlug" method.
I guess, PHP should trigger error telling about the user is entangled among the three pines.
Test script:
---------------
trait A
{
public function getSlug ()
{
return $this->slug;
}
}
trait B
{
public function getTitle ()
{
return $this->title;
}
}
class Foo
{
protected $slug, $title;
use A, B
{
A::getTitle as title;
B::getSlug as slug;
}
}
$object = new Foo();
Expected result:
----------------
Error/exception should be triggered/thrown
Actual result:
--------------
silence (no errors was shown)
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Wed Nov 19 13:00:01 2025 UTC |
Thanks for the reminder. The patch is below. As soon as I find another half an hour, I will add the necessary tests and commit. Best regards Stefan --- Zend/zend_compile.c (revision 319357) +++ Zend/zend_compile.c (working copy) @@ -4036,6 +4036,8 @@ size_t i, j = 0; zend_trait_precedence *cur_precedence; zend_trait_method_reference *cur_method_ref; + char *lcname; + bool aliased_method_exists; /* resolve class references */ if (ce->trait_precedences) { @@ -4064,6 +4066,15 @@ if (ce->trait_aliases[i]->trait_method->class_name) { cur_method_ref = ce->trait_aliases[i]- >trait_method; cur_method_ref->ce = zend_fetch_class(cur_method_ref->class_name, cur_method_ref->cname_len, ZEND_FETCH_CLASS_TRAIT TSRMLS_CC); + + /** Ensure that this reference is resolvable */ + lcname = zend_str_tolower_dup(cur_method_ref- >method_name, cur_method_ref->mname_len); + aliased_method_exists = zend_hash_exists(&cur_method_ref->ce->function_table, lcname, cur_method_ref- >mname_len + 1); + efree(lcname); + + if (!aliased_method_exists) { + zend_error(E_COMPILE_ERROR, "An alias was defined for %s::%s but this method does not exist", cur_method_ref->ce- >name, cur_method_ref->method_name); + } } i++; }