Skip to content
This repository has been archived by the owner on Feb 6, 2020. It is now read-only.

Fix alias resolution #221 #230

Merged
merged 5 commits into from
Jan 22, 2018

Conversation

fhein
Copy link

@fhein fhein commented Jan 18, 2018

Can you try and open a new PR just with the test and the proposed fix?

Of course. This PR provides tests and a bug fix for mapAliasesToTargets(). The fix does not cost performance. :)


$tagged[$aCursor] = true;

if (! isset($stack)) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would set empty array to $stack before while loop:

$stack = [];

and then we can remove this condition and also unset in line 923.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

unset is faster.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@fhein so you'd like to say that isset + unset is faster than setting empty array and foreach loop on empty array?

Copy link
Author

@fhein fhein Jan 19, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes. empty($var) is an equivalent for !isset($var) || $var == false. isset is slightly faster than empty.

$stack = [] would be done on every loop, while unset is done only if $stack was used.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@fhein not sure if you understand me correctly. I know what is empty and what is the difference between empty and isset. My suggestion was to have:

$stack = []; // <-- add this line
while (isset($this->aliases[$tCursor])) {
  // ... 
}

$tagged[$aCursor] = true;

foreach ($stack as $alias) {
  // ...
}

instead of:

while (isset($this->aliases[$tCursor])) {
  // ... 
}
 
$tagged[$aCursor] = true;

if (! isset($stack)) { // <-- remove this if statement
  continue;
}

foreach ($stack as $alias) {
  // ...
}

unset($stack); // <-- remove this line

Copy link
Author

@fhein fhein Jan 19, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@fhein not sure if you understand me correctly. I know what is empty and what is the difference between empty and isset. My suggestion was to have:

I understand you correctly. See me annotations to your sample.

$stack = []; // <-- add this line  <- would be done on every iteration
while (isset($this->aliases[$tCursor])) {
      // ... 
}

$tagged[$aCursor] = true;

foreach ($stack as $alias) {
      // ...
}
instead of:

while (isset($this->aliases[$tCursor])) {
    // ... 
}

$tagged[$aCursor] = true;

foreach ($stack as $alias) {
   // ...
}
unset($stack); // <-- remove this line

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@fhein

if (! isset($stack)) { // <-- must be replaced with if ( empty($stack)

no, can be removed at all, because then we will have foreach on an empty array, and unset will be no needed.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No performance impact following your suggestion on PHP 7.x. I'll do.

continue;
}

foreach ($stack as $_ => $alias) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we are not using indexes from the array we can skip them in the foreach:

foreach ($stack as $alias) {

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

'$_ => $alias' is faster.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@weierophinney and @webimpress
$_ looks weird and it has no meaning. Is this allowed in our coding standard?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At least as of PHP 5.x foreach with explicit $key => $value is always faster.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As of 7.x it doesn't seem to make sifnificant difference.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not addressed by the coding standards, it seems.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We are humans and we want / must read the code. This type of variable name says nothing and there is also no comment to explain the current usage.
I'm not against a performance boost, but I'm against useless variable names.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@froschdesign

$_ looks weird and it has no meaning. Is this allowed in our coding standard?

with new zend-coding-standard we will get an error:

Variable _ is not in valid camel caps format

Glad we got rid of this useless variable 😄

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And what about foreach( $key as $_) ?

The current usage of $_ is to indicate that this variable will not get accessed in the loop.

Unused, yes. Useless, no.

@weierophinney weierophinney merged commit 886b6f9 into zendframework:develop Jan 22, 2018
weierophinney added a commit that referenced this pull request Jan 22, 2018
weierophinney added a commit that referenced this pull request Jan 22, 2018
@weierophinney
Copy link
Member

Thanks, @fhein; merged to develop.

@fhein fhein deleted the FIX-Alias-Resolution-#221 branch January 23, 2018 17:44
@fhein fhein restored the FIX-Alias-Resolution-#221 branch January 23, 2018 18:39
@fhein fhein deleted the FIX-Alias-Resolution-#221 branch January 23, 2018 18:49
fhein pushed a commit to fhein/zend-servicemanager that referenced this pull request Feb 7, 2018
fhein pushed a commit to fhein/zend-servicemanager that referenced this pull request Feb 7, 2018
fhein pushed a commit to fhein/zend-servicemanager that referenced this pull request Feb 8, 2018
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants