RubenGeert
RubenGeert

Reputation: 2952

Can I pass a variable into a function?

I'm trying to refactor some code but I'm kinda confused. I define my database connection like so:

try{
    global $conn;
    $conn = new PDO("mysql:host=$host",$root,$pw); [...]

Now I'd like a function for retrieving table rows but it needs $conn. Is there any way in which I can pass $conn into this function? I tried to set it as a default value but that doesn't work:

function get($table,$conn=$conn,$limit=10){ [...]

I then tried the use keyword but I think it's only available for anonymous functions:

function get($table,$limit=10)use($conn){
    $query = $conn->query(" [...]

How do other people do this? Am I missing something obvious here?

Upvotes: 0

Views: 152

Answers (4)

Netorica
Netorica

Reputation: 19327

the most simple thing you can do is to create a function that will return you the $conn variable

function conn (){
   $conn = NULL;
   ...some database connection setup etc...
   return $conn;
}

and call it to other functions that you need to use it

function getDb(){
 conn()->query(" [...]");
}

the conn() function will be available to all your functions on your PHP script.

but if you plan to make a more complex web application I recommend you to use a PHP framework or make a PHP class and apply OOP principles that would handle the database connection for you.

Upvotes: 0

hakre
hakre

Reputation: 197659

function get($table, $limit=10)

As you already wrote in your question, this function header is incomplete. The function itself can not do what it needs to do without having $conn.

As this is a function in the global namespace, the most straight forward thing could be to use a global variable:

function conn_get($table, $limit=10) {

    global $conn;

I also name-spaced the function to make the relation clear. The problem with this are two things:

  1. global functions are expensive to maintain
  2. global variables are expensive to maintain

So what you normally do in that case is to wrap this into a class:

class Conn
{
    private $conn;

    public function __construct(PDO $conn) {

        $this->conn = $conn;
    }

    public function get($table, $limit=10) {

       $query = $this->conn->query("[...]");
       ...
    }
}

You then pass around a Conn object which can be used:

$pdo  = new PDO("mysql:host=$host", $root, $pw);
$conn = new Conn($pdo);

And then:

$conn->get('ColorTable', 200);

The private variable takes over the role of the global variable with the benefit that every method inside the same object can access it. So everything now is in it's own space and contrary to the global space, will not go into each others way that fast. This is easy (easier) to change and maintain over time.

Upvotes: 4

David Müller
David Müller

Reputation: 5351

In PHP, use is the way to go for anonymous / lambda-functions but not for ordinary functions.

If you have the database connection flying around in global scope, you can either pass it as a normal variable to your functions like so:

function get(PDO $conn, $table,$limit=10) {
    $query = $conn->query(" [...]
}

Other than that (bad practice!) is to get the global $conn variable into the function like so:

function get($table,$limit=10) {
    $query = $GLOBALS['conn']->query(" [...]
}

However, an object oriented approach is recommended! You might want to inject the Database Class via dependency injection into the classes, where you need it.

Upvotes: 0

Simone
Simone

Reputation: 21262

When you call the function i.e:

$table_rows = get($table, $conn);

You are passing local variables inside the function scope.

However you can't define a not-static variable as default: $conn=$conn will throw a fatal error.

Upvotes: 0

Related Questions