2012/8/15 Giedrius Dubinskas <d.giedr...@gmail.com> > On Wed, Aug 15, 2012 at 2:19 PM, Yahav Gindi Bar <g.b.ya...@gmail.com> > wrote: > > On Wed, Aug 15, 2012 at 2:09 PM, Paul Dragoonis <dragoo...@gmail.com> > wrote: > >> > >> Comments inline. > >> > >> On Wed, Aug 15, 2012 at 11:59 AM, Giedrius Dubinskas > >> <d.giedr...@gmail.com> wrote: > >> > Hello Internals! > >> > > >> > I'm just on and off luker here but thought I'll throw in an idea for a > >> > feature I'd love to see in PHP: aliasing static methods. > >> > > >> > Syntax would look something like this: > >> > > >> > use Namespaced\SomeClass::staticMethod; > >> > use Some\Foo::bar as fooBar; > >> > > >> > staticMethod(); // would call Namespaced\SomeClass::staticMethod() > >> > >> Then you're confusing the reader, they think you're calling a > >> function, but you're actually calling a class method. Confusion++ > > Static method essentially is a function (with elevated access to > containing class) so I don't see much of a problem here. >
Don't know, how much I heard this, but: This is wrong! A function is a standalone construct, without _any_ sideeffects, which means, that it will always return the same result, when you give it the same input. I know, that this is not completely true (see rand(), file related functions, or functions build on top of (ugh...) globals), but thats not the point here. Static methods have a well defined context and state: The class they are defined in. This especially means, that they are explictly allowed to have side effects (depending on the classes state). > > >> > >> > fooBar(); // would call Some\Foo::bar() > >> > >> What if a function called staticMethod() already exists, there'd be a > >> bunch of confusion on referring to the right one. > > Aliased static method would be translated during compilation and no > additional resolution rules would be required. If one would try to > define a function with same name in same file as alias, that would > result in fatal error just like with class aliases: > > use Foo::bar as fooBar(); > > function fooBar() {} // Fatal error: Cannot redeclare ... > > >> > >> > > >> > This would make code more readable, by removing the the noise of > >> > repetition of class names. For use cases we can look at Java use cases > >> > for "import static". > >> > >> When you find a function call, you'd have to scroll up to the top of > >> the page to see if it's actually a method alias. In this case being > >> explicit is a good thing, no scrolling, no confusion. > > As of now when we see ``fooBar()`` we already have no idea where that > ``fooBar`` declaration is. It may be declared in same namespace in > some other file, in global namespace in some other file or built in > function. I don't think that explicit alias in same file adds much > confusion to what we already have. > Thats wrong: "fooBar" is either in the current, or in the global namespace, thats all. It's extremely easy to find out, wether or not a function is built-in or not (hint: Manual ;)). If it's a custom function, ok, then you usually have to look at it, but I don't see, how this is a reason to make it even more worse by adding the possibility, that it can be a method too. > > >> > > >> > Aliasing class constants like that would also be very nice. > >> > > >> > What does everyone think? > >> > Would it be possible in PHP? > >> > > >> > -- > >> > Giedrius Dubinskas > >> > >> Not that I don't welcome your suggestions, I encourage them, but for > >> this paritcular one I vote -1 on it. > >> > >> Thanks. > >> > >> > > >> > -- > >> > PHP Internals - PHP Runtime Development Mailing List > >> > To unsubscribe, visit: http://www.php.net/unsub.php > >> > > >> > >> -- > >> PHP Internals - PHP Runtime Development Mailing List > >> To unsubscribe, visit: http://www.php.net/unsub.php > >> > > > > Hi, > > > > To be honest, I'm not a fan of aliasing - and Paul supplied some of the > > reasons that stands for me. > > When one see an class / function declaration - I think that it'll make > > confuse if he/she'll have to look if this is an alias or not. Besides of > > that, there's still the issue of "overriding existing functions" rules > which > > can confuse the user. > > > > Put that aside, if you can bring some example of good practice it'll be > > great :) > > I think a good example from top of my head would be PHPUnit testing > framework. It has class PHPUnit_Framework_Assert that contains only > static assertion methods like assertEquals(), assertTrue(), etc. Then > it has class PHPUnit_Framework_TestCase that extends > PHPUnit_Framework_Assert. > > AFAICT there is no other reason for this hierarchy except to allow > shorter assertion syntax. Example from PHPUnit manual: > > require_once 'PHPUnit/Framework.php'; > > class MessageTest extends PHPUnit_Framework_TestCase > { > public function testMessage() > { > $this->assertTrue(FALSE, 'This is a custom message.'); > } > } > > What is more PHPUnit_Framework_TestCase also contains methods > dedicated for mocking like once(), returnValue(), etc. Another > example: > > class StubTest extends PHPUnit_Framework_TestCase > { > public function testReturnArgumentStub() > { > // Create a stub for the SomeClass class. > $stub = $this->getMock('SomeClass'); > > // Configure the stub. > $stub->expects($this->once()) > ->method('doSomething') > ->with($this->lessThen('something')) > ->will($this->returnValue(true)); > > $this->assertTrue($stub->doSomething('foo')); > $this->assertTrue($stub->doSomething('bar')); > } > } > > Note that PHPUnit manual promotes using $this despide the fact that > these methods are ``public static``. > > I think assertions and mocking could be decoupled and would be more > readable like this: > > use PHPUnit_Framework_Assert::assertTrue; > use PHPUnit_Framework_Assert::lessThen; > use PHPUnit_Framework_MockObject_Matcher::once; > use PHPUnit_Framework_MockObject_Matcher::returnValue; > > class StubTest extends PHPUnit_Framework_TestCase > { > public function testReturnArgumentStub() > { > // Create a stub for the SomeClass class. > $stub = $this->getMock('SomeClass'); > > // Configure the stub. > $stub->expects(once()) > ->method('doSomething') > ->with(lessThen('something')) > ->will(returnValue(true)); > > assertTrue($stub->doSomething('foo')); > assertTrue($stub->doSomething('bar')); > } > } > This means, this is once more a "I want to save characters in my code"? If you ask me: - assert*() could be _real_ functions. function assert\tue($arg, $msg) { $arg or throw new AssertionException($msg); } - assert*() could be methods within _a trait_ (to decouple it from the TestCase-class) class StubTest extends PHPUnit_Framework_TestCase { use Assertion\Boolean; public function testReturnArgumentStub() { $this->assertTrue(true); // or? self::assertTrue(true); } } Not, that I want to rewrite PHPUnit (maybe I should suggest it Sebastian Bergman for a (very) future release? :3). tl;dr: The problem I have with this suggestion is, that I don't get, want you want to solve and/or to win. Regards, Sebastian > > > > Regards, > > Yahav. > > -- > Giedrius Dubinskas > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: http://www.php.net/unsub.php > >