There seems to be a bug in traits that if you use any of the GLOBAL vars it
segfaults

e.g.
<?php
trait tester {
  function getStuff($a = null) {
    if ($a) {
      if (isset($_COOKIE[$a])) {
         return $_COOKIE[$a];
      }
    }
    return false;
  }
}

<?php
include "tester.php";
class beep {
  use tester;

  function beeper() {
    return $this->getStuff("tester");
  }
}

that causes a segfault

change the trait to
<?php
trait tester {
  function getStuff($a) {
    if ($a) {
      if (isset($_COOKIE[$a])) {
         return $_COOKIE[$a];
      }
    }
    return false;
  }
}

and now you get a zend_mm_corrupted,

this is in 5.4.0-beta1 compiled at 23:59 on 7th

On Mon, Jul 25, 2011 at 11:50 PM, Rasmus Lerdorf <ras...@lerdorf.com> wrote:

> On 07/25/2011 02:05 PM, Stefan Marr wrote:
> > Hi Johannes:
> >
> > 2011/7/25 Johannes Schlüter <johan...@schlueters.de>:
> >
> >> Now I use reflection on this:
> >>
> >> $rc = new ReflectionClass('C');
> >> print_r($rc->getTraitAliases());
> >>
> >> Array
> >> (
> >>    [tc] => T1::t1
> >> )
> >
> > Great, that is nice.
> >
> >
> >> So far so nice but I'm missing the information where C::t1() is coming
> >> from. In the reflection code I'm currently iterating over
> >> ce->trait_aliases and can't find where I can get the information from.
> >> Actually I'd be even interested in getting all important methods and
> >> their origin. Stefan, do you know where I can find the information or
> >> would we have to store it additionally?
> > The functions do not store that information, so there are basically
> > only two approaches, I see:
> >
> > Either, factoring out the code which is doing the flattening, conflict
> > resolution, and class composition into something which could be easily
> > shared by both the reflection and the engine, and then re-doing it on
> > demand in the reflection,
> > or we extend zend_function by an origin pointer.
> >
> > Not sure what the better tradeoff is general memory overhead vs.
> > cache-able pay-as-you-go overhead.
>
> Is it really worth any overhead here at all? This information is still
> there, you just have to work at it a bit. You know which traits are
> being used for class C. T1 and T2. You can look at T1 and T2 and see
> they both provide t1 methods, but you see from the list of aliases on C
> that T1::t1 was aliased to tc, therefore C::t1 must come from T2 since
> the trait is used in C and it isn't aliased. I don't think we need
> anything else here.
>
> -Rasmus
>
>
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>

Reply via email to