Fonctions personnelles en php en dehors des class

Bonjour,
La méthode que je vais décrire et que j’utilise avec succès depuis plusieurs mois n’est certainement pas la meilleure au yeux des programmeurs que vous êtes et que je ne suis pas …
Pour utiliser mes fonctions php, je n’ai pas créé d’object de class, de méthodes ou autre, j’au juste créé un fichier php classique, que j’inclus au début de mon code …

En pratique :
J’ai créé un répertoire à mon nom (#fnc_perso) dans le répertoire « plugins » (parce que je ne savais pas ou d’autre).
et j’ai créé un fichier de fonction (ex : fnc_perso_com.inc.php) dans lequel je mets toutes mes fonction de communication … par exemple :

function tts_sonos ($msg, $place = 'SAM', $urg = 0){ 
  // variables locales
  $vol_urg_1 = '55'; // Volumes prédéfinit selon les urgences
  $vol_urg_2 = '100';
  $id_tts = [  // Sonos Dire et Volume
		'SAM' => ['dire'=>'1917', 'vol'=>'1907', 'statusvol'=>'1906'],  
		'Chambre' => ['dire'=>'3868', 'vol'=>'3858', 'statusvol'=>'3857'],
		'Cuisine' => ['dire'=>'2587', 'vol'=>'2577', 'statusvol'=>'2576'],
		'Veranda' => ['dire'=>'2612', 'vol'=>'2602', 'statusvol'=>'2601'],
		'Bureau' => ['dire'=>'4431', 'vol'=>'4421', 'statusvol'=>'4420'],
		'SDB' => ['dire'=>'4113', 'vol'=>'4103', 'statusvol'=>'4102'],
		'Salon' => ['dire'=>'2739', 'vol'=>'2729', 'statusvol'=>'2728'],
  ];
  // Si argument de lieux faux
  if (!isset($id_tts[$place])){
    $place = 'SAM';
    $msg = "Erreur d'argument dans la fonction. ".$msg;
  };
  // On calcule le volume
  $volume = 0;
  $actual_time = date('Hi');
  if ($actual_time > 730 and $actual_time < 2100){
    $volume = 55;
  }elseif (($actual_time > 700 and $actual_time < 730) or ($actual_time > 2300 and $actual_time < 2359)){
    $volume = 25;
  }elseif ($actual_time > 2100 and $actual_time < 2200){
    $volume = 45;
  }elseif ($actual_time > 2200 and $actual_time < 2300){
    $volume = 35;
  };
  if ($urg == '1'){$volume = $vol_urg_1;};
  if ($urg == '2'){$volume = $vol_urg_2;};
	// récupère volume actuel
	$cmd = cmd::byId($id_tts[$place]['statusvol']);
  $actual_volume = $cmd->execCmd();
	// fixe le volume
	$cmd=cmd::byId($id_tts[$place]['vol']);
  $cmd->execCmd($options=array('slider'=>$volume), $cache=0);
  sleep(2);
	// Lance le message
	$cmd=cmd::byId($id_tts[$place]['dire']);
  $cmd->execCmd($options=array('title'=>'Alerte Jeedom', 'message'=> $msg), $cache=0);
  sleep(5);
	// restaure le volume
	$cmd=cmd::byId($id_tts[$place]['vol']);
	$cmd->execCmd($options=array('slider'=>$actual_volume), $cache=0);
}
  
//*********************************************************************************
  
function send_mail ($msg, $who = 'Manu'){ 
  // Variables ID des emails
  $id_mail = [
    'Manu' => '77',   
    'Chrys' => '78',   
    'Sophie' => '649',   
  ];
  if (!isset($id_mail[$who])){$who = 'Manu';};
  // Envoie du message
  $cmd=cmd::byID($id_mail[$who]);
  $cmd->execCmd($options=array('title'=>'Jeedom', 'message'=> $msg), $cache=0);
}
  
//*********************************************************************************
  
function send_telegram ($msg, $who = 'Manu'){ 
  // Variables ID de Telegram
  $id_telegram = [
    'Manu' => '2904',
    'Chrys' => '2905',
    'Sophie' => '4986',
  ];
  if (!isset($id_telegram[$who])){$who = 'Manu';};
  // Envoie du message
  $cmd=cmd::byID($id_telegram[$who]);
  $cmd->execCmd($options=array('title'=>'Jeedom', 'message'=> $msg), $cache=0);
}

Ensuite dans mes scénarios, je débute par

include ‹ /var/www/html/plugins/#fnc_perso/fnc_perso_com.inc.php ›;

et dans le code il me suffit d’appeler mes fonction directement sans devoir passer par test::test->(), mais directement comme ca :

tts_sonos ($msg);

ou

send_mail ($msg);

In fine, j’ai créé plusieurs fichiers selon les routines dont j’ai besoin en les regroupant par thème :
fnc_perso_date_time.inc.php
fnc_perso_string.inc.php
etc

a inclure selon les besoins … ou passer par un fichier global qui inclus tout (fnc_perso_all.inc.php) :

include '/var/www/html/plugins/#fnc_perso/fnc_perso_com.inc.php';
include '/var/www/html/plugins/#fnc_perso/fnc_perso_date_time.inc.php';
include '/var/www/html/plugins/#fnc_perso/fnc_perso_string.inc.php';

Je sais que ce n’est pas optimal … mais pour ma petite programmation et mon utilisation perso, je trouve ca utile …

Ca peut peut être être utile à d’autres …

Manu

1 « J'aime »

As-tu vu cela?

Oui, très utile, mais le passage pour les fonctions perso par une classe utilisateur me paraissait plus compliquée et je voulais pouvoir appeler mes fonctions directement.
Initialement elles étaient directement dans le code, mais pour ne pas devoir modifier tous les codes en cas de modification d’une fonction je les ai décentralisées, en les laissant en php brut et non en php POO …

je préfère
$a= jour_ferier();

que quelque chose comme
$a=userFunction::jourFerier();
$a->getStatus();

Salut,

J’avoues que je ne comprends pas non plus pourquoi le fichier user.function.class.php ne serait pas utile alors qu’il est expressément prévu pour ajouter des fonctions perso à jeedom.

Tu as aussi le framework de @dJuL qui permet de simplifier encore si besoin:

Bonjour, Y a t’il un moyen d’écrire sa propre class (et pas une fonction) et l’inclure dans un bloc code d’un scenario.
exemple :

require_once dirname(FILE) . ‹ /…/…/data/php/myclass.php ›