[PHP] To global or not to global *

Pagina: 1
Acties:

Onderwerpen


  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Als ik tot nu toe informatie uit een array nodig had in mijn applicatie, riep ik gewoon de array zelf aan (als het binnen een functie is eerst globallen):

PHP:
1
2
3
4
5
6
$users[0]['name'] = 'Dirk';
$users[0]['pass'] = '1234';
$users[1]['name'] = 'Alex';
$users[0]['pass'] = 'abcd';

echo 'Hallo '.$users[0]['name'].'!';


Bij veel open source bouwsels kom ik een iets andere werkwijze tegen:
PHP:
1
2
3
4
5
6
7
8
function walk_users($key, $property)
{
  global $users;

  return $users[$key][$property];
}

echo 'Hallo '.walk_users(0, 'name').'!';


Ik kan me voorstellen dat wanneer je walk_users() in een loop gebruikt (walk_users($i, 'name') for $i = 0 to 100 ofzo), je een onnodige last op je processor legt. Kan iemand mij het nut van deze werkwijze uitleggen? Zelf kom ik niet verder dan dat je misschien minder hoeft te globallen.

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 02:21

Janoz

Moderator Devschuur®

!litemod

De last die het op de proccessor ligt is eigenlijk redelijk te verwaarlozen. Dit soort micro optimalisaties zijn zeker waneer je naar de voordelen van de tweede manier kijkt verwaarloosbaar.

Door je gegevens via de functie te omsluiten hoef je op andere plekken niet te weten hoe dat users datatype eigenlijk is opgebouwd. Je hebt simpele duidelijke functies om gegevens op te halen die duidelijk aangeven welke parameter wat voorsteld (key en propertie). Wijzig je nu om wat voor reden dan ook de manier waarop je users bijhoudt, dan hoef je dit alleen maar in die ene functie aan te passen en nergens anders.

Je tweede voorbeeld is nog niet helemaal optimaal. Het maakt nog steeds gebruik van een globale variabele. Nog beter zou het zijn waneer je dit geheel in 1 class opneemt. Alle bewerkingen zitten dan ook bij de data.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Janoz - dank je! Zou iemand een voorbeeld kunnen geven van hoe je dit voorbeeld in een class uitwerkt?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • B-Man
  • Registratie: Februari 2000
  • Niet online
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
29
30
31
32
33
34
35
36
37
38
39
40
41
class User 
{
  private $name;
  private $pass;

  public function __construct($name, $pass)
  {
    $this->name = $name;
    $this->pass = $pass;
  }

  // .. dtor, whatever

  public function getName()
  {
    return $this->name;
  }

  public function getPass()
  {
    return $this->pass;
  }
}

// encapsulatie van users, die bijvoorbeeld uit een db komen
class UserDAL
{
  public static User getUserById($id)
  {
    // vraag data op uit (bijvoorbeeld) een database
    $name = 'val uit db';
    $pass = 'val uit db';

    $user = new User($name, $pass);
    return $user;
  }
}

// Nu kun je zeggen:
$user = UserDAL::getUserById(0);
echo 'User 0 heeft als naam "'.$user->getName().'" en als wachtwoord "'.$user->getPass().'"<br>';