Jump to content
php.lv forumi

Vērtības mantošana no parent klases


ray

Recommended Posts

Ir iespējams kaut ko šādu realizēt, lai strādātu?

class Main {
	 
	function setValue($classes = array()) {
		
		foreach($classes as $key => $value) $this->$key = $value;

	}
	 
}

class Modules extends Main {
	
	function showValue($key) {
		
		return $this->$key;
		
	}
	
}

$main = new Main;
$main->setValue(
	array(
		'adc'=>123,
		'def'=>456
	)
);

$modules = new Modules;
echo $modules->showValue('def');

Link to comment
Share on other sites

Tu setValues izsauc un viena objekta, bet showValues uz cita. Mantojās klases, nevis objekti.
$modules nekādi nevar zināt, ka $main ir tieši "parent" objekts, jo var būt daudz dažādi Main klases objekti.

Bet, ja vēlies kaut ko piesaistīt pie klases, tad jāizmanto statiski mainīgie. Lai gan es neko tamlīdzīgu nekad nerakstītu, šeit piemērs:

<?php
class Main {
        static $values = array();
	 
	function setValue($classes = array()) {
		
		foreach($classes as $key => $value) self::$values[$key] = $value;

	}
	 
}

class Modules extends Main {
	
	function showValue($key) {
		
		return self::$values[$key];
		
	}
	
}

$main = new Main;
$main->setValue(
	array(
		'adc'=>123,
		'def'=>456
	)
);

$modules = new Modules;
echo $modules->showValue('def');
Link to comment
Share on other sites

Šitā derēs?

class Main {
	protected static $vars;
	function setValue($classes = array()) {
		foreach($classes as $key => $value) self::$vars[$key] = $value;
	}
}

class Modules extends Main {
	function showValue($key) {
		return parent::$vars[$key];
	}
}

$main = new Main;
$main->setValue(
	array(
		'adc'=>123,
		'def'=>456
	)
);

$modules = new Modules;
echo $modules->showValue('def');
Link to comment
Share on other sites

Varbūt ir kāds "gudrāks" veids kā šo realizēt nemainot lietas būtību?

Tas ir vajadzīgs tāpēc, lai pirmajā klasē definētos mainītie ko varētu izmantot citās klasēs lieki nepārrakstot vienas un tās pašas rindas. Piemēram, tulkošanas, db utml parametrus.

Link to comment
Share on other sites

Pilnīgs offtopic, bet lūdzu šo:

 

        foreach($classes as $key => $value) self::$values[$key] = $value;

 

raksti kā:

 

 

        foreach($classes as $key => $value) {
                self::$values[$key] = $value;
        }

 

un tavi kolēģi tev teiks paldies, nevis būs gatavi tevi nosist.

Link to comment
Share on other sites

Tev vajag izmantot Dependancy Injection, piemēram šo: http://pimple.sensiolabs.org/

Izveido servisus priekš tulkošanas, priekš db, utt. un ieliec konteinerī un tālāk piekļūsti tiem no konteinera.

Šādā veidā tu varēsi arī nodrošināt vieglu testēšanu, jo testējot varēsi konteinerī atbilstošiem servisiem salikt mock servisus.

Link to comment
Share on other sites

Varbūt ir kāds "gudrāks" veids kā šo realizēt nemainot lietas būtību?

Tas ir vajadzīgs tāpēc, lai pirmajā klasē definētos mainītie ko varētu izmantot citās klasēs lieki nepārrakstot vienas un tās pašas rindas. Piemēram, tulkošanas, db utml parametrus.

Lietas būtība ir, ka tu to dari nepareizi;

<?php

class Tulkojumi{
/// bla
}

class Datubaze{
/// bla
}

class Whatever{
  private $tulkojumi;
  private $datubaze;

  function __construct(Tulkojumi $tulkojumi, Datubaze $datubaze)
  {
    $this->tulkojumi = $tulkojumi;
    $this->datubaze = $datubaze;
  }

  function blah(){
    $this->datubaze->betmens("SELECT Gotham FROM Watman");
  }
}

$tulkojumi = new Tulkojumi;
$db = new Datubaze;

$whatever = new Whatever($tulkojumi, $db);

$whatever->blah();

Un organizēt to var ar dependency injection. Piemēram, labs ir Orno/DI aļa thephpleague/container. Pimplis arī nav slikts, bet man tomēr nedaudz besī. 

Link to comment
Share on other sites

Un neviens pats nav funkcijām uzlicis access level... Nedz arī type hinting parametram, kuram obligāti jābūt masīvam:

public function setValue(array $classes = array())

Ko mels niekus? :> Man ir gan visibility, gan typehinti, un kā Kavacs teica, public ir public. Quo vadis, Juri :>

Link to comment
Share on other sites

I like to be explicit. Tas nenozīmē pārcensties, bet gan vienkārši censties rakstīt, lai nav jādomā.

 

@briedis - ja tu par jauno masīvu sintaksi, man tā nepatīk, var sabojāt koda lasāmību, ja apvieno array access ar array creation (piemēram, $arr[] = [] var uz brīdi samulsināt, un man tas nepatīk).

Edited by jurchiks
Link to comment
Share on other sites

I like to be explicit. Tas nenozīmē pārcensties, bet gan vienkārši censties rakstīt, lai nav jādomā.

 

@briedis - ja tu par jauno masīvu sintaksi, man tā nepatīk, var sabojāt koda lasāmību, ja apvieno array access ar array creation (piemēram, $arr[] = [] var uz brīdi samulsināt, un man tas nepatīk).

 

"var sabojāt koda lasāmību" :D

 

Protams, skaitīt iekavas ir daudz patīkamāk, ja tiek iejautkas funkcijas pa vidu ;)

 

$wow = stdClass::someshit(array('array' => array('array' => array(date('', strtotime('tomorrow')))))));

 

 

$arr[] = [] - Nu ja šāda rindiņa samulsina, nu tad nez......

Link to comment
Share on other sites

To each his own. OP postā bija array(), so fuck off.

Besides:

stdClass::someshit(array('array' => array('array' => array(date('', strtotime('tomorrow')))))));
->
stdClass::someshit(array(
    'array' => array(
        'array' => array(
            date('format?', strtotime('tomorrow'))
        )
    )
));
Atklājās, ka tev tur bija 1 par daudz aizverošās iekavas. GJ. Edited by jurchiks
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...