On May 16, 2006, at 7:28 PM, D. Dante Lorenso wrote:

I'm not familiar with this OOP concept from any other language. Perhaps it exists, but if it doesn't, is there a reason why?

Hello,

Its hard to find a major OO language that does not have property/accessor method support.

C#:
private int x;
public int X { get { return x; } set { x = value; } }

Ruby:
def name, def name=(x) syntax plus attr_reader, attr_writer shortcuts
http://www.rubycentral.com/book/tut_classes.html

Delphi:
Property Name : Type read Getter write Setter;

Python:
I'm not very familiar with python, but it appears to have accessor method support:
http://www.python.org/download/releases/2.2.3/descrintro/#property

Visual Basic:
Public Property Name() As String
    Get
        Return NameValue
    End Get
    Set(ByVal Value As String)
        NameValue = Value
    End Set
End Property

Objective C:
Key Value Coding
http://developer.apple.com/documentation/Cocoa/Conceptual/ KeyValueCoding/KeyValueCoding.html

Smalltalk:
name
        ^name
name: aValue
        name := aValue

Java:
Java doesn't have a specific language syntax, but it does have a standard for declaring accessor methods.
http://java.sun.com/products/javabeans/docs/spec.html

C++:
I'm not very familiar with C++ and I don't know what is standard, but tool builders such as Microsoft and Borland have had to add their own property syntax to C++.

PHP:

PHP doesn't really have accessor method support. __get and __set are property missing handlers, not accessor methods. This leads to several problems:

1. __get/__set are too cumbersome for simple use cases. (Hence this thread) 2. __get/__set is slow. (In the best case: about 10x slower than simple property, 3x slower than an accessor method call)
3. properties defined with __get/__set can only be public
4. Reflection does not work with __get/__set
5. Source code analysis does not work with __get/__set (no phpdoc, annotations, auto completion, etc.)
6. No support for static properties via __get/__set
7. __get/__set is error prone. Mistakenly creating a simple property of the same name disables the magic methods. 8. Some obscure design problems with inheritance not worth going into here.

The Pandora's box of complexity was opened when PHP got __get and __set. readonly or readable is just a bandaid that fixes one use case of one problem, but does it in a way that doesn't help fix any of the other problems in the future.

There is nothing wrong with simple properties in PHP just the way they are now. There is also nothing wrong with __get or __set. They work well when you truly need virtual properties, such as for an active record or a proxy class.

What PHP is missing is a way to associate individual accessor methods with individual properties, just as you can in Java, C#, Ruby, Delphi, Python, Visual Basic, Objective C, Smalltalk, and sometimes C++. (To the best of my knowledge.) Read only is a special case of this capability.

Best Regards,

Jeff

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

Reply via email to