PHP globals accesibile in functii (creare variabile superglobale in php)

Neata,

Stie cineva vre-o modalitate de a avea variabilele mostenite de… orice este in structura respeciva (gen o functie mosteneste variabilele globale (si le poate modifica), o metoda mosteneste variabilele clasei si variabilele mostenite de clasa and so on si variabilele globale)? Daca da, va rog sa ma ghidati. Oh, cu o mentiune: fara pluginuri pentru php (a no-go) si preferabil fara a edita php.ini, dar daca nu este alta modalitate este ok si a edita php.ini.

Va multumesc pentru timpul acordat!

Edit: Fara a folosi global $var si $GLOBALS[“var”].

Nu înțeleg exact ce vrei, dar dacă te referi la variabilele globale atunci poți folosi ceva de genul oriunde în cod:

<?php
class MyClass {
    function concatenate() {
        global $var1, $var2;
        echo $var1 . $var2;
    }
?>

Detalii aici.

Ma refer la situatia din C/C++, unde intr-o functie poti folosi orice variabila mostenita fara a le apela (prin acel global). Deci sa le pot apela si edita fara a trebui sa folosesc global $varX, $varY;

… ci daca am $x in $GLOBALS, sa pot folosi $x in orice functie si clasa din interiorul respectivului fisier.

#include <iostream>
using namespace std;
 
// Global variable declaration:
int g;
 
int main ()
{
  // Local variable declaration:
  int a, b;
 
  // actual initialization
  a = 10;
  b = 20;
  g = a + b; /* g := 30 */
 
  cout << g; /* prints 30 */
 
  return 0;
}

(post withdrawn by author, will be automatically deleted in 24 hours unless flagged)

Did I really need to provide an example?

Am mentionat asta in comentariile precedente… idea este ca eu vreau urmatoarea chestie sa functioneze:

<?
   $x="Ada"; /* Ana e inca la cumparaturi... */
   function y($k){
      return $k." are";
   }
   class z{
   private $q=["castraveti", "oale", "sarmale"];
   private returner="";
   public gimme(){
      $k=for($i=0;$<count($q);$i++)
          $returner.=y($x).$q[$i]."<br/>";
      return $returner;
   }
   $works=new z;
   $works->gimme();

Fara global $x; si fara $GLOBALS[“x”];

Ai putea folosi un singleton cu un getter si un setter.

În singleton faci o variabilă privată ce va fi array iar fiecare get/set va prelucra doar o anumită cheie a acelui array.

Dar sunt curios de motivul pentru care nu vrei să folosești globale (mai ales în acest context)

1 Like

O provocare… discutam cu cineva despre unele avantaje si dezavantaje ale limbajelor de programare, care constituie probleme la trecerea de la un limbaj la altul si m-a provocat sa gasesc o modalitate de a mosteni automat variabilele globale.

TL;DR: O provocare…

Edit: nu am inteles raspunsul… inca n-am terminat facultatea…

Uite cam așa:

<?php

class FauxGlobals
{
	private static $globalVariable = array();

	public static function get($key)
	{
		return isset(self::$globalVariable[$key]) ? self::$globalVariable[$key] : null;
	}

	public static function set($key, $value)
	{
		self::$globalVariable[$key] = $value;
	}
}

Apoi, unde ai nevoie, folosești așa: FauxGlobals::get('g') sau setezi cu FauxGlobals::set('g', 10).

Ăsta este mai mult un proof of concept.

Între timp, ia uite-te la tutorialul lui @patkoscsaba, că am impresia că fix repository se numește povestea asta :smile:

2 Likes

Scapi de $GLOBALS si dai de folosirea unei metode… lafe puteam sa fac si eu o functie getGlobal($name) (return $GLOBALS[$name];} si setGlobal($name,$value){$GLOBALS[$name]=$value;) si terminam… dar tot acolo ajungeam.

Ma refeream daca este vre-o modalitate de a face mostenirea fara a ma incurca cu alte clase sau functii. Gen scriu niste cod sau modific php.ini si globalele sunt accesibile din interiorilor functiilor si metodelor, fara cod suplimentar (odata ce am rezolvat problema).

(parca) si in C++ trebuia sa declari variabila aia “extern” ca sa o poti folosi in diferite clase.

o alta varianta ar fi asa:

class z{
      protected $x;
      
      public function __construct($x)
      {
         $this->x = $x;
      }
     ...
}

$works=new z($x);
   echo $works->gimme();

Dacă afli vreo soluție să ne spui și nouă…

<?
   $x="Este";
   function y(){
      return $x." pro";
   }
   class z{
      function q(){
         return $x." contra";
      }
   }
   w=new z;
   echo y() . w->q();

Ok, cred ca am gresit eu exemplu… iar in cazul de mai sus (same post), ar fi eroare si la y() si la w->q(), deoarece acelasi $x este global si nu este mostenit …

[quote=“iamntz, post:11, topic:2087”]
Dacă afli vreo soluție să ne spui și nouă…
[/quote]Roger that!

Edit: finally done editing…

Schimbi
public gimme(){
cu
public gimme(){ GLOBAL $q;

@iamntz Am impresia ca se numeste Registry, repository-ul lui @patkoscsaba inclina mai mult spre layerul de peristenta.

1 Like

OK, cred că trebuie să înțelegi puțin diferența de abordare dintre cele două limbaje.

C++ e strong typed. Variabilele trebuiesc declarate înainte de folosire. Când folosești o variabilă într-o funcție/metodă, compilatorul caută prima oară dacă variabila e declarată local, dacă da - o să folosească variabila locală. Dacă variabila nu e declarată local, atunci o să folosească variabila globală cu același nume (dacă există).

PHP e dynamic. Variabilele nu trebuies declarate înainte de folosire și sunt create automat atunci când le atribui o valoare. Nefiind declarate explicit, e imposibil de ghicit din ce scop trebuie să vină variabilă folosită într-o funcție. Cea mai ok opțiune a fost să se considere toate variabilele locale atâta timp cât nu sunt declarate explicit ca fiind globale. Cealaltă opțiune ar fi fost să declari explicit ce vrei să foloști doar local - evident că în cazul ăsta aveam mult mai mult cod de scris și era mult mai enervant.

Comportamenul care-l vrei tu îl au doar variabilele superglobals în PHP. Aceste variabile au scop global fără să fie declarate explicit cu global. Din păcate aceste variabile sunt definite de limbaj, de exemplu $_GET, $_POST, $_SESSION, $GLOBALS

Ca să folosești o variabilă $x ca și variabilă globală ca în C++ (fără să folosești keyword-ul global) nu văd altă variantă decât cea de a folosi varianta $GLOBALS['x'] peste tot în cod.

Personal urăsc când văd $GLOBALS și consider de 'nșpe mii de ori mai elegant folosirea global $x.

O altă idee mai simplă din punctul meu de vedere ar fi:

<?php

class Container {
  public static $x = '';
}

function schimba() {
  Container::$x = 'Test';
}

function afiseaza() {
  echo Container::$x;
}

schimba();
afiseaza();

Nu vreau să pornesc un flame war, dar nu înțeleg de ce te deranjează așa mult global $x, mai ales dacă vii dintr-un limbaj unde toate variabilele trebuie declarate explicit.

5 Likes

Exact despre asta era provocarea!

Spot on. Challenge failed.

Nu ma deranjeaza, dar am primit provocarea (nu in aceleasi cuvinte) de a putea defini superglobals, in php…

1 Like
1 Like

[quote=“noah, post:16, topic:2087, full:true”]
http://stackoverflow.com/a/13614096/3907274
[/quote]Tocmai ce-am vazut si eu asta si copiam linkul, cand mi-a aparut popupul ca ai raspuns… (you beat me to it)
http://stackoverflow.com/questions/834491/create-superglobal-variables-in-php/13614096#13614096
Multumesc tuturor celor care au postat!

[quote=“User rink.attendant.6 - Stack Overflow said”]Not enough Rep to comment yet, so if someone wants to post this as a comment to James C that’d be great. Just wanted to clarify, from the php manual:

If the deprecated register_globals directive is set to on then $_POST[‘foo’] would also exist as $foo
Note the deprecated, but also note the legitimacy of the answer.[/quote]


TL;DR: $_POST[‘foo’] poate fi accesat ca $foo. DEPRECATED but valid.

Doar că ia uite ce zice aici:

Această facilitate a fost ÎNVECHITĂ începând cu PHP 5.3.0 și ELIMINATĂ începând cu PHP 5.4.0.

http://php.net/supported-versions.php

Deci mai corect ar fi fost:

$_POST[‘foo’] putea fi accesat ca $foo

Mai bine citeai manualul inainte:

http://php.net/manual/en/language.variables.superglobals.php
http://php.net/manual/en/reserved.variables.globals.php
http://php.net/manual/en/language.constants.php

Vezi ca mai este si postul de sub cel de sus -> http://stackoverflow.com/a/23638031/3907274

3 Likes