Bug #60165 [Com]: Overriding unexisting trait should throw/trigger the exception/error

From: Date: Wed, 16 Nov 2011 18:59:57 +0000
Subject: Bug #60165 [Com]: Overriding unexisting trait should throw/trigger the exception/error
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-165265@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=60165&edit=1

 ID:                 60165
 Comment by:         gron@php.net
 Reported by:        fruit dot dev at gmail dot com
 Summary:            Overriding unexisting trait should throw/trigger the
                     exception/error
 Status:             Assigned
 Type:               Bug
 Package:            Scripting Engine problem
 Operating System:   Fedora 14
 PHP Version:        5.4.0beta2
 Assigned To:        gron
 Block user comment: N
 Private report:     N

 New Comment:

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++;
 		}


Previous Comments:
------------------------------------------------------------------------
[2011-10-28 21:23:56] 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)


------------------------------------------------------------------------



-- 
Edit this bug report at https://bugs.php.net/bug.php?id=60165&edit=1


Thread (4 messages)

« previous php.bugs (#165265) next »