Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:88086 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 89647 invoked from network); 7 Sep 2015 10:37:05 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 7 Sep 2015 10:37:05 -0000 Authentication-Results: pb1.pair.com smtp.mail=mail@dasprids.de; spf=permerror; sender-id=unknown Authentication-Results: pb1.pair.com header.from=mail@dasprids.de; sender-id=unknown Received-SPF: error (pb1.pair.com: domain dasprids.de from 46.4.80.198 cause and error) X-PHP-List-Original-Sender: mail@dasprids.de X-Host-Fingerprint: 46.4.80.198 server1.dasprids.de Received: from [46.4.80.198] ([46.4.80.198:60233] helo=mail.dasprids.de) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 3A/87-40368-0D86DE55 for ; Mon, 07 Sep 2015 06:37:05 -0400 Received: from [192.168.0.86] (unknown [5.158.132.254]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: mail@dasprids.de) by mail.dasprids.de (Postfix) with ESMTPSA id 2AA75344044A for ; Mon, 7 Sep 2015 12:37:02 +0200 (CEST) To: internals@lists.php.net References: <55E4B9AA.9060906@dasprids.de> <09.54.59944.CD76CE55@pb1.pair.com> Message-ID: <55ED68D2.9020508@dasprids.de> Date: Mon, 7 Sep 2015 12:37:06 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.2.0 MIME-Version: 1.0 In-Reply-To: Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg=sha-256; boundary="------------ms010101010807000106010200" Subject: Re: [PHP-DEV] Re: Generic classes and methods RFC From: mail@dasprids.de (Ben Scholzen) --------------ms010101010807000106010200 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: quoted-printable Hello, > Hi Ben! > > Generics are a feature I'd love to see in PHP. I think this RFC could d= o > with a little elaboration, though. > > Something that's particularly important to me is if it be possible to > have default values for type parameters? For example, could I make a > class like this? > > // note the =3D, a default value (like function parameters) > class List > { > private $array =3D []; > > // ... > > public function append(T $value) { > $this->array[] =3D $value; > } > } > > $integerList =3D new List; // only accepts integers > $list =3D new List; // accepts any value > > Here, 'mixed' means any type, like in the PHP manual or in Hack. We > don't currently have a 'mixed' typehint since we don't need it (you can= > simply omit a typehint for a parameter or return type), but it would be= > useful here. > > I'd like it if this was possible, because then you could make existing > classes use generics without breaking compatibility. It's also more > beginner-friendly: people who don't know about generics don't have to > use them, if the class author has made this possible. This is in keepin= g > with the "PHP way" where we don't require people to use type hints if > they don't want them. I'm not sure if we would need any other default than "mixed". Personally = I think that you should be able to instantiate any generic class which=20 does not enforce specific types on the hints without any types, which=20 automatically turns it into a mixed-type generic. That should cover this = use-case pretty easily. > On a different note, I'm not sure I like the `class Baz` > syntax. For functions parameters, we put the type name before the > variable name, e.g. `function foo(int $bar)`. So, could we do the same > here, i.e. `class <\Bar Foo>`, for consistency? As written in an earlier mail, the colon came up from another email, I'm = happy to change it if there's a better suggestion. > Though that looks a little strange to me. It's two bare identifiers nex= t > to eachother (`\Bar Foo`), unlike function parameters where the second > one has a dollar prefix (`\Bar $foo`). Perhaps type variables, like > regular variables, should have some sort of sigil in PHP? This would > make it more obvious that something is a type variable and not a class > name. To take an example from your RFC, consider the following code sni= ppet: > > class Entry > { > // ... > > public function __construct(KeyType $key, ValueType $value) > { > // ... > } > > // ... > } > > If we hadn't seen the class declaration at the top which makes `KeyType= ` > and `ValueType` be type parameters, we might not realise they weren't > ordinary classes or interfaces when we looked at `__construct`. The > -Type suffix you've used helps a little, but that's a convention, and > isn't guaranteed to be used. Also, in some existing projects, there > might be classes with that suffix. > > What if we use some sort of sigil here to make it clear? Say we used %:= > > class Entry<%KeyType, %ValueType> > { > // ... > > public function __construct(%KeyType $key, %ValueType $value) > { > // ... > } > > // ... > } > > Now, without having to look at the class declaration, we can tell that > `KeyType` isn't a class name, because it has % in front of it. I like that idea, as it makes the code easier to understand. I'm=20 wondering what other people's thoughts about that is. > Anyway, all that being said: the big challenge with generics is really > getting someone to do the nitty-gritty of implementing it. It's great > that you've got an RFC written for this, but unless someone is willing > to implement it, I fear it may go to waste. But you writing an RFC migh= t > inspire someone. There is hope! I hope so as well! > Hope my thoughts are somewhat helpful. > > -- > Andrea Faulds > http://ajf.me/ --=20 Ben Scholzen http://www.dasprids.de --------------ms010101010807000106010200 Content-Type: application/pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" Content-Description: S/MIME Cryptographic Signature MIAGCSqGSIb3DQEHAqCAMIACAQExDzANBglghkgBZQMEAgEFADCABgkqhkiG9w0BBwEAAKCC DLQwggY0MIIEHKADAgECAgEgMA0GCSqGSIb3DQEBBQUAMH0xCzAJBgNVBAYTAklMMRYwFAYD VQQKEw1TdGFydENvbSBMdGQuMSswKQYDVQQLEyJTZWN1cmUgRGlnaXRhbCBDZXJ0aWZpY2F0 ZSBTaWduaW5nMSkwJwYDVQQDEyBTdGFydENvbSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe Fw0wNzEwMjQyMTAyNTVaFw0xNzEwMjQyMTAyNTVaMIGMMQswCQYDVQQGEwJJTDEWMBQGA1UE ChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUg U2lnbmluZzE4MDYGA1UEAxMvU3RhcnRDb20gQ2xhc3MgMiBQcmltYXJ5IEludGVybWVkaWF0 ZSBDbGllbnQgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDLKIVFnAEs+xny q6UzjCqgDcvQVe1dIoFnRsQPCFO+y92k8RK0Pn3MbQ2Gd+mehh9GBZ+36uUQA7Xj9AGM6wgP hEE34vKtfpAN5tJ8LcFxveDObCKrL7O5UT9WsnAZHv7OYPYSR68mdmnEnJ83M4wQgKO19b+R t8sPDAz9ptkQsntCn4GeJzg3q2SVc4QJTg/WHo7wF2ah5LMOeh8xJVSKGEmd6uPkSbj113yK Mm8vmNptRPmM1+YgmVwcdOYJOjCgFtb2sOP79jji8uhWR91xx7TpM1K3hv/wrBZwffrmmEpU euXHRs07JqCCvFh9coKF4UQZvfEg+x3/69xRCzb1AgMBAAGjggGtMIIBqTAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrlWDb+wxyrn3HfqvazHzyB3jrLsw HwYDVR0jBBgwFoAUTgvvGqRAW6UXaYcwyjRoQ9BBrvIwZgYIKwYBBQUHAQEEWjBYMCcGCCsG AQUFBzABhhtodHRwOi8vb2NzcC5zdGFydHNzbC5jb20vY2EwLQYIKwYBBQUHMAKGIWh0dHA6 Ly93d3cuc3RhcnRzc2wuY29tL3Nmc2NhLmNydDBbBgNVHR8EVDBSMCegJaAjhiFodHRwOi8v d3d3LnN0YXJ0c3NsLmNvbS9zZnNjYS5jcmwwJ6AloCOGIWh0dHA6Ly9jcmwuc3RhcnRzc2wu Y29tL3Nmc2NhLmNybDCBgAYDVR0gBHkwdzB1BgsrBgEEAYG1NwECATBmMC4GCCsGAQUFBwIB FiJodHRwOi8vd3d3LnN0YXJ0c3NsLmNvbS9wb2xpY3kucGRmMDQGCCsGAQUFBwIBFihodHRw Oi8vd3d3LnN0YXJ0c3NsLmNvbS9pbnRlcm1lZGlhdGUucGRmMA0GCSqGSIb3DQEBBQUAA4IC AQA6qScNyNO0FpHvaZTQacVMXH33O51KyEKSRw3IvdQxRu31YR0ZDGdSfgSoOVDVMSBSdmfQ fdDInHPzV3LO5DwUXZ+lxjv7z3PO2OkfnFkvTXPfn6dxJ5rJveDsTsCPcJ/Kp6/+qN5g+J6D /SaYcFD018B6L42r0Z4VEBy36P4tjRtF14Ex10tl5tJFVKM16qWKQHbpjIgf73s49UB0CQ5l HT2DHKfq3oPfdNc5Mk93w1v4ryVb+qVrZIej8NsrWU+5r4O2IV91edDb/OtHFddZqHFFXKgS 79IHE/hwQ2LW7r3sTX7cDUCg+dfdwO8zeLxuwk2JF8crUoyrl66RGrRIhT8VoG/OJ1Y9uUlO av69V4cG8upi4ZG2l7JZFbcBFk91Wp+Payo5SuF61CmGFrZ386umkmpObtFacXda2O/bVoQ9 xHQrzoTc/0KZTWvlZCLK3Ke/vGYT9ZdW9lOjGsSFbXrlTA919L84iMK+48WGnvRWY28ZaVHp ql43AtEGhXze6iNCbEDACy+4hkQYOytAqDgcxAnQ937mYpeZFPyz/XK9QSt9VNFMuudWxZwD DDJKoQAoSG59Hou9lZ26UrK60nRdAQBmEPL8h2nuWgoPh++XVQld9yuhbsWa39Pck8/lcfz5 HUVGJF5mc/zk38iV7FDlF68puiryNq2KXHEpOTCCBngwggVgoAMCAQICAk+UMA0GCSqGSIb3 DQEBBQUAMIGMMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UE CxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzE4MDYGA1UEAxMvU3RhcnRD b20gQ2xhc3MgMiBQcmltYXJ5IEludGVybWVkaWF0ZSBDbGllbnQgQ0EwHhcNMTQwNzE2MTAw MDA3WhcNMTYwNzE2MDg0NDU3WjCBljEZMBcGA1UEDRMQbWM2UUhYMURzM2RzcU05MzELMAkG A1UEBhMCREUxGzAZBgNVBAgTEkJhZGVuLVd1ZXJ0dGVtYmVyZzESMBAGA1UEBxMJS2FybHNy dWhlMRowGAYDVQQDExFCZW5qYW1pbiBTY2hvbHplbjEfMB0GCSqGSIb3DQEJARYQbWFpbEBk YXNwcmlkcy5kZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANXLSvxoloTyTN3c TqeuaJwdSnmVmOd9yss5uUa9z5MLb8NM1Q0LEQyiR1qdjYdfswMj3vj+TLypc2Uiz7vWZbD6 Mnb+ZFvgNdpqZIxvraFVS03vD8lWiUCW1RiN7vMsNbTjLKryWoHYz68+taLT94EysoTxcmLD gxUDFpiDjPxZhqRI8EF+hE2110N5yqSo2u9QyOxiUDVGK0I+y00Xztcmw4MkjvI956KC/vC3 hjn/4KTCQ7GaX2j2pvA5NbEDJeHyU+meqe0rLdMpZ3qgP80w/B05VTo+PNbGFFrECVsh5zWy e1+jHbJakmivmFtVWHYI2oRJ8xZ06TiqmrV3RBkCAwEAAaOCAtYwggLSMAkGA1UdEwQCMAAw CwYDVR0PBAQDAgSwMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDBDAdBgNVHQ4EFgQU jHPWRhox44dOFMkk4jN/EY4csGcwHwYDVR0jBBgwFoAUrlWDb+wxyrn3HfqvazHzyB3jrLsw GwYDVR0RBBQwEoEQbWFpbEBkYXNwcmlkcy5kZTCCAUwGA1UdIASCAUMwggE/MIIBOwYLKwYB BAGBtTcBAgMwggEqMC4GCCsGAQUFBwIBFiJodHRwOi8vd3d3LnN0YXJ0c3NsLmNvbS9wb2xp Y3kucGRmMIH3BggrBgEFBQcCAjCB6jAnFiBTdGFydENvbSBDZXJ0aWZpY2F0aW9uIEF1dGhv cml0eTADAgEBGoG+VGhpcyBjZXJ0aWZpY2F0ZSB3YXMgaXNzdWVkIGFjY29yZGluZyB0byB0 aGUgQ2xhc3MgMiBWYWxpZGF0aW9uIHJlcXVpcmVtZW50cyBvZiB0aGUgU3RhcnRDb20gQ0Eg cG9saWN5LCByZWxpYW5jZSBvbmx5IGZvciB0aGUgaW50ZW5kZWQgcHVycG9zZSBpbiBjb21w bGlhbmNlIG9mIHRoZSByZWx5aW5nIHBhcnR5IG9ibGlnYXRpb25zLjA2BgNVHR8ELzAtMCug KaAnhiVodHRwOi8vY3JsLnN0YXJ0c3NsLmNvbS9jcnR1Mi1jcmwuY3JsMIGOBggrBgEFBQcB AQSBgTB/MDkGCCsGAQUFBzABhi1odHRwOi8vb2NzcC5zdGFydHNzbC5jb20vc3ViL2NsYXNz Mi9jbGllbnQvY2EwQgYIKwYBBQUHMAKGNmh0dHA6Ly9haWEuc3RhcnRzc2wuY29tL2NlcnRz L3N1Yi5jbGFzczIuY2xpZW50LmNhLmNydDAjBgNVHRIEHDAahhhodHRwOi8vd3d3LnN0YXJ0 c3NsLmNvbS8wDQYJKoZIhvcNAQEFBQADggEBAMXWuJGblFGdUPNS1MkFccBf0Z/8N2TCA/l/ Q9p8CmzBWrCbN1qbpIuXYQZBJnepjBQx4KZrnYBddqzHOOYUB4yD72TsGaXLpSVg7Btf1uKK wkL/RAAVdRoUMnuyDgQIzP6A7KOkAU+ZbQr7mW+VXinUWz1TwQWEoawb6cnCll3eVF8Xw9R0 lFuOYFb7wYd6a5yzaRrajR6OO1JC25xVlJOK4FlfBvGZrpUufPtYB2aRVk0Mj/t/XbTjS/Xn 4nut8w6ZI9gT3hS56PPQhLUslIGY5qBelkwVOeM9cMVNYSMVtbbynszXxGrdPPsj/rvdejK1 LSGZLTEPxGZ4cbFx2i0xggPqMIID5gIBATCBkzCBjDELMAkGA1UEBhMCSUwxFjAUBgNVBAoT DVN0YXJ0Q29tIEx0ZC4xKzApBgNVBAsTIlNlY3VyZSBEaWdpdGFsIENlcnRpZmljYXRlIFNp Z25pbmcxODA2BgNVBAMTL1N0YXJ0Q29tIENsYXNzIDIgUHJpbWFyeSBJbnRlcm1lZGlhdGUg Q2xpZW50IENBAgJPlDANBglghkgBZQMEAgEFAKCCAicwGAYJKoZIhvcNAQkDMQsGCSqGSIb3 DQEHATAcBgkqhkiG9w0BCQUxDxcNMTUwOTA3MTAzNzA2WjAvBgkqhkiG9w0BCQQxIgQgJAD9 WTx5QuQUyNdkuc2T6QQcEJVrh5XQoBZdOcttjxwwbAYJKoZIhvcNAQkPMV8wXTALBglghkgB ZQMEASowCwYJYIZIAWUDBAECMAoGCCqGSIb3DQMHMA4GCCqGSIb3DQMCAgIAgDANBggqhkiG 9w0DAgIBQDAHBgUrDgMCBzANBggqhkiG9w0DAgIBKDCBpAYJKwYBBAGCNxAEMYGWMIGTMIGM MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJl IERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzE4MDYGA1UEAxMvU3RhcnRDb20gQ2xhc3Mg MiBQcmltYXJ5IEludGVybWVkaWF0ZSBDbGllbnQgQ0ECAk+UMIGmBgsqhkiG9w0BCRACCzGB lqCBkzCBjDELMAkGA1UEBhMCSUwxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4xKzApBgNVBAsT IlNlY3VyZSBEaWdpdGFsIENlcnRpZmljYXRlIFNpZ25pbmcxODA2BgNVBAMTL1N0YXJ0Q29t IENsYXNzIDIgUHJpbWFyeSBJbnRlcm1lZGlhdGUgQ2xpZW50IENBAgJPlDANBgkqhkiG9w0B AQEFAASCAQA+9ZAbKjWl0WE9bQhsDB5maRAUDBVI7sQnlVkQlgQ9eGkUkB+YLgqJ7S8zCmOp mUMRhjcefSkrUbiAAjlkHQTKDAPAO0azDAu2XC5XVROGjn+it8tTDfaCRYLI4kmvP+hFXCNS 3oHOaW8ymYZBSqsVbXRS9aMIyk0B7K6I2jszZiI1np5/pnt6/BuRywFqKGOsHiEph3BgU1sm gAXt8zbCeVNQxs0c9c2z0Ia8P4XMXVCI/rpiujwaMdjL/fVOlGVqJlXh5VKMunr8xTyOocah QCQg9tTPLTf4PGTViIeDCzB6KGawleGa0KRjVi1oPYbq7ClThyOEU1VgJlW2F7elAAAAAAAA --------------ms010101010807000106010200--