Class werkt niet
Het werkt jaren.
Je zet het over en het werkt niet meer.
Alles geprobeerd maar niks.
Ik geef de essentie:
Code (php)
Output is:
test:
Ik verwacht:
test: Dit is een test
Je moet $this->test wel returnen ;)
Dan probeer het eens op regel 4 met
function __construct()
Toevoeging op 14/03/2022 15:42:16:
na php 5.6 verviel de mogelijkheid om een functie te hebben die dezelfde naam had als de class en die dan als magische construct te gebruiken.
(mogelijk zelfs al bij PHP 5.3)
In elk geval was jouw methode een PHP4 optie.
We hebben het over het jaar 2004 dan __construct geïntroduceerd werd. (ik kan het me nog vaag herinneren)
Gewijzigd op 14/03/2022 15:43:09 door Ivo P
- Ariën - op 14/03/2022 15:33:46:
Je moet $this->test wel returnen ;)
Niet echt toch?
Dit script draaide tot een week geleden bij Mijndomein.
Ik heb daar de boel opgezegd en een nieuw account aangemaakt waar ik het script naartoe heb gekopieerd.
Plots werkt het niet meer.
Returnen hoeft niet in een class en die functie mag gewoon site heten.
Nou ja misschien niet want het is versie 8 die nu draait.
Nee, ik denk dat Ariën zich vergiste. Omdat het een class property is, hoeft er niks gereturned te worden.
>> Plots werkt het niet meer.
Je moet construct gebruiken zoals Ivo P aangaf.
Code (php)
En ook even netjes de property declareren :-)
wees er op voorbereid dat er meer niet werkt.
Ik denk aan mysqlfuncties, regex functies, warnings bij het voeren van een functie als parameter die "by reference" bedoeld was (sowieso een vieze manier van werken) en hier en daar ander gedrag van een functie.
Er bestaat helemaal geen variabele $test.
Maar bedankt het werkt.
En die gebruik je op regel 8: $this->test = iets.
wel zo netjes om die dan vooraf aan te melden.
Het is een eigenschap. Dat is waar.
In de originele class zitten wel honderd properties er zijn nog meer classes.
Lijkt mij toch niet dat ik alle properties één voor één public zou moeten moeten maken.
Maar als je hem niet als private of protected definieert, zal hij public zijn.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
$test = new test();
echo $test->test;
$test->watanders = 123;
// en nu bevat je object ook ineens een property $watanders;
$test->test = 'mijn waarde';
// en nu is van buiten af de prop $test overschreven. Wil je dat wel laten gebeuren?
?>
$test = new test();
echo $test->test;
$test->watanders = 123;
// en nu bevat je object ook ineens een property $watanders;
$test->test = 'mijn waarde';
// en nu is van buiten af de prop $test overschreven. Wil je dat wel laten gebeuren?
?>
Ozzie PHP op 14/03/2022 17:03:03:
>> Niet echt toch?
Nee, ik denk dat Ariën zich vergiste. Omdat het een class property is, hoeft er niks gereturned te worden.
Nee, ik denk dat Ariën zich vergiste. Omdat het een class property is, hoeft er niks gereturned te worden.
Klopt, ik was ook even vergeten dat een method met de zelfde naam als de class nu als een aparte method gezien wordt, en niet direct geladne wordt, wat een construct wel doet. Zorg tevens altijd voor goede naamgeving met get's en set's.
Lijkt mij toch niet dat ik alle properties één voor één public zou moeten moeten maken.
Je hebt geluk dat PHP (nog steeds) erg flexibel is. Als je geen property declareert dan maakt PHP er "on the fly" een public property van.
Maar een goede gewoonte is om je class variabelen netjes te declareren en eventueel te initialiseren.
Code (php)
1
2
3
4
5
2
3
4
5
class Test {
public $a; // declaratie
public $b = 0; // declaratie en initialisatie
}
public $a; // declaratie
public $b = 0; // declaratie en initialisatie
}
Of:
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
class Test {
public $a; // declaratie
public $b; // declaratie
public function __construct()
{
$this->b = 0; // initialisatie
}
}
public $a; // declaratie
public $b; // declaratie
public function __construct()
{
$this->b = 0; // initialisatie
}
}
Toevoeging op 14/03/2022 18:56:54:
Als een class meer dan enkele tientallen variabelen heeft dan klinkt mij het in de oren als dat je class veel te veel verantwoordelijkheden heeft die je eigenlijk zou moeten uitsplitsen over meerdere classes...
Gewijzigd op 14/03/2022 18:54:29 door Frank Nietbelangrijk
Code (php)
Frank Nietbelangrijk op 14/03/2022 18:54:01:
> In de originele class zitten wel honderd properties er zijn nog meer classes.
Lijkt mij toch niet dat ik alle properties één voor één public zou moeten moeten maken.
Lijkt mij toch niet dat ik alle properties één voor één public zou moeten moeten maken.
Dat PHP 'automatisch' de waarden aanmaakt lijkt handig, maar je debugged je helemaal suf als je ergens per ongeluk een tikfoutje hebt gemaakt.
Daarom hebben veel mensen een basisklasse van waarop elke andere klasse extend:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
abstract class basis {
protected function fout($k) {
trigger_error('Eigenschap "' . $k . '" van object "'
. get_class($this) . '" bestaat niet of is niet publiek.');
}
function __get(string $k) {$this->fout($k);}
function __set(string $k, $v) {$this->fout($k);}
}
class site extends basis [...]
?>
abstract class basis {
protected function fout($k) {
trigger_error('Eigenschap "' . $k . '" van object "'
. get_class($this) . '" bestaat niet of is niet publiek.');
}
function __get(string $k) {$this->fout($k);}
function __set(string $k, $v) {$this->fout($k);}
}
class site extends basis [...]
?>
Eens. Dit is typisch PHP. Eigenlijk eigenaardig dat dit in versie 8 nog steeds niet op zijn minst een notice oplevert.