Beste mensen,

ik zit met een vervelend bizar probleem dat ik al werkend heb gezien bij iemand anders zijn code.

ik heb een main controller die de view init

<?php
class TESS_controller{

public function __construct()
{
$this->view = new TESS_view();
}

public function load($model)
{
require 'application/models/' . $model . '.php';
$this->model = new $model;
}
}
?>

ik heb andere child constructors! De view word prima geinjecteerd door parent::__construct

<?php
class Index extends TESS_controller{

public function __construct()
{
parent::__construct();

$this->view->load('index/index');
}

public function anthony()
{

}
}
?>

Wat is nu het probleem ik kan geen variable aanmaken in childs voor de view

<?php $this->view->naam = 'weetikwie'; ?>

werkt niet. ik krijg steeds undefined variable op de error.
maar als ik dit doe in de main controller lukt dat wel???

waarom kunnen de childs dit niet als parrent construct word? hoe kan ik dit het beste oplossen?
Anthony de meulemeester op 18/06/2013 10:04:22

in de main controller kan ik dus vars on the fly maken

Om te beginnen moet je dat helemaal niet doen 'vars on the fly' aanmaken. Niet alleen een slechte gewoonte, ook is het dan helemaal niet mogelijk om buiten het object die variabelen nog aan te roepen. Nogmaals, omdat ze dan private worden.
Anthony de meulemeester op 18/06/2013 10:48:16

ik begrijp het echt niet. ik zie mensen dit doen.

Dat lijkt me dus klinklare onzin, dat kan namelijk helemaal niet. Alleen BINNEN een object, hoewel het dan nog steeds een slechte gewoonte blijft.

index model

<?php


class index_model{

public function __construct()
{
print 'here is the index_model <br>';
}

public function test()
{
return 'ik ben een vis';
}
}
?>

index controller

<?php

class Index extends TESS_controller{

public function __construct()
{
parent::__construct();

}

public function index()
{
$this->view->load('index/index');
$this->view->naam = $this->model->test();
}


}
?>

main controller

<?php
class TESS_controller{

public function __construct()
{
$this->view = new TESS_view();
}

public function load($model)
{

require 'application/models/' . $model . '.php';
$this->model = new $model;

}

}
?>

en de client side index
<?php
<div class="container margintop">
<div class="modal-header">
<h3>Tess php framework</h3>
</div>

<?php print $this->naam ?>
</div>
?>



[size=xsmall]Toevoeging op 18/06/2013 11:28:40:[/size]

error = Notice: Undefined property: TESS_view::$naam in C:\xampp\htdocs\tess-framework\application\views\index\index.php on line 6
@Erwin: wat bedoel je met dat variabelen private worden? Variabelen worden toch niet vanzelf private?

[size=xsmall]Toevoeging op 18/06/2013 11:40:43:[/size]

Je hebt je model niet gedeclareerd terwijl je die wel aanspreekt: $this->model->test();

Daarnaast moet je ook je prooperties in je classes declareren.

woops...
<?php
class Test{
public function __construct(){
$this->naam = 'ikke';
}
}

$test = new Test();
echo $test->naam;
?>
Levert dus inderdaad wel 'ikke' op. Dat stuk van de private mag je dus vergeten inderdaad :-)
Neemt niet weg dat het 'on the fly' aanmaken van allerlei variabelen in een class een slecht gewoonte is.... Je object krijgt er namelijk allerlei onvoorziene gegevens bij die het verder niet zal managen, immers, het object zelf weet niet eens dat het er is. Voor jezelf is het ook zeer ongewis welke variabelen er op welk moment allemaal bestaan en debuggen wordt dan ook een ramp.
Wouter J op 18/06/2013 11:46:16

wat bedoel je met dat variabelen private worden? Variabelen worden toch niet vanzelf private?
- See more at: http://www.phphulp.nl/php/forum/topic/bizar-probleem-parentconstruct/91205/last/#sthash.6X6C8u7O.dpuf

ik dacht ook dat ze standaard public worden. Werden ze maar private...

Ja, dat zou wel gaaf zijn :-)

[offtopic]
Sinds wanneer is dat fijne (ahum) "See more at: ..." regeltje weer terug? Irritant...
[/offtopic]



[size=xsmall]Toevoeging op 18/06/2013 11:50:57:[/size]

Erwin H op 18/06/2013 11:49:12

woops...

inderdaad, hehehe ;-)

maar hoe kan dit nu?

kijk nu inject ik view in elke controller

ik krijg nu op men scherm

Notice: Undefined property: TESS_view::$naam in C:\xampp\htdocs\tess-framework\application\views\index\index.php on line 6 -

<?php
class Index extends TESS_controller{

public function __construct()
{

$this->view = new TESS_view();
//$this->view->naam = 'ikke';
}

public function index()
{
$this->view->load('index/index');
$this->view->naam = 'anthony';

}
}
?>

steek ik het in de constructer krijg ik 'ikke ' op men scherm.

in de constructor werkt het. was da nu weer alemaal;
<?php
class Index extends TESS_controller{

public function __construct()
{

$this->view = new TESS_view();
$this->view->naam = 'ikke';
}

public function index()
{
$this->view->load('index/index');
//$this->view->naam = 'anthony';


}
}
?>

[size=xsmall]Toevoeging op 18/06/2013 11:57:43:[/size]

ik kan dus enkel in de constructor $this->view aanpassen.

raar
Draai de regels eens om:

NIET:

$this->view->load('index/index');
$this->view->naam = 'anthony';

MAAR:

$this->view->naam = 'anthony';
$this->view->load('index/index');
Dat is helemaal niet raar, je kan alleen in een constructor variabelen van een object aanmaken.
Blijkbaar bestaat de variabele naam niet in het view object.
Maar let op wat je nu aan het doen bent, want dit kan dus wel!:
<?php
public function index() {
$this->view = 'Anthony';
}
?>
Met alle gevolgen van dien.
Ger van Steenderen op 18/06/2013 12:52:08

Dat is helemaal niet raar, je kan alleen in een constructor variabelen van een object aanmaken.

Huh? Wat bedoel jij nu?

Reageren