-
Notifications
You must be signed in to change notification settings - Fork 89
Fix alias resolution #221 #230
Fix alias resolution #221 #230
Conversation
src/ServiceManager.php
Outdated
|
||
$tagged[$aCursor] = true; | ||
|
||
if (! isset($stack)) { |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
unset is faster.
There was a problem hiding this comment.
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?
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
There was a problem hiding this comment.
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.
src/ServiceManager.php
Outdated
continue; | ||
} | ||
|
||
foreach ($stack as $_ => $alias) { |
There was a problem hiding this comment.
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) {
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
'$_ => $alias' is faster.
There was a problem hiding this comment.
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?
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
$_
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 😄
There was a problem hiding this comment.
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.
Thanks, @fhein; merged to develop. |
Of course. This PR provides tests and a bug fix for mapAliasesToTargets(). The fix does not cost performance. :)