Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:55850 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 68160 invoked from network); 17 Oct 2011 18:19:14 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 17 Oct 2011 18:19:14 -0000 Authentication-Results: pb1.pair.com header.from=tyra3l@gmail.com; sender-id=pass Authentication-Results: pb1.pair.com smtp.mail=tyra3l@gmail.com; spf=pass; sender-id=pass Received-SPF: pass (pb1.pair.com: domain gmail.com designates 209.85.213.42 as permitted sender) X-PHP-List-Original-Sender: tyra3l@gmail.com X-Host-Fingerprint: 209.85.213.42 mail-yw0-f42.google.com Received: from [209.85.213.42] ([209.85.213.42:58815] helo=mail-yw0-f42.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 24/00-02227-0A17C9E4 for ; Mon, 17 Oct 2011 14:19:13 -0400 Received: by ywt32 with SMTP id 32so1331449ywt.29 for ; Mon, 17 Oct 2011 11:19:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=H+I/Va7WKnkt7T6f7FR/RK/t3cI0tUQSkJbIS+JE8tE=; b=GxBLYUb5Xr4XTmJfWeqmU9SWufsh6kVlJ773r1hEFcg1CXce3EESKC6FTm1Y1iIS2m rBth9ZG0cOxjxSJsSAwQRI7FnR33pvS9ojEwyOO+E+I41HLSNcrSPA3Wo8fy7JZOwQ4V nzK12CQc6NzoESXS4l849Hyi8MW/wUhh2zwxU= MIME-Version: 1.0 Received: by 10.236.182.67 with SMTP id n43mr9840365yhm.104.1318875549901; Mon, 17 Oct 2011 11:19:09 -0700 (PDT) Received: by 10.147.125.13 with HTTP; Mon, 17 Oct 2011 11:19:09 -0700 (PDT) In-Reply-To: References: Date: Mon, 17 Oct 2011 20:19:09 +0200 Message-ID: To: Stefan Marr Cc: PHP Internals Content-Type: multipart/alternative; boundary=20cf3056396fa7a33604af82a46b Subject: Re: typehinting traits From: tyra3l@gmail.com (Ferenc Kovacs) --20cf3056396fa7a33604af82a46b Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Mon, Oct 17, 2011 at 8:00 PM, Stefan Marr wrote: > Hi Ferenc: > > On 17 Oct 2011, at 19:41, Ferenc Kovacs wrote: > > > Hi Stefan, > > > > Multiple people asked me that how they can expect/check that a given > object uses a trait or not. > > Of course one could write the concrete methods as a trait and always us= e > a given interface for typehints, but I can't see why shouldn't instanceof > and typehints in general work for traits. > > Is the any technical or maybe theoretical argument against this? > > Originally I proposed traits including the semantics that traits directly > implement interfaces. > > The discussion is somewhere here: > http://www.mail-archive.com/internals@lists.php.net/msg33935.html > > I think Sebastian was the person with the strongest opinion on that > particular issue: > http://www.mail-archive.com/internals@lists.php.net/msg33948.html > > And I tend to agree with him. > > Currently I think along the following lines: > > A trait is not a full unit of reuse! > A class is. > Don't use traits where you should use classes and composition. > Traits do not guarantee anything, if you want to be sure your invariants > hold, use classes and composition. > > Traits allow to reuse behavior in a much more flexible way, but they do > not replace classes. > > And, well, then there is this: > https://wiki.php.net/rfc/horizontalreuse#requiring_composing_class_to_imp= lement_interface > > That should make sure that people can use interfaces for the purpose > envisioned here. > > For reference, there is also: https://bugs.php.net/bug.php?id=3D55613 > > > But aside of the things I said before: > - theoretically: keeping interfaces and traits apart is a good, clean > language design decision. > - practically: people LOVE ugly languages, because they get things done > > So, well, I can't claim anything about value here. > The current situation might be more friendly to the teacher. > Another design might offer more freedom/power... Thanks for the clarification. Without either having the ability to check a trait or implement an interfac= e for a trait, or at least implementing the require syntax, I think that it isn't really a non-fragile solution for my question. AFAIK the only solution available currently is something like: