Des class lié entre elle.

Eléphanteau du PHP | 26 Messages

07 nov. 2013, 19:41

Bonjours, j'ai une petite question.
J'ai une class que j'ai appelé header ou je mets les fonctions importantes et j'ai d'autre class lié a cette class header(extends).
En gros c'est une sorte d'ensemble de fichier de code près a l'emploi pour faire plein de chose comme gérer les dates, les fichiers, la pagination, pour crypté...
Je défini une variable: $this->path_root_local et $this->path_root_web dans ma class header et j'aimerais pouvoir l'utiliser dans ma class date.
Comment je peux faire ça ? Je pensais que la classe secondaire étant lié a la principal pouvait récupérer ces variables...

Mammouth du PHP | 571 Messages

07 nov. 2013, 20:01

il te faut créer un objet à partir de la classe header. A partir de cet objet , tu peux invoquer une méthode ou un attribut(à condition que de ce dernier ait pour modificateur public) de la classe header. invoquer l'attribut(dans ton cas) d'une classe, à l’extérieur de celle çi, est tout à fait déconseillé mais cela reste possible.

Eléphanteau du PHP | 26 Messages

07 nov. 2013, 20:05

Les deux class sont lier entre elle, je peux donc logiquement utilisé mes variables dans mon autre class simplement comme si c'était une seule et unique class suivant comment elles sont protégé ?
Je débute un peut avec les class...

Mammouth du PHP | 571 Messages

07 nov. 2013, 20:30

Les deux class sont lier entre elle, je peux donc logiquement utilisé mes variables dans mon autre class simplement comme si c'était une seule et unique class suivant comment elles sont protégé ?
Je débute un peut avec les class...
le seuls cas où l'on peut, dans une classe A, utilisé directement les attributs ou les méthodes d'une autre classe B c'est quand il y a héritage.Dans tous les autres cas il faut passer par l'instanciation (sauf cas des méthodes ou variables static).

Eléphanteau du PHP | 26 Messages

07 nov. 2013, 20:43

Ce que je comprends pas, c'est que la ça a l'air de marché dans cet exemple:
<?php
class header
{

    function header()
    {
        $this->path_root_local = '/var/www/admins/dev/documents/class/';
    }
}
	
// ---------- ----------

class date_extends extends header
{

    function test()
	{
	return $this->path_root_local;
	}
	
}

$date_extends = new date_extends();
echo $date_extends->test();
?>
Mais dans mon code, j'ai cette erreur: Fatal error: Using $this when not in object context in /var/www/admins/dev/documents/class/class_menu_extends.php on line 10

ViPHP
xTG
ViPHP | 7331 Messages

07 nov. 2013, 21:13

Tu utilises $this alors que tu n'es pas dans un objet instancié.
Montres nous ton code.

ViPHP
AB
ViPHP | 5818 Messages

07 nov. 2013, 21:47

Ton code doit donc être construit différemment de cet exemple...

Eléphanteau du PHP | 26 Messages

07 nov. 2013, 22:19

J'ai trouvé, j'avais déclaré ma fonction comme ça: public static function et en enlevant le mot static plus aucun problème.
Je débute un peut avec cette facon de codé, ça sert a quoi de mettre la fonction en static ?

ViPHP
xTG
ViPHP | 7331 Messages

07 nov. 2013, 22:27

Cela défini une fonction de class et non d'instance.
Une fonction de class est accessible même sans instance, mais surtout elle est partagée entre toutes les instances.
C'est déjà plus flagrant avec une variable, car si une instance la modifie alors sa nouvelle valeur est accessible par toutes les instances de la class.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

07 nov. 2013, 22:32

sans parler du fait que la poo à la php4 style c'est pas top

il faut appeler le constructeur du parent implicitement => http://www.php.net/manual/fr/language.oop5.decon.php :mrgreen:

tu as aussi "oublié" de créer la propriété path_root_local dans la classe mère


on parle de méthode et pas de fonction ;)


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 26 Messages

07 nov. 2013, 22:42

sans parler du fait que la poo à la php4 style c'est pas top

il faut appeler le constructeur du parent implicitement => http://www.php.net/manual/fr/language.oop5.decon.php :mrgreen:

tu as aussi "oublié" de créer la propriété path_root_local dans la classe mère


on parle de méthode et pas de fonction ;)


@+
Tu peux être plus clair ? Je suis pas sur d'avoir comprit.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

07 nov. 2013, 23:01

en php4 une méthode avec le même nom que la classe est considéré comme constructeur.

donc la méthode header() est le constructeur de la classe header.

Cette façon de faire n'est plus à prendre en compte depuis php5 (plus de 10 ans ;) ).

par exemple ton code devient
<?php
class header {

	protected $path_root_local;

	function __construct() {
		$this->path_root_local = '/var/www/admins/dev/documents/class/';
	}
}

class date_extends extends header {

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

	function test() {
		return $this->path_root_local;
	}

}

$date_extends = new date_extends();
echo $date_extends->test();
@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 26 Messages

10 nov. 2013, 16:24

Donc depuis 10ans on doit utilisé ta technique ? Par que ce moi j'ai fait comme dans les tuto^^.

Est ce que je peux utilisé des variables d'une autre class: si par exemple j'ai une class 1 et une class 1.1 et 1.2 extends de 1.
Une variable de la class 1.1 pourra être utilisé dans la class 1.2 ? Ou ça sera seulement de la 1 vers 1.1 et 1.2 ?

-----

Sinon, j'aimerais savoir si la génération de CSS dynamique est une bonne idée ? En gros je passe en paramètre des variables qui modifie mon fichier php qui contient le css qui grace a l'URL Rewrite est renommé en css^^, ce qui donne:
<!-- CSS personnalisé -->
<!-- Le CSS `erreur` est inconnue -->
<link rel="stylesheet" href="http://domaine.fr/admins/dev/documents/class/css/style_pagination.css?aleatoire=haut&fontsize=15&unit=px" type="text/css" media="screen"/>
<link rel="stylesheet" href="http://domaine.fr/admins/dev/documents/class/css/style_pagination.css?aleatoire=milieux&fontsize=30&unit=px" type="text/css" media="screen"/>
<link rel="stylesheet" href="http://domaine.fr/admins/dev/documents/class/css/style_pagination.css?aleatoire=bas&fontsize=50&unit=px" type="text/css" media="screen"/>
<link rel="stylesheet" href="http://domaine.fr/admins/dev/documents/class/css/style_progressbar.css?width=250&height=20&unitwidth=px&unitheight=px" type="text/css" media="screen"/>
<!-- Fin CSS personnalisé -->
Le but était d'avoir un fichier css unique que je peut modifier dynamiquement pour être réutilisé sur la même page simplement.

ViPHP
xTG
ViPHP | 7331 Messages

10 nov. 2013, 17:22

Donc depuis 10ans on doit utilisé ta technique ? Par que ce moi j'ai fait comme dans les tuto^^.
Bah ce sont des tutoriaux qui datent d'il y a dix ans. :)
Ou bien leur rédacteur a du souci à se faire...
Est ce que je peux utilisé des variables d'une autre class: si par exemple j'ai une class 1 et une class 1.1 et 1.2 extends de 1.
Une variable de la class 1.1 pourra être utilisé dans la class 1.2 ? Ou ça sera seulement de la 1 vers 1.1 et 1.2 ?
Non ce sont deux instances de l'objet différentes. Seule une instance de class fille a accès aux composants de sa class mère.
Sinon, j'aimerais savoir si la génération de CSS dynamique est une bonne idée ? En gros je passe en paramètre des variables qui modifie mon fichier php qui contient le css qui grace a l'URL Rewrite est renommé en css^^, ce qui donne:
<!-- CSS personnalisé -->
<!-- Le CSS `erreur` est inconnue -->
<link rel="stylesheet" href="http://domaine.fr/admins/dev/documents/class/css/style_pagination.css?aleatoire=haut&fontsize=15&unit=px" type="text/css" media="screen"/>
<link rel="stylesheet" href="http://domaine.fr/admins/dev/documents/class/css/style_pagination.css?aleatoire=milieux&fontsize=30&unit=px" type="text/css" media="screen"/>
<link rel="stylesheet" href="http://domaine.fr/admins/dev/documents/class/css/style_pagination.css?aleatoire=bas&fontsize=50&unit=px" type="text/css" media="screen"/>
<link rel="stylesheet" href="http://domaine.fr/admins/dev/documents/class/css/style_progressbar.css?width=250&height=20&unitwidth=px&unitheight=px" type="text/css" media="screen"/>
<!-- Fin CSS personnalisé -->
Le but était d'avoir un fichier css unique que je peut modifier dynamiquement pour être réutilisé sur la même page simplement.
Cela ne pose aucun souci, leur résultat sera mis en cache comme un fichier css statique.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

11 nov. 2013, 14:01

pour ce qui est du modèle objet je te conseil de trouver un tuto sur la poo php5 (qui utilise quelque chose de plus classique, certain dirais " qui se rapproche d'un vrai modèle objet").
tu y trouveras des infos sur la portée des propriétés / méthodes (public, private, protected) et pourquoi et comment utiliser cette porté.

le modèle php 4 est toujours utilisable mais ne respecte pas trop le modèle objet et du coup peu mettre le brin dans ton code si tu n'y prête pas attention :mrgreen:


@+
Il en faut peu pour être heureux ......