      1: <?php
      2: /**
      3:  * Licensed to the Apache Software Foundation (ASF) under one or more
      4:  * contributor license agreements. See the NOTICE file distributed with
      5:  * this work for additional information regarding copyright ownership.
      6:  * The ASF licenses this file to You under the Apache License, Version 2.0
      7:  * (the "License"); you may not use this file except in compliance with
      8:  * the License. You may obtain a copy of the License at
      9:  *
     10:  *     http://www.apache.org/licenses/LICENSE-2.0
     11:  *
     12:  * Unless required by applicable law or agreed to in writing, software
     13:  * distributed under the License is distributed on an "AS IS" BASIS,
     14:  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     15:  * See the License for the specific language governing permissions and
     16:  * limitations under the License.
     17:  *
     18:  * @package log4php
     19:  */
     20:
     21: /**
     22:  * Returns a value from a superglobal array corresponding to the
     23:  * given key.
     24:  *
     25:  * Option: the key to look up within the superglobal array
     26:  *
     27:  * Also, it is possible that a superglobal variable is not populated by PHP
     28:  * because of the settings in the variables-order ini directive. In this case
     29:  * the converter will return an empty value.
     30:  *
     31:  * @see http://php.net/manual/en/language.variables.superglobals.php
     32:  * @see http://www.php.net/manual/en/ini.core.php#ini.variables-order
     33:  *
     34:  * @package log4php
     35:  * @subpackage pattern
     36:  * @version $Revision: 1326626 $
     37:  * @since 2.3
     38:  */
     39: abstract class LoggerPatternConverterSuperglobal extends LoggerPatternConverter {
     40:
     41:     /**
     42:      * Name of the superglobal variable, to be defined by subclasses.
     43:      * For example: "_SERVER" or "_ENV".
     44:      */
     45:     protected $name;
     46:
     47:     protected $value = '';
     48:
     49:     public function activateOptions() {
     50:         // Read the key from options array
     51:         if (isset($this->option) && $this->option !== '') {
     52:             $key = $this->option;
     53:         }
     54:
     55:         /*
     56:          * There is a bug in PHP which doesn't allow superglobals to be
     57:          * accessed when their name is stored in a variable, e.g.:
     58:          *
     59:          * $name = '_SERVER';
     60:          * $array = $$name;
     61:          *
     62:          * This code does not work when run from within a method (only when run
     63:          * in global scope). But the following code does work:
     64:          *
     65:          * $name = '_SERVER';
     66:          * global $$name;
     67:          * $array = $$name;
     68:          *
     69:          * That's why global is used here.
     70:          */
     71:         global ${$this->name};
     72:
     73:         // Check the given superglobal exists. It is possible that it is not initialized.
     74:         if (!isset(${$this->name})) {
     75:             $class = get_class($this);
     76:             trigger_error("log4php: $class: Cannot find superglobal variable \${$this->name}.", E_USER_WARNING);
     77:             return;
     78:         }
     79:
     80:         $source = ${$this->name};
     81:
     82:         // When the key is set, display the matching value
     83:         if (isset($key)) {
     84:             if (isset($source[$key])) {
     85:                 $this->value = $source[$key];
     86:             }
     87:         }
     88:
     89:         // When the key is not set, display all values
     90:         else {
     91:             $values = array();
     92:             foreach($source as $key => $value) {
     93:                 $values[] = "$key=$value";
     94:             }
     95:             $this->value = implode(', ', $values);
     96:         }
     97:     }
     98:
     99:     public function convert(LoggerLoggingEvent $event) {
    100:         return $this->value;
    101:     }
    102: }
    103: