Since there is a lot of discussion going on, i had some thoughts.
Clearing some terms before:
class = template for objects/instances
a class holds a list of methods and knows about its parents
a class can have static members/methods which can be used without
creating an object/instance
interface = a collection of methods and members that must be
implemnted
in a class/object (for example: java uses this to emulate
missing multiple
inheritance)
most languages do not allow code in an interface. for me i like
the idea
of having static members/methods in interfaces and the dynamic
part
can be done by using properties
-> leads to operator
$obj->implements('interface-name')
member = a variable bound to an instance/object (like a record
member)
instance = instance of a class with pointer to method table of
class
and memory for members (non static class members) for those
who
do not like pointers: name it class identifier and supply a
hashtable
to find the class.
object = instance with private method table that can differ from the
method table of the class it was made of (if made from class)
in other words an object can modify/override methods without
changing any class if so it is no longer boundable to any
class
property = a pseudo member realised by a getter and a setter
method
and now some questions:
-> we have no interfaces (as far as i know)
-> we have classes and instances not objects (our instances cannot
change methods, can they? but they can add members)
-> we have private, what about final, public, protected and abstract
(can we remove/hide a method from an object)?
-> do we allow to reduce visability (replace protected by private as
long as we don't have it):
class A {
public function f()..
}
class B extends A {
protected function f()...
}
and some more:
multiple inheritance = class A extends B, C
the problem is that inheritance graph now is no longer a tree
-> MANY PROBLEMS
current docu does not allow A:B:X instead it is allways 'A:B':X
therfore you cannot
access any X in C if B also has X (or does what is said about : do
apply only for
namespaces -> then its confusing!)
i would appreciate having interfaces with code!
class A {
function f(string $s) {
echo "$s\n";
}
function f(string $s1, string $s2, string $s3='')
{
f($s1.$s2.$s3);
}
function f(array $a) {
foreach($a as $s) f($s);
}
}
class B extends A {
function f(array $a) {
foreach($a as $idx=>$s) f($idx, ':',
$s);
}
}
A.f(string) -> executed
A.f(string, string, string) calls A.f(string)...
A.f(string, string) uses A.f(string, string, string)...
A.f(array) calls A.f(string)...
B.f(string) calls A.f(string)...
B.f(string, string, string) calls A.f(string, string,
string)...
B.f(string, string) uses B.f(string, string, string)...
B.f(array) calls A.f(string, string, string)...
same using interfaces:
interface L {
abstract f(string $s);
}
interface S { // interface S implemts L should work, too
f(string $s) {
echo "$s\n";
}
function f(string $s1, string $s2, string $s3='')
{
f($s1.$s2.$s3);
}
f(array $a) {
foreach($a as $s) f($s);
}
}
interface T extends S {
f(array $a) {
foreach($a as $idx=>$s) f($idx, ':',
$s);
}
}
class A implements S,L {
}
class B extends A implements T { // implements L
because A implements L
}
A.f(string) calls S.f(string) -> executed
(1) A.f(string, string, string) calls S.f(string,string,string)
calls A.f(string)
A.f(string, string) uses A.f(string, string, string)
(1) A.f(array) calls S.f(array) calls A.f(string)...
B.f(string) calls A.f(string)
B.f(string, string, string) calls A.f(string, string,
string)
B.f(string, string) uses B.f(string, string, string)
(1) B.f(array) calls T.f(array) calls B.f(string, string,
string)
so i used class info prior to interface info (runtime)
when interface code is done at compile time the result differs in
<*>:
(2) A.f(string,string,string) calls S.f(string,string,string)
calls <*>S.f(string) -> executed
(2) A.f(array) calls S.f(array) <*>calls S.f(string) ->
executed
(2) B.f(array) calls T.f(array) calls
<*>S.f(string,string,string) calls S.f(string) ->
executes
that leads to above code doing (2) and the following code
using *needs* performing (1):
interface S {
f(string $s) {
echo "$s\n";
}
}
interface S2 needs S {
function f(string $s1, string $s2, string $s3='')
{
f($s1.$s2.$s3);
}
}
interface S3 needs S {
f(array $a) {
foreach($a as $s) f($s);
}
}
interface T extends S3 {
f(array $a) {
foreach($a as $idx=>$s) f($idx, ':',
$s);
}
}
class A implements S,S2,S3 {
}
class B extends A implements T {
}
parametric inheritance = class A(type-param) ...
mostly resolved by precompilers to full class-sourcecode
i think we do not need this
BUT we will have loose-types in ZE2 so it would make sence to have
it....
BUT Then we should also have methods with same name but different
parameter signature
message-handlers?
marcus
- [PHP-DEV] aggregate() und overload() Kristian Koehntopp
- Re: [PHP-DEV] aggregate() und overload() Shane Caraveo
- Re: [PHP-DEV] aggregate() und overload() Kristian Koehntopp
- Re: [PHP-DEV] aggregate() und overload() Shane Caraveo
- Re: [PHP-DEV] aggregate() und overload() Wez Furlong
- Re: [PHP-DEV] classes, instances & objects... Marcus Börger
- Re: [PHP-DEV] classes, instances & obj... Kristian Köhntopp
- Re: [PHP-DEV] classes, instances &... Marcus Börger
- Re: [PHP-DEV] classes, instances ... Wez Furlong
- Re: [PHP-DEV] classes, instances ... Kristian Koehntopp
- Re: [PHP-DEV] classes, instan... Marcus Börger
- Re: [PHP-DEV] classes, in... Kristian Koehntopp
- Re: [PHP-DEV] classes, in... Marcus Börger
- Re: [PHP-DEV] classes, in... Andrey Hristov
- [PHP-DEV] Re: aggregate() und overload() Yasuo Ohgaki
- Re: [PHP-DEV] Re: aggregate() und overload() brad lafountain