Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:66191 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 30341 invoked from network); 25 Feb 2013 14:19:35 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 25 Feb 2013 14:19:35 -0000 Authentication-Results: pb1.pair.com header.from=florinpatan@gmail.com; sender-id=pass Authentication-Results: pb1.pair.com smtp.mail=florinpatan@gmail.com; spf=pass; sender-id=pass Received-SPF: pass (pb1.pair.com: domain gmail.com designates 209.85.214.177 as permitted sender) X-PHP-List-Original-Sender: florinpatan@gmail.com X-Host-Fingerprint: 209.85.214.177 mail-ob0-f177.google.com Received: from [209.85.214.177] ([209.85.214.177:48443] helo=mail-ob0-f177.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 8A/78-10787-6F27B215 for ; Mon, 25 Feb 2013 09:19:34 -0500 Received: by mail-ob0-f177.google.com with SMTP id wc18so2822894obb.8 for ; Mon, 25 Feb 2013 06:19:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:mime-version:in-reply-to:references:from:date:message-id :subject:to:cc:content-type; bh=kYf6wXIyy/nCXjhX2eQgRgpxZ1npL97RYVGMFunJ58A=; b=dyftUJboo1tjI0DQN+pGiH4wVVZPtHnS/x0a32ci5pFGjyPX+9uACDA0H6y/RGiyyd sydz4gyxyvfdnVcqG4ZAzcR/0azgfeWFxajC2CQjuPjsnaIOpHj1GL0ClihxSV3RVN94 uhEjOJtBwMA1r22wrIw//gnRAV47tUrHv/biYFNG3uNUhdwVh8RtraiHslq8HylzpmH4 xKNDlTYMKobJwBEPMrK1mcSwapehQSVdpQX0kw4l+wI4s9RtgK30jUtRqRwIUcjnDVH/ bvtZUcaf6VPYsWVs07pr5iqWw0qy8ba5TQshVChjrUwyqIcuYPdDlwin4pta/KEkYjwC ax0g== X-Received: by 10.182.118.103 with SMTP id kl7mr7825576obb.13.1361801971867; Mon, 25 Feb 2013 06:19:31 -0800 (PST) MIME-Version: 1.0 Received: by 10.76.169.3 with HTTP; Mon, 25 Feb 2013 06:19:01 -0800 (PST) In-Reply-To: References: Date: Mon, 25 Feb 2013 16:19:01 +0200 Message-ID: To: nilsandre@gmx.de Cc: internals@lists.php.net Content-Type: text/plain; charset=UTF-8 Subject: Re: [PHP-DEV] RFC Autoboxing Draft From: florinpatan@gmail.com (Florin Razvan Patan) Hello, See the reply inline: On Mon, Feb 25, 2013 at 3:43 PM, Nils Andre wrote: > Hi Everyone on the list, I have no RFC Karma here so far, so I post this to > the list at first. There has been ongoing discussion about new APIs and so > fort, so this is a suggestion for language cleanup by Autoboxing. I'd > really appreciate comments. Follow the steps described here in order to get RFC karma and everything should be fine: https://wiki.php.net/rfc/howto :) > == Introduction == > This RFC tries to approach the need for Autoboxing in PHP, or, to make > primitive types behave as if they were objects when being used or accessed > in an objectional fashion. Autoboxing can be discussed from various > perspectives, which is far beyond the scope of this document, which much > more addresses the fact that the language of PHP must be cleaned up in > order to grow more in terms of maturity and hence, in user accpetance. > > == Autoboxing in brief == > Autoboxing is that we can use primitive types, like integers, strings, > booleans and array as if they were objects, but without being constructed > as objects themselves. I'm not very comfortable with the autoboxing of --everything--. Could you please detail why autoboxing anything that's not array or string would be useful? I like the idea of autoboxing for strings / arrays, where the most problems related to parameters order would be solved but for the other types, as a developer I can't see it. > > Autoboxing is widely discussed, and somehow a must-have in OOP as a > consequence to having primitive types (for the sake of performance and > memory overhead) but keeping the language OOP-consistent. > > == Why PHP needs it == > PHP needs autoboxing as a means to restructure the language and make it > more predictable. One big flaw of today's PHP is, that it is unstructured > and chaotic with its builtin functions, as, for example, those dealing with > strings. Not going too much into details here, many programmes always have > to look up the function definition because very similar functions have > their parameters in different orders or simply don't act in a predictive, > well-structured manner. This article is a good read to sum it up: > > http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/ > > The problem derives from the fact that PHP has not been designed top-down, > but has been developed the bottom-up way over many years: As of today, the > language offers features other languages don't have, but struggles with > it's buried bodies from the past (mainly because compatibility had and > still has to be kept.) > > By _adding autoboxing_ for all primitive types (Booleans, Strings, > Integers, Arrays), we would clean up the language in a very consistent > manner, but still retain backwards compatibility. > > == How it could be implemented == > We would not need much programming, because we simply map the new autoboxed > notation to the old code. We suggest the new notation to reproduce the Java > notation and parameter sequence closely, because it is pretty > straightforward and consistent (see, for example, the Javadocs on > java.lang.String). > > == Syntax == > The mapping is very straigtforward. Consider this: > > $a = "This is a string"; > > $b = $a->toUpperCase() --> $b = ucase($a) > $b = $a->substring(0,4) --> $b = substr($a, 0, 4) > > It would also allow many brilliant constructs like the following > > if ($b->startsWith("This")) { ... } > > in contrast to > > if (substr($b,0,4) == "This") { ... } > > Notice that the latter is error-prone, because if the condition changes one > would always have to match the string on the right handside to the length > of it on the left. This should be done in a transparent manner imho. The current substr function should be mapped to String::substr() as well. I'd recommend you play a bit with this: https://github.com/nikic/scalar_objects and come up with some examples on how the classes would look like before going forward with this proposal. > == Compatibility == > The old notation could be switched on/off at any time. > > The old notation would be switched on by default until, say, PHP 6, and can > then be enabled/disabled by either a compile flag, INI setting or some "use > \PHP5\*;" or something on top of a PHP file, which then makes the old > notation available to any code that follows/any file that is included > afterwards. As a consequence, \PHP5 will be the namespace comprising all > "old"/compatibility stuff. IIRC disabling functionality via ini settings isn't a desired thing. As for namespaces I think it's a bad idea. Currently everything in PHP is global, not namespace and this introduces a new layer for programmers to learn of. > == Advantages == > - Cleanup of the language > - Consistency and predictability improved a lot (also in constrast to > possible userland classes - which would then all be slightly different) > - No lacking backwards compatibility > - Easier learning for new PHP programmers (beginners to PHP would be much > more pointed to learning OOP than procedural programming) > - Easier switching for programmers from Java to using PHP and vice versa > (now that PHP grew very mature, attract the Java folks with the cool stuff > PHP offers) > - Little overhead (as far as I am aware) to implement > - Nicer language syntax (see References) > > == Disadvantages == > - I don't know how complicated it is to implement. So far we don't have any > extensions for this on PECL, except for strong typing (see reference). From > a theoretical point of view, it is just mapping. > - There might be heaps of ways to implement, as the other autoboxing RFC > offers one possiblity. Certainly we need discussion on the best way to > implement. Maybe also "autoboxing" is the wrong word, as this RFC simply > suggests to map primitive types to some objectual syntax. > > == References == > This RFC [[https://wiki.php.net/rfc/autoboxing]] views it from the angle of > nicer syntax. > > [[ > http://php.webtutor.pl/en/2011/04/13/strong-data-typing-in-php-part-ii-autoboxing-and-indestructable-objects-english-version/]] > implements a sort of userland "autoboxing" in PHP. > > [[http://www.php.net/manual/en/intro.spl-types.php]] is the documentation > of PECL SPL_Types, which make strongly-typed classes for primitive types > available. While they implement strong typing (if wanted), they do not > offer syntax cleanup. Currently I'm playing around with a demo implementation of this feature but it's private at the moment, still in early stages. I'd be happy to work on and provide a patch for this later on. Currently all the RFCs should be targeted for PHP-next (5.6) so there's no rush for this imho. Have a nice day ---- Florin Patan https://github.com/dlsniper