В классе PHP5, когда частный конструктор становится названным?

package com.test;

import java.io.StringReader;
import java.util.HashMap;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

public class Random {

    /**
     * @param args
     */
    public static void main(String[] args) {
        HashMap<String, String> values = new HashMap<String, String>();
        String xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><user><kyc>123</kyc><address>test</address><resiFI>asds</resiFI></user>";
        Document xml = convertStringToDocument(xmlString);
        Node user = xml.getFirstChild();
        NodeList childs = user.getChildNodes();
        Node child;
        for (int i = 0; i < childs.getLength(); i++) {
            child = childs.item(i);
            System.out.println(child.getNodeName());
            System.out.println(child.getTextContent());
            values.put(child.getNodeName(), child.getTextContent());
        }

    }

    private static Document convertStringToDocument(String xmlStr) {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder;
        try {
            builder = factory.newDocumentBuilder();
            Document doc = builder.parse(new InputSource(new StringReader(
                    xmlStr)));
            return doc;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

Это сработает. Пожалуйста, проверьте :) Вы можете играть с DOM.

37
задан Mark Biek 26 August 2008 в 01:19
поделиться

5 ответов

__construct() был бы только назван, если бы Вы назвали его из метода для класса, содержащего частного конструктора. Таким образом для Вашей Singleton, у Вас мог бы быть метод как так:

class DBConnection
{
   private static $Connection = null;

   public static function getConnection()
   {
      if(!isset(self::$Connection))
      {
         self::$Connection = new DBConnection();
      }
      return self::$Connection;
   }

   private function __construct()
   {

   }
}

$dbConnection = DBConnection::getConnection();

причина, Вы в состоянии/, хочет инстанцировать класса из себя, то, так, чтобы можно было проверить, чтобы удостовериться, что только один экземпляр существует в любой момент времени. Это - смысл Singleton, в конце концов. Используя Singleton для соединения с базой данных гарантирует, что Ваше приложение не делает тонну из соединений с БД за один раз.

<час>

Редактирование: Добавленный $, как предложено @emanuele-del-grande

62
ответ дан Mateus Felipe 23 September 2019 в 20:41
поделиться

Немного выбора гниды: Для полноты Вы были бы, вероятно объявлять класс как финал также, так как Вы не хотели бы кого-то разделяющего этот класс на подклассы и реализующий его собственного общедоступного конструктора.

(Прощают мне, если компилятор ловит переопределение частного конструктора, но я не думаю, что это делает)

0
ответ дан Allain Lalonde 23 September 2019 в 20:41
поделиться

Протестируйте код, Mark, и сообщите мне то, что Вы узнаете.

РЕДАКТИРОВАНИЕ: Кроме того, в этой конкретной ситуации я не уверен, почему Вы должны были бы быть обеспокоены препятствованием тому, чтобы человек разделил на подклассы. Если у кого-то есть доступ к Вашему коду PHP для разделения на подклассы его, то у них также есть доступ к коду для копирования его и модификаторы доступа изменения к чему-то, что они (по любой причине) находят подходящими.

практическая полноценность Singleton в этом случае - то, что при помощи ее можно удостовериться, что Вы всегда используете то же соединение с базой данных для данного Запроса HTTP. Это выполняет это. Другой материал (использующий final и частные конструкторы) полезен, чтобы знать с точки зрения теории, и еще более полезный знать, хотите ли Вы распределить код качества API другим программистам, но в случае этого конкретного примера, делают все ключевые слова, добавляют байты к Вашему размеру файла класса.

2
ответ дан Brian Warshaw 23 September 2019 в 20:41
поделиться

Вот очень простой одиночный элемент, который просто генерирует дату/строку времени:

class TheDate
{
    private static $DateInstance = null;
    private $dateVal;

    public static function getDateInstance()
    {
        if(!isset(self::$DateInstance))
        {
            self::$DateInstance = new TheDate();
        }

        return self::$DateInstance;
    }

    public static function getDateVal()
    {
        return self::$DateInstance->dateVal;
    }

    private function __construct()
    {
        $this->dateVal = strftime("%Y-%m-%d %H:%M:%S");
    }
}

Выполнение чего-то вроде этого, очевидно, дает мне ту же дату много раз:

$date1 = TheDate::getDateInstance();
echo $date1->getDateVal() . "<br />";

$date2 = TheDate::getDateInstance();
echo $date2->getDateVal() . "<br />";

И выполнение этого не генерирует ошибок:

class NewDate extends TheDate
{
    public function __construct()
    {

    }
}
6
ответ дан rodrigo-silveira 23 September 2019 в 20:41
поделиться

Хорошо, я запустил некоторые мои собственные тесты.

  • , Если Вы не объявляете, Ваш собственный конструктор в подклассе, пытаясь инстанцировать его бросит фатальную ошибку, потому что это пытается назвать конструктора суперкласса.
  • В случае соединения с БД при возможном возврате (в PHP, так или иначе) mysqli экземпляра или ресурса, возвращенного mysql_connect() функция (или некоторая другая ссылка на некоторый другой RDBMS), пока Вы отмечаете частный экземпляр, нет никакой угрозы кого-то разделяющего его на подклассы и вмешивающийся в ссылку.
  • , Поскольку я сослался на прежде, если кто-то действительно хочет переопределить Ваше поведение и установить многочисленные связи, они могли бы точно также сделать это путем записи нового класса.
4
ответ дан Brian Warshaw 23 September 2019 в 20:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: