Includere clase si fisiere in mai multe fisiere php

Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
andras
Mesaje:430

Includere clase si fisiere in mai multe fisiere php

1. Cum procedez cind in mai multe fisiere php (care contin functii, nu clase) am nevoie de obiecte ale aceleiasi clase? In prezent instantiez aceeasi clasa in fiecare fisier php in care am nevoie de obiect, nu cred ca e bine.
2. Cum procedez cind am instructiunea include in cascada? (adica fac include(fisier) intr-un alt fisier, apoi acel fisier il includ in al treilea, s.a.m.d.). Uneori imi recunoaste fisierele alteori nu si vreau sa adopt o anumita regula. Multumesc

MarPlo Mesaje:4343
Salut
Din experienta mea asi face un director unde sunt fisierele cu clasele si alte functii de uz general.
Apoi, un fisier 'common.php' cu instructiuni necesare comune (date conectare, constante, includere clase) pe care il includ in celelalte fisiere php (nu in cele cu clase).
In acest fisier definesc o constanta BASE_ROOT in care e calea absoluta catre directorul Root al site-ului, si o folosesc ca Baza la includere de fisiere pornind de la Root.
Cam asa e "common.php":

Cod: Selectaţi tot

<?php
// start session (if isn't started)
if(!isset($_SESSION)) session_start();

// data to connect to MySQL database (MySQL server, user, password, database name)
$mysql['host'] ='localhost';
$mysql['user'] ='root';
$mysql['pass'] ='';
$mysql['bdname'] ='cms';

//Base Server-Site root path (ex.: /var/www/vhosts/domain.net/public_html)
define('BASE_ROOT', $_SERVER['DOCUMENT_ROOT']);
// other needed constants ..

//get the name of currently executing php file (without extension)
$parent_f = str_replace('.php', '', basename($_SERVER['SCRIPT_FILENAME']));

//include clases according to currently executing php file and create their objects
//files where to use pdo_mysqli class
if(in_array($parent_f, ['file1','other_file','other_php'])){
  include BASE_ROOT .'/dir_class/pdo_mysqli.php';
  $obsql = new pdo_mysqli($mysql);
}

//files where to use clas_2 class
if(in_array($parent_f, ['file1', 'php_file5'])){
  include BASE_ROOT .'/dir_class/clas_2.php';
  $ob2 = new clas_2;
}

//files where to use clas_3 class
if(in_array($parent_f, ['other_file','some_other_php'])){
  include BASE_ROOT .'/dir_class/clas_3.php';
  $ob3 = new clas_3;
} 
Iar in fisierele php unde folosesc clase sau include, pun asa (de exemplu in "file1.php"):

Cod: Selectaţi tot

<?php
include_once 'common.php';

//here i can use $obsql and $ob2 objects

//include another php
include BASE_ROOT .'/some_dir/abc.php';

//abc.php can contain other: include(BASE_ROOT .'/some_dir/xyz.php');
} 
Pentru includeri in cascada cu fisiere in locatii diferite, pate iti e de folos si fuctia getRootPath() din acest tutorial:
https://coursesweb.net/php-mysql/relativ ... anywhere_t

- Oricum, e bine sa intrebi si pe altii cum procedeaza, pe alte forumuri, mai cu experienta; poate cunosc o tehnica mai buna.

andras Mesaje:430
Am inceput sa fac asa si functioneaza, dar in fisierele apelate cu ajax nu mai recunoaste obiectele create in common.php desi am pus include(common.php). Este normal acest lucru?

MarPlo Mesaje:4343
Nu e normal, undeva in codul de pe server e vreo restrictie sau cale de includere incorecta.
Pune in "commonphp" acest cod si vezi ce apare in raspunsul la Ajax.

Cod: Selectaţi tot

echo basename($_SERVER['SCRIPT_FILENAME']); 
- La conditia if() de includere clasa in functie de fisierul apelat trebuie sa adaugi si fisierul apelat cu Ajax.

andras Mesaje:430
Asta era, ca nu era adaugat in clauza if(), am crezut ca e suficient sa adaug primul fisier apelat. Dar asa invata omul.
Multumesc, acum pot controla cele 2 aspecte (obiecte si include), sint foarte importante pentru cum vrei sa incepi si sa te organizezi.