Hi all!

> On 1 Dec 2014, at 13:58, Robert Stoll <p...@tutteli.ch> wrote:
> 
> I read your updated RFC:
> https://wiki.php.net/rfc/abstract_final_class

Hmm, I don’t like this new RFC either. Static classes in languages like C# 
exist because the language designers made the dogmatic decision to require 
everything to be a class. Thus, to make collections of functions, your only 
choice is to make a “utility class" with a bunch of static methods. To make 
this easier, the `static` keyword was added to make this easier in C# - Java 
doesn’t have this keyword, but it has the same pattern of static method-only 
classes. But PHP is not one of these dogmatic “everything must be a class” 
languages: it has true global functions which can be namespaced.

So, why, then, does PHP need static classes? As I see it, there are two reasons:

  (1) Functions currently cannot be autoloaded
  
  (2) Encapsulation of state (private/protected static properties)

I think both of these can be solved without perpetuating what I feel is an 
anti-pattern, the “utility class”. If they are solved, the need for utility 
classes goes away.

To implement (1), someone just needs to go and finally implement function 
autoloading. I think Joe Watkins (krakjoe) might’ve said he’d write a patch for 
that, but I may be wrong. I’d certainly like to help with this effort.

Implementing (2) is more difficult. We currently don’t have file-local 
variables like C has, we don’t even have namespaced variables. We do have 
static variables within functions, however. I can think of a few possible 
approaches to this:

  (1) Say that global state is evil and refuse to implement it. Some people 
(myself included, to an extent) would argue that global state is “spooky action 
at a distance” and we shouldn’t be encouraging it. In this case we encourage 
users to simply make normal, non-static/abstract classes and to pass an 
instance around. This is generally good programming practise anyway.

  (2) Add lexically-scoped variables, and allow normal global functions to be 
closures. By this I mean we add something like JavaScript’s `let` keyword that 
would make a variable that is unset when it falls out of scope (end of a {} 
block, end of a file etc.). Then, we allow normal functions to use the `use 
($var)` syntax and close over variables. That’d look something like this:

        <?php
        let $x = 0;
        function getCounter() use(&$x) {
            return $x;
        }
        function incrementCounter() use(&$x) {
            return $x++;
        }
        // since this is the end of the file, $x falls out of scope

      I’d quite like this, as the introduction of lexically-scoped variables 
would have other advantages, too. They would make foreach() by-reference much 
less error-prone, for example:

        <?php
        foreach ($array as let &$item) {
             // do stuff with $item
        }
        // $item is unset here, since it fell out of scope when we left the {} 
block

  (3) Add file-local variables using the `static` keyword (à la C). That’d work 
something like this:

        <?php
        static $x = 0;
        function getCounter() {
              global $x;
              return $x;
        }
        // etc.

      This would work similarly to `let`, I suppose, it’d just only be useful 
for files.

  (4) Add namespace-local variables. No idea quite how this’d work.

I’m not sure which of these is the best, though I’d leans towards (1) or (2). 
But I definitely feel that adding a `static` modifier for classes is solving 
the wrong problem. We don’t need to make utility classes easier to create. 
Rather, we need to solve the long-standing problems which force people to 
create utility classes in the first place.

Thanks!
--
Andrea Faulds
http://ajf.me/





--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to