[php] overerving van functie werkt niet

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Topicstarter
waarom zou ik deze functie niet kunnen overerven in een onderliggende klasse?
PHP:
1
2
3
4
5
6
7
8
9
10
11
    public function toArray()
    {
        $arr = array();

        foreach($this as $key => $value)
        {
            $arr[$key] = $value;
        }

        return $arr;
    }

als ik de functie binnen de onderliggende klasse plaatst werkt hij perfect :S,
van de magic functions weet ik dat je die niet kunt overerven (logisch), zoals __call e.d.

A smooth sea never made a skilled sailor


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Is dat alle (relevante) code? Laat je inherited class eens zien? En zit je functie wel in een class?

[ Voor 70% gewijzigd door RobIII op 20-07-2009 20:55 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Geef aub een glazen bol, dan kunnen we helpen. Als dat wat lastig is, is het geven van de definities van beide classes, en de foutmelding wellicht ook al een eind in de richting. ;)

{signature}


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Ik gok op het foutief gebruik van $this, maar dat is maar een gokje.

Acties:
  • 0 Henk 'm!

  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Topicstarter
excuses, ik dacht dat ik alles gepost had, wanneer ik hem in deze class zet werkt hij zonder problemen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?
require_once(dirname(__FILE__) . "/../globalConfig.php");

class product extends webshop
{
    //Empty constructor for Class
    public function __construct()
    {}

    //Return a named array with all data from object
    public function toArray()
    {
        $arr = array();

        foreach($this as $key => $value)
        {
            $arr[$key] = $value;
        }

        return $arr;
    }   
}
?>


maar wanneer hij in de parent class staat pakt hij hem niet (hij returned een LEGE ARRAY)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?
require_once(dirname(__FILE__) . "/../globalConfig.php");

class webshop
{
    //Attributes for class Type
    //Methods for class Type

    //Empty constructor for Class
    public function __construct()
    {
        $this->dbConnect();
    }

    //Return a named array with all data from object
    public function toArray()
    {
        $arr = array();

        foreach($this as $key => $value)
        {
            $arr[$key] = $value;
        }

        return $arr;
    }       
}
?>

A smooth sea never made a skilled sailor


Acties:
  • 0 Henk 'm!

  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Topicstarter
HuHu schreef op maandag 20 juli 2009 @ 21:17:
Ik gok op het foutief gebruik van $this, maar dat is maar een gokje.
goeie gok denk ik, want daar denk ik ook al een tijd aan, maar ik begrijp dan niet waarom hij perfect werkt in de onderliggende classe

A smooth sea never made a skilled sailor


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
En waar maak je de instance aan, waar hoe ziet de call naar toArray eruit? Is die niet stiekem static en negeer je een E_STRICT error, etc. etc.

{signature}


Acties:
  • 0 Henk 'm!

  • masq
  • Registratie: September 2004
  • Laatst online: 18-04 00:18
Visibility

The visibility of a property or method can be defined by prefixing the declaration with the keywords: public, protected or private. Public declared items can be accessed everywhere. Protected limits access to inherited and parent classes (and to the class that defines the item). Private limits visibility only to the class that defines the item.
http://www.php.net/manual/en/language.oop5.visibility.php

Ligt het hier niet aan? Aangezien de methode in de supertype gedefinieerd is.

[ Voor 7% gewijzigd door masq op 20-07-2009 21:51 ]


Acties:
  • 0 Henk 'm!

  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Topicstarter
Voutloos schreef op maandag 20 juli 2009 @ 21:32:
En waar maak je de instance aan, waar hoe ziet de call naar toArray eruit? Is die niet stiekem static en negeer je een E_STRICT error, etc. etc.
error_reporting(E_ALL);


de call is niet static, de instance maak ik gewoon in een functie
$blaat = new product;
$boe = $blaat->open(); //hier vult hij de properties in
$meuh = $blaat->toArray();

let er op dat het bij open() gewoon goed gaat (ik heb nl. gecheckt of ze ingevuld zijn)

A smooth sea never made a skilled sailor


Acties:
  • 0 Henk 'm!

Verwijderd

product extends webshop... Een product is dus een webshop?

Acties:
  • 0 Henk 'm!

  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Topicstarter
Verwijderd schreef op maandag 20 juli 2009 @ 21:57:
product extends webshop... Een product is dus een webshop?
lol, nee dat klopt niet :)

A smooth sea never made a skilled sailor


Acties:
  • 0 Henk 'm!

  • Rian
  • Registratie: Januari 2005
  • Laatst online: 21-05 09:42
PHP:
1
2
3
4
 foreach($this as $key => $value)
        {
            $arr[$key] = $value;
        }


Vziw kun je niet zomaar een compleet object in een foreach statement stoppen. Als je dynamisch alle waarden van je object in een array wilt teruggeven, moet je een method gebruiken die alle variabelen ophaalt. Een voorbeeld daarvan is get_class_vars, ik zou daar eens naar kijken in de php manual.

Wat ik persoonlijk zou doen is een functie schrijven die dmv get_class_vars alle variabelen returned. Wanneer je de variabelen weet, kun je met het grootste gemak de bijbehorende waardes ophalen.

Acties:
  • 0 Henk 'm!

  • masq
  • Registratie: September 2004
  • Laatst online: 18-04 00:18
Rian schreef op maandag 20 juli 2009 @ 22:13:
Vziw kun je niet zomaar een compleet object in een foreach statement stoppen.
Jawel hoor, zie http://php.net/manual/en/language.oop5.iterations.php

TS: Wat is de visibility van de class members? Anders valt er nog steeds niets nuttigs over te zeggen.

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Doe eens:

PHP:
1
error_reporting(E_ALL | E_STRICT);

Acties:
  • 0 Henk 'm!

Verwijderd

wboard schreef op maandag 20 juli 2009 @ 22:04:
[...]

lol, nee dat klopt niet :)
Just wondering... Het kwam me al enigszins vreemd over :)

Acties:
  • 0 Henk 'm!

  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Topicstarter
-De visibility van de class members is PRIVATE, maar dat zou toch niet uit moeten maken als je een methode overerft??

-Die error reporting zal ik eens aanzetten, post het zo ff

-@rian: ja dat kan wel, vandaar ook dat het binnen de class zelf wel werkt

A smooth sea never made a skilled sailor


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
wboard schreef op dinsdag 21 juli 2009 @ 09:21:
-De visibility van de class members is PRIVATE, maar dat zou toch niet uit moeten maken als je een methode overerft??
Probeer het eens en leer er van. ;)

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

wboard schreef op dinsdag 21 juli 2009 @ 09:21:
-De visibility van de class members is PRIVATE, maar dat zou toch niet uit moeten maken als je een methode overerft??

-Die error reporting zal ik eens aanzetten, post het zo ff

-@rian: ja dat kan wel, vandaar ook dat het binnen de class zelf wel werkt
Als je in je base class een member als private declareert, dan is dat member alleen visible voor die base class. Wil je echter dat de bewuste member visible blijft in de overervingsstructuur, dus in de derived classes van die base zul je ze als protected moeten declareren.
Voorbeeld (C#, ik verwacht dat PHP hetzelfde zal doen :P):
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
namespace Inheritance
{
    class Base
    {
        private string _myPrivateMember = string.Empty;
        protected string _myProtectedMember = string.Empty;
        public string _myPublicMember = string.Empty;

        public Base()
        {
            // alle 3 de members kunnen in deze constructor gezet worden
            _myPrivateMember = "private";
            _myProtectedMember  = "protected";
            _myPublicMember = "public";
        }
    }

    class Derived : Base
    {
        public Derived()
        {
            // alleen de protected en public kunnen in deze constructor gezet worden
            // de private member is dus niet zichtbaar voor deze class
            _myProtectedMember = "protected";
            _myPublicMember = "public";
        }
    }
}

Acties:
  • 0 Henk 'm!

  • Zyppora
  • Registratie: December 2005
  • Laatst online: 12-09 10:59

Zyppora

155/50 Warlock

$this verwijst naar de instance van de class waarin het aangeroepen wordt. Als jij dat in een inherited method aanroept, en de variables staan in de inheriting class (of vice versa), zul je die niet zien.

Phenom II X4 945 \\ 8GB DDR3 \\ Crosshair IV Formula \\ R9 290


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
wboard schreef op dinsdag 21 juli 2009 @ 09:21:
-De visibility van de class members is PRIVATE, maar dat zou toch niet uit moeten maken als je een methode overerft??

-Die error reporting zal ik eens aanzetten, post het zo ff

-@rian: ja dat kan wel, vandaar ook dat het binnen de class zelf wel werkt
Gozer... post dan een werkend voorbeeld waarmee het fout gaat. Alsof we kunnen ruiken of je class members public/protected/private zijn :{w.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
HuHu schreef op dinsdag 21 juli 2009 @ 10:36:
[...]

Gozer... post dan een werkend voorbeeld waarmee het fout gaat. Alsof we kunnen ruiken of je class members public/protected/private zijn :{w.
Hoewel HuHu het hiet wat lomp brengt heeft HuHu wel een punt: als je voorbeeld in de TS niet overeen komt met de werkelijke situatie dan kun je niet van ons verwachten dat we zinnige uitspraken kunnen doen. Zorg dus (voortaan) voor code die overeenkomt (of zelfs een 1:1 copy/paste is) met het daadwerkelijke probleem.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Topicstarter
oeps, dit is wel erg lomp :), bedankt iig 8)7

A smooth sea never made a skilled sailor

Pagina: 1