diff --git a/.deploy/build-repo.sh b/.deploy/build-repo.sh deleted file mode 100755 index 97d1a1557..000000000 --- a/.deploy/build-repo.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/sh -set -e - -echo "** Uninstalling dev-dependencies" -composer install --no-dev - -echo "** Marking revision" -git rev-parse HEAD > DOCSITE_REV - -echo "** Building repository" -set -x -hhvm --hphp \ - -l3 \ - -d hhvm.check_return_type_hints=3 \ - --module src \ - --module vendor \ - --module build/final \ - --ffile public/index.php \ - --cfile DOCSITE_REV \ - --cmodule public \ - --cmodule build/final \ - $(find guides -type f -name '*.txt' | sed 's,^,--cfile ,') \ - --output-dir /var/out \ - --file-cache /var/out/file.cache -set +x - -echo "** Listing outputs" -ls -lh /var/out diff --git a/.deploy/built-site.Dockerfile b/.deploy/built-site.Dockerfile deleted file mode 100644 index dc8b94667..000000000 --- a/.deploy/built-site.Dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -# Creates a docker image with a built copy of the site. Not repo-auth. -# Useful as a scratch/testing area. -FROM hhvm/hhvm:4.164-latest -ENV TZ UTC -ENV LANG en_US.UTF-8 -ENV LANGUAGE en_US:en -ENV LC_ALL en_US.UTF-8 -ENV COMPOSER_ALLOW_SUPERUSER 1 - -RUN rm -rf /var/www -ADD . /var/www - -RUN cd /var/www && touch /.docker_build && .deploy/init.sh diff --git a/.deploy/init.sh b/.deploy/init.sh deleted file mode 100755 index 144474324..000000000 --- a/.deploy/init.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - -set -ex - -if ! [ -e /.docker_build ]; then - echo "This script should only be ran from a Dockerfile" - exit 1 -fi - -if ! [ -x .deploy/system-init.sh ]; then - echo "Run from the root directory of the source tree." - exit 1 -fi - -.deploy/system-init.sh - -echo "** Installing Hack dependencies" -composer install - -echo "** Run build" -hhvm bin/build.php --auto diff --git a/.deploy/prod.Dockerfile b/.deploy/prod.Dockerfile deleted file mode 100644 index 07cd5ed66..000000000 --- a/.deploy/prod.Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM hhvm/hhvm-proxygen:4.164-latest - -ADD hhvm.prod.ini /etc/hhvm/site.ini -ADD hhvm.hhbc /var/www/hhvm.hhbc -ADD file.cache /var/www/file.cache - -EXPOSE 80 diff --git a/.deploy/system-init.sh b/.deploy/system-init.sh deleted file mode 100755 index b816aaf26..000000000 --- a/.deploy/system-init.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash - -set -ex - -if ! [ -e /.docker_build ]; then - echo "This script should only be ran from a Dockerfile" - exit 1 -fi - -STAMP_FILE=/.hack_docs_system_init.stamp -if [ -e "$STAMP_FILE" ]; then - exit -fi - -export DEBIAN_FRONTEND=noninteractive - -echo "** Installing apt dependencies" -# This is done by the dockerfile, but the intermediate issue can be cached, so do -# it again here. -apt-get clean -apt-get update -y - -# Some environments (e.g. VSCode containers) will copy the exterior locale -# settings, which can break things if the current locale isn't usable in the -# container; using the `C` locale makes sure that the `locales` package -# post-install succeeds. -LC_ALL=C apt-get install -y php-cli zip unzip locales - -echo "** Updating locales" -locale-gen en_US.UTF-8 - -echo "** Installing composer" -wget -qO /dev/stdout https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer -if [ ! -x /usr/local/bin/composer ]; then - echo "Failed to install composer" - exit 1 -fi - -touch "$STAMP_FILE" diff --git a/.deploy/terraform/.gitignore b/.deploy/terraform/.gitignore deleted file mode 100644 index 184016ea3..000000000 --- a/.deploy/terraform/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -terraform.tfvars -.terraform/ -.terraform.lock.hcl diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile deleted file mode 100644 index 5f5e7f8b9..000000000 --- a/.devcontainer/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM hhvm/hhvm-proxygen:4.164-latest - -ARG WORKSPACE - -RUN rm -rf /var/www; ln -s ${WORKSPACE} /var/www -RUN ln -sf /var/www/hhvm.dev.ini /etc/hhvm/site.ini - -ADD .deploy/system-init.sh /var/tmp/system-init.sh -RUN touch /.docker_build && /var/tmp/system-init.sh && rm /var/tmp/system-init.sh diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json deleted file mode 100644 index 6b495e201..000000000 --- a/.devcontainer/devcontainer.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "docs.hhvm.com", - "runArgs": [ - "--init", - "--env", "LC_ALL=C" - ], - "build": { - "dockerfile": "Dockerfile", - "args": { - "WORKSPACE": "${containerWorkspaceFolder}" - }, - "context": ".." - }, - "overrideCommand": false, - - // Set *default* container specific settings.json values on container create. - "settings": { - "terminal.integrated.profiles.linux": { - "bash": { - "path": "/bin/bash", - "args": [ - "--login" - ] - } - }, - "terminal.integrated.defaultProfile.linux": "bash" - }, - - "extensions": [ "pranayagarwal.vscode-hack" ], - "forwardPorts": [ 80 ], - "postCreateCommand": ".deploy/init.sh", - "hostRequirements": { - "memory": "8gb" - } -} diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index b3b7fa4c5..000000000 --- a/.dockerignore +++ /dev/null @@ -1,7 +0,0 @@ -.bundle/ -.elasticbeanstalk/ -build/ -!build/extracted-examples/ -!build/final/codegen/.gitkeep -vendor/ -vendor-rb/ diff --git a/.elasticbeanstalk/config.yml b/.elasticbeanstalk/config.yml deleted file mode 100644 index e36944dca..000000000 --- a/.elasticbeanstalk/config.yml +++ /dev/null @@ -1,5 +0,0 @@ -deploy: - artifact: Dockerrun.aws.json -global: - application_name: hhvm-hack-docs - default_region: us-west-2 diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml deleted file mode 100644 index 7022c22e7..000000000 --- a/.github/workflows/build-and-test.yml +++ /dev/null @@ -1,179 +0,0 @@ -name: Continuous Integration -on: - push: - pull_request: - schedule: - # Every four hours, avoiding o'clock because GitHub actions - # are slower at exactly :00. - - cron: '42 1,5,9,13,17,21 * * *' - -permissions: - id-token: write - contents: write - pull-requests: write - packages: write - -env: - REGISTRY: ghcr.io - IMAGE_NAME: ${{ github.repository }} - IMAGE_SCRATCH: ${{ github.repository }}:scratch - IMAGE_LATEST: ${{ github.repository }}:latest - -jobs: - build: - name: Build and Test - strategy: - matrix: - os: [ ubuntu ] - hhvm: [ '4.164' ] - runs-on: ${{matrix.os}}-latest - steps: - - uses: actions/checkout@v3 - - name: Fetch docker images - run: | - docker pull hhvm/hhvm:${{matrix.hhvm}}-latest - docker pull hhvm/hhvm-proxygen:${{matrix.hhvm}}-latest - - name: Build - run: docker build -t $IMAGE_SCRATCH -f .deploy/built-site.Dockerfile . - - name: Typecheck - run: docker run --rm -w /var/www $IMAGE_SCRATCH hh_server --check . - - name: Run tests - run: docker run --rm -w /var/www $IMAGE_SCRATCH vendor/bin/hacktest tests/ - - name: Lint - run: docker run --rm -w /var/www $IMAGE_SCRATCH vendor/bin/hhast-lint - - name: Verify codegen is unchanged - run: docker run --rm -w /var/www $IMAGE_SCRATCH vendor/bin/hh-codegen-verify-signatures src - - name: Set up cache for Docker image - uses: actions/cache@v3 - with: - key: ${{github.run_id}} - path: hack-docs.tar - - name: Export Docker image - run: docker save $IMAGE_SCRATCH -o hack-docs.tar - update-docker-image: - concurrency: ${{github.ref}} - if: github.ref == 'refs/heads/main' - name: Deploy - needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - id: download-tar - name: Set up cache for Docker image - uses: actions/cache@v3 - with: - key: ${{github.run_id}} - path: hack-docs.tar - - name: Import Docker image - run: docker load --input hack-docs.tar - - name: Build HHBC repo - run: | - mkdir ${{runner.temp}}/repo-out - docker run --rm \ - -v ${{runner.temp}}/repo-out:/var/out \ - -w /var/www \ - $IMAGE_SCRATCH \ - .deploy/build-repo.sh - - name: Set image tag/name variables - run: | - DEPLOY_REV=$(git rev-parse --short HEAD) - HHVM_VERSION=$(awk '/APIProduct::HACK/{print $NF}' src/codegen/PRODUCT_TAGS.php | cut -f2 -d- | cut -f1-2 -d.) - IMAGE_TAG="HHVM-${HHVM_VERSION}-$(date +%Y-%m-%d)-${DEPLOY_REV}" - IMAGE_NAME="$IMAGE_NAME:$IMAGE_TAG" - echo "DEPLOY_REV=$DEPLOY_REV" >> $GITHUB_ENV - echo "IMAGE_TAG=$IMAGE_TAG" >> $GITHUB_ENV - echo "IMAGE_NAME=$IMAGE_NAME" >> $GITHUB_ENV - - name: Build repo-authoritative Docker image - run: | - cp hhvm.prod.ini ${{runner.temp}}/repo-out - cp .deploy/prod.Dockerfile ${{runner.temp}}/repo-out/Dockerfile - ( - cd ${{runner.temp}}/repo-out - docker build -t "$REGISTRY/$IMAGE_NAME" . - ) - - name: Log in to Container Registry - run: | - echo "${{ secrets.GITHUB_TOKEN }}" | docker login "$REGISTRY" -u "${{ github.actor }}" --password-stdin - - name: Push image to Container Registry - run: | - docker push "$REGISTRY/$IMAGE_NAME" - - if: github.ref == 'refs/heads/main' - name: Update the latest tag to Container Registry - run: | - docker tag "$REGISTRY/$IMAGE_NAME" "$REGISTRY/$IMAGE_LATEST" - docker push "$REGISTRY/$IMAGE_LATEST" - - name: Checkout the existing deploy branch - id: checkout-existing-deploy-branch - continue-on-error: true - uses: actions/checkout@v3 - with: - path: .var/tmp/deploy - ref: deploy/prod-${{github.ref_name}} - - name: Checkout the default deploy branch - if: steps.checkout-existing-deploy-branch.outcome == 'failure' - uses: actions/checkout@v3 - with: - path: .var/tmp/deploy - ref: deploy/prod-main - - run: | - cat > .var/tmp/deploy/terraform.tfvars < "$GITHUB_ENV" + - uses: actions/checkout@v2.4.0 + - uses: aws-actions/configure-aws-credentials@v1 + with: + role-to-assume: arn:aws:iam::223121549624:role/hhvm-user-documentation-github-actions + aws-region: us-west-2 + - uses: hashicorp/setup-terraform@v2 + - run: terraform init + - run: terraform workspace select "$WORKSPACE_NAME" || terraform workspace new "$WORKSPACE_NAME" + - run: terraform apply -auto-approve + - if: github.ref_type == 'branch' + uses: peter-evans/create-pull-request@v4 + with: + branch: create-pull-request/${{github.ref_name}} \ No newline at end of file diff --git a/.github/workflows/destroy.yml b/.github/workflows/destroy.yml deleted file mode 100644 index 0e31a4021..000000000 --- a/.github/workflows/destroy.yml +++ /dev/null @@ -1,28 +0,0 @@ -on: - delete: - -permissions: - id-token: write - contents: write - pull-requests: write - -jobs: - destroy: - if: startsWith(github.event.ref, 'deploy/') - runs-on: ubuntu-latest - defaults: - run: - working-directory: .deploy/terraform - steps: - - uses: actions/checkout@v3 - - run: | - [[ "${{github.event.ref}}" =~ ^deploy/(.*)$ ]] && \ - echo "WORKSPACE_NAME=${BASH_REMATCH[1]}" > "$GITHUB_ENV" - - uses: aws-actions/configure-aws-credentials@v1 - with: - role-to-assume: arn:aws:iam::223121549624:role/hhvm-user-documentation-github-actions - aws-region: us-west-2 - - uses: hashicorp/setup-terraform@v2 - - run: terraform init - - run: terraform workspace select "$WORKSPACE_NAME" - - run: terraform destroy -auto-approve diff --git a/.github/workflows/sync_manual.yml b/.github/workflows/sync_manual.yml deleted file mode 100644 index 9abfded8b..000000000 --- a/.github/workflows/sync_manual.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: Update guides/hack from facebook/hhvm repo - -on: - push: - branches: - # Run when changes are pushed to main too. This makes it easier - # to make changes to this file and see the results. - - main - schedule: - # Fifteen minutes past the hour, every hour. - # (GitHub actions are heavily used at o'clock, so arbitrarily - # choose another time.) - - cron: '15 * * * *' -jobs: - build: - runs-on: ubuntu-latest - steps: - - name: Checkout user-documentation - uses: actions/checkout@v3 - - - name: Download the latest facebook/hhvm - run: wget https://github.com/facebook/hhvm/archive/refs/heads/master.zip - - - name: Unzip - run: unzip -q master.zip - - - name: Check directory contents - run: ls - - - name: Remove old copy of Hack guides - run: rm -r guides/hack - - - name: Use the latest copy of the manual from facebook/hhvm instead - run: cp -r hhvm-master/hphp/hack/manual/hack guides - - - name: Clean up - run: rm -r hhvm-master master.zip - - - name: Create a commit - uses: stefanzweifel/git-auto-commit-action@v4 - with: - commit_message: Update guides/hack from HHVM repository diff --git a/.gitignore b/.gitignore index 82dba5475..1c99dc138 100644 --- a/.gitignore +++ b/.gitignore @@ -1,31 +1 @@ -vendor -vendor-rb -composer.phar -.commit-template -www.pid -*.swp -*.php.diff -*.php.out -*.php.type-errors.diff -*.php.type-errors.out -*.hack.diff -*.hack.out -*.hack.type-errors.diff -*.hack.type-errors.out -*.css.map -*.stdout -*.stderr -.*.hhast.*cache -/api-sources/ -/build/final/ -/build/scratch/ -/public/www.pid -.sass-cache -.bundle -bourbon/ -.DS_Store -*~ -*.orig -*.rej -Dockerrun.aws.json -.var/ +.terraform/ diff --git a/.hhconfig b/.hhconfig deleted file mode 100644 index 1422899e4..000000000 --- a/.hhconfig +++ /dev/null @@ -1,12 +0,0 @@ -assume_php=false -ignored_paths = [ "api-sources/.+", "vendor/.*tests/.+", "vendor-rb/.*", "vendor/bin/.*" ] -disallow_elvis_space=true -disallow_non_arraykey_keys=true -disallow_unsafe_comparisons=true -decl_override_require_hint=true -disable_xhp_children_declarations=true -check_xhp_attribute=true -enable_experimental_tc_features=shape_field_check,sealed_classes,reified_generics -allowed_decl_fixme_codes=1002,2053,4030,4035,4045,4047,4101,4323 -allowed_fixme_codes_strict=1002,2011,2049,2050,2053,4005,4006,4026,4027,4030,4035,4045,4047,4051,4053,4057,4063,4064,4067,4101,4104,4106,4107,4108,4110,4112,4128,4135,4165,4188,4193,4240,4251,4281,4297,4314,4323,4324,4347,4371,4390,4401,4417,4423 -enable_enum_supertyping=true diff --git a/.terraform.lock.hcl b/.terraform.lock.hcl new file mode 100644 index 000000000..9dcca5fc9 --- /dev/null +++ b/.terraform.lock.hcl @@ -0,0 +1,61 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/aws" { + version = "4.17.1" + constraints = ">= 4.0.0" + hashes = [ + "h1:wTtXjaZzaM1lLuXYsFP8X1JyZKOa+m3JAzdcaQOtiyM=", + "zh:095c2ad4e42667b6e4c599f3fb7c1d0755b762983474fd3916e89867c30871a2", + "zh:0a987960f796289db7eac887d03dcde0311005cbf625499f4eea0a8882295aeb", + "zh:1fbe5f897afe3a9e5a41c2ecd1f312e79fb6745367a53f7bad11704aedb3b3e2", + "zh:52687f0753fa05a744bd37bb40bcba8ac5e0838cdcd227035b9ccb151635e5f9", + "zh:629835a96c682f4e168c12f6d3c0631409d8e6d28165a283d2fe232c4a8ba75a", + "zh:6fa6e6fbdc0b0377d750a7960768e22f71d8bd97d30e289b823a3923eb92fce7", + "zh:8dfef513861a7c779b34e2f3ea5692f5fb1fb51aa1ee9de78bc755f5652cb597", + "zh:9b12af85486a96aedd8d7984b0ff811a4b42e3d88dad1a3fb4c0b580d04fa425", + "zh:baf507b37a667c773f46d9779277ab9de44a5432694ef95fe9ef03a6af70435f", + "zh:bd006bd8f1403f71be8f490e33ea1bcbdd8135678ebe3f1c3c0ebd82615d9b33", + "zh:dd0a61fb654837d186376b1dbccc8a93ed1e2f176e3663daac2d5bc9190c7895", + "zh:f8db068265495a48476a5ea68aa7148ceb046cbfaad308ef8e12d8fd6f463126", + ] +} + +provider "registry.terraform.io/hashicorp/local" { + version = "2.2.3" + constraints = ">= 1.2.0, >= 2.0.0" + hashes = [ + "h1:aWp5iSUxBGgPv1UnV5yag9Pb0N+U1I0sZb38AXBFO8A=", + "zh:04f0978bb3e052707b8e82e46780c371ac1c66b689b4a23bbc2f58865ab7d5c0", + "zh:6484f1b3e9e3771eb7cc8e8bab8b35f939a55d550b3f4fb2ab141a24269ee6aa", + "zh:78a56d59a013cb0f7eb1c92815d6eb5cf07f8b5f0ae20b96d049e73db915b238", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:8aa9950f4c4db37239bcb62e19910c49e47043f6c8587e5b0396619923657797", + "zh:996beea85f9084a725ff0e6473a4594deb5266727c5f56e9c1c7c62ded6addbb", + "zh:9a7ef7a21f48fabfd145b2e2a4240ca57517ad155017e86a30860d7c0c109de3", + "zh:a63e70ac052aa25120113bcddd50c1f3cfe61f681a93a50cea5595a4b2cc3e1c", + "zh:a6e8d46f94108e049ad85dbed60354236dc0b9b5ec8eabe01c4580280a43d3b8", + "zh:bb112ce7efbfcfa0e65ed97fa245ef348e0fd5bfa5a7e4ab2091a9bd469f0a9e", + "zh:d7bec0da5c094c6955efed100f3fe22fca8866859f87c025be1760feb174d6d9", + "zh:fb9f271b72094d07cef8154cd3d50e9aa818a0ea39130bc193132ad7b23076fd", + ] +} + +provider "registry.terraform.io/hashicorp/random" { + version = "3.3.1" + hashes = [ + "h1:0gchydbWoBlDXzMdpFztkkCxzAbqQ/BNxb2XwYcTJiw=", + "zh:0af603dc14d0f7ec900b885f7e46226e5743323ce6fc25437738aae20906a799", + "zh:0de2d8f185b006c8928c18e7374ba0ca1df5bbc8c0dc492fb1e539c3184b7472", + "zh:118600e801bf73003ad2c57106564a5abdfe3b0e660b05b595e6884a009f32bd", + "zh:4d7ff20cc1344040911b197741a364c20a51d31ea6c746ce77b0454ad96b9733", + "zh:58b6443bdf638864bf32e580b60e1c811e0b38060d2dcc3a438ae4d83360300d", + "zh:6b4418698a62a39dc9f6ac82f0a48bc115a4ab409435ba918511837f02817f44", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:a1a43952a4c4cb6970b3cc4bef8c5da74ced36bd4f451e9850074b464ab4ed21", + "zh:c88095d4ca8cd30ccded57d39e55963f35044ffafebd56a2dc8568730edaf51a", + "zh:c955d31c41f4a13c1dd4290afa84c762282998f9afc110970dd288cc6fac5847", + "zh:d80e9b1d0f45e8377a20fe6280722ef6a49eb63d0aa0c71a2fd5a0817ec60458", + "zh:da26a6f89d595e0416c99f4ad288f23b52490ab44882af8c8d9a8ef56c938c70", + ] +} diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index ff39888e3..000000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "Build", - "type": "hhvm", - "request": "launch", - "script": "${workspaceFolder}/bin/build.php" - } - ] -} \ No newline at end of file diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md deleted file mode 100644 index ac27d8a51..000000000 --- a/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,2 +0,0 @@ -# Code of Conduct -Facebook has adopted a Code of Conduct that we expect project participants to adhere to. Please [read the full text](https://code.fb.com/codeofconduct) so that you can understand what actions will and will not be tolerated. \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 776d090f1..000000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,5 +0,0 @@ -# Contributing - -Whether you have direct push access to the repo or are planning to submit a [pull request](https://github.com/hhvm/user-documentation/pulls) for some content changes, [the issues list](https://github.com/hhvm/user-documentation/issues/) is a good place to start. If there is an issue that interests you, comment on the issue and sign up for it. If you want to add some new content or modify existing content that doesn't have an associated issue, please [file an issue](https://github.com/hhvm/user-documentation/issues/new) so we can keep track and go for it. - -Check out https://docs.hhvm.com/hack/contributing/introduction to learn how to run a developer instance of this site and make changes. \ No newline at end of file diff --git a/DOCSITE_REV b/DOCSITE_REV deleted file mode 100644 index a04f2c576..000000000 --- a/DOCSITE_REV +++ /dev/null @@ -1 +0,0 @@ -1fa47f258c6b68f8ec01899aa82fd6ffa0957109 diff --git a/LICENSE b/LICENSE deleted file mode 100644 index bd9d60892..000000000 --- a/LICENSE +++ /dev/null @@ -1,30 +0,0 @@ -BSD License - -For HHVM and Hack User Documentation - -Copyright (c) 2015, Facebook, Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation -and/or other materials provided with the distribution. - -* Neither the name Facebook nor the names of its contributors may be used to -endorse or promote products derived from this software without specific -prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/LocalConfig.php b/LocalConfig.php deleted file mode 100644 index 7bdc4ac69..000000000 --- a/LocalConfig.php +++ /dev/null @@ -1,18 +0,0 @@ -> - public static function getBuildID(): string { - invariant( - \file_exists(BuildPaths::BUILD_ID_FILE), - "Build ID does not exist", - ); - return Str\trim(\file_get_contents(BuildPaths::BUILD_ID_FILE)); - } -} diff --git a/PATENTS b/PATENTS deleted file mode 100644 index 87879c9bc..000000000 --- a/PATENTS +++ /dev/null @@ -1,33 +0,0 @@ -Additional Grant of Patent Rights Version 2 - -"Software" means the HHVM and Hack User Documentation software contributed by Facebook, Inc. - -Facebook, Inc. ("Facebook") hereby grants to each recipient of the Software -("you") a perpetual, worldwide, royalty-free, non-exclusive, irrevocable -(subject to the termination provision below) license under any Necessary -Claims, to make, have made, use, sell, offer to sell, import, and otherwise -transfer the Software. For avoidance of doubt, no license is granted under -Facebook’s rights in any patent claims that are infringed by (i) modifications -to the Software made by you or any third party or (ii) the Software in -combination with any software or other technology. - -The license granted hereunder will terminate, automatically and without notice, -if you (or any of your subsidiaries, corporate affiliates or agents) initiate -directly or indirectly, or take a direct financial interest in, any Patent -Assertion: (i) against Facebook or any of its subsidiaries or corporate -affiliates, (ii) against any party if such Patent Assertion arises in whole or -in part from any software, technology, product or service of Facebook or any of -its subsidiaries or corporate affiliates, or (iii) against any party relating -to the Software. Notwithstanding the foregoing, if Facebook or any of its -subsidiaries or corporate affiliates files a lawsuit alleging patent -infringement against you in the first instance, and you respond by filing a -patent infringement counterclaim in that lawsuit against that party that is -unrelated to the Software, the license granted hereunder will not terminate -under section (i) of this paragraph due to such counterclaim. - -A "Necessary Claim" is a claim of a patent owned by Facebook that is -necessarily infringed by the Software standing alone. - -A "Patent Assertion" is any lawsuit or other action alleging direct, indirect, -or contributory infringement or inducement to infringe any patent, including a -cross-claim or counterclaim. diff --git a/README.md b/README.md deleted file mode 100644 index 85c6f5a7c..000000000 --- a/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# HHVM and Hack User Documentation - -This is the repo for the [HHVM and Hack user documentation](http://docs.hhvm.com). - -[Contributions](CONTRIBUTING.md) and [feedback](https://github.com/hhvm/user-documentation/issues/new) are welcome. If you see anything broken, please [file an issue](https://github.com/hhvm/user-documentation/issues/new). - -## Structure - -There are three keys areas to this repo: - -* **User Documentation**: The [guides](https://github.com/hhvm/user-documentation/tree/master/guides). We realized that finding out how to do simple things like setting up HHVM to more complicated things like using `async` were more tedious than they should be. The documentation should be a friend, not a nuisance. -* **API Reference**: We use our own HHVM code documentation for Hack and HHVM specific API documentation. And for anything PHP specific, we defer to [php.net](http://php.net). This serves two purposes: - - The HHVM source code is the source of truth - - We don't duplicate PHP documentation, and [their documentation](http://php.net) will serve as the source of truth for PHP-specific documentation -* **Infrastructure**: An easier, more modular and scalable way for documentation. Markdown for [user-guide](https://github.com/hhvm/user-documentation/tree/master/guides) content. Easy to follow, Hack-based [source code](https://github.com/hhvm/user-documentation/tree/master/src) for building the site. - -Check out the [source code](https://github.com/hhvm/user-documentation/tree/master/src) for building the site. [`bin/build.php`](https://github.com/hhvm/user-documentation/blob/master/bin/build.php) is where all the execution begins. diff --git a/api-examples/class.AsyncMysqlClient/connect.md b/api-examples/class.AsyncMysqlClient/connect.md deleted file mode 100644 index 42298fd5a..000000000 --- a/api-examples/class.AsyncMysqlClient/connect.md +++ /dev/null @@ -1,32 +0,0 @@ -The following example shows how to use `AsyncMysqlClient::connect()` to connect to a database asynchronously and get a result from that connection. Notice a couple of things: - -* The parameters to `connect()` are very similar to that of a normal [`mysqli` connection](http://php.net/manual/en/mysqli.construct.php). -* With `AsyncMysqlClient`, we are able to take full advantage of [async](/hack/async/introduction) to perform other DB connection or I/O operations while waiting for this connection to return. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function do_connect(): Awaitable<\AsyncMysqlQueryResult> { - // Cast because the array from get_connection_info() is a mixed - $conn = await \AsyncMysqlClient::connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); - return await $conn->query('SELECT * FROM test_table'); -} - -<<__EntryPoint>> -async function run_it(): Awaitable { - $res = await do_connect(); - \var_dump($res->numRows()); // The number of rows from the SELECT statement -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(21) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlClient/setPoolsConnectionLimit.md b/api-examples/class.AsyncMysqlClient/setPoolsConnectionLimit.md deleted file mode 100644 index cee7aff71..000000000 --- a/api-examples/class.AsyncMysqlClient/setPoolsConnectionLimit.md +++ /dev/null @@ -1,69 +0,0 @@ -You can use `AsyncMysqlClient::setPoolsConnectionLimit()` to toggle the number of allowed async connections on the client. In this example, we are setting the number of allowed pool connections to be 2, but trying to do 3 connections, and that ends up giving an exception. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -function set_connection_pool(): \AsyncMysqlConnectionPool { - return new \AsyncMysqlConnectionPool(darray[]); -} - -async function connect_with_pool( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} - -function get_stats(\AsyncMysqlConnectionPool $pool): dict { - return dict($pool->getPoolStats()); -} - -<<__EntryPoint>> -async function run_it(): Awaitable { - \AsyncMysqlClient::setPoolsConnectionLimit(2); // limit two connections - $pool = set_connection_pool(); - $conn_awaitables = Vector {}; - try { - // One of these 3 connections here will throw the exception when we join - $conn_awaitables[] = connect_with_pool($pool); - $conn_awaitables[] = connect_with_pool($pool); - $conn_awaitables[] = connect_with_pool($pool); - $conns = await \HH\Asio\v($conn_awaitables); - } catch (\AsyncMysqlConnectException $ex) { - \var_dump(get_stats($pool)); - } -} -```.hhvm.expectf -dict(5) { - ["created_pool_connections"]=> - int(2) - ["destroyed_pool_connections"]=> - int(0) - ["connections_requested"]=> - int(3) - ["pool_hits"]=> - int(%d) - ["pool_misses"]=> - int(%d) -} -```.example.hhvm.out -dict(5) { - ["created_pool_connections"]=> - int(2) - ["destroyed_pool_connections"]=> - int(0) - ["connections_requested"]=> - int(3) - ["pool_hits"]=> - int(0) - ["pool_misses"]=> - int(3) -} -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlClientStats/callbackDelayMicrosAvg.md b/api-examples/class.AsyncMysqlClientStats/callbackDelayMicrosAvg.md deleted file mode 100644 index f215e1938..000000000 --- a/api-examples/class.AsyncMysqlClientStats/callbackDelayMicrosAvg.md +++ /dev/null @@ -1,36 +0,0 @@ -The following example describes how to get the average delay time between when a callback is scheduled (in this case, performing the connection) and when the callback actual ran (in this case, when the connection was actually established) via `AsyncMysqlClientStats::callbackDelayMicrosAvg`. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function get_delay(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $delay = $conn->connectResult()?->clientStats()?->callbackDelayMicrosAvg(); - $conn->close(); - return $delay; -} - -<<__EntryPoint>> -async function run(): Awaitable { - $d = await get_delay(); - \var_dump($d); -} -```.hhvm.expectf -float(%f) -```.example.hhvm.out -float(44.25) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlClientStats/ioEventLoopMicrosAvg.md b/api-examples/class.AsyncMysqlClientStats/ioEventLoopMicrosAvg.md deleted file mode 100644 index 1da1ef4a8..000000000 --- a/api-examples/class.AsyncMysqlClientStats/ioEventLoopMicrosAvg.md +++ /dev/null @@ -1,36 +0,0 @@ -The following example describes how to get the average loop time of this SQL client's event handling (in this particular case, performing the connection) via `AsyncMysqlClientStats::ioEventLoopMicrosAvg`. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function get_loop_info(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $loop = $conn->connectResult()?->clientStats()?->ioEventLoopMicrosAvg(); - $conn->close(); - return $loop; -} - -<<__EntryPoint>> -async function run(): Awaitable { - $l = await get_loop_info(); - \var_dump($l); -} -```.hhvm.expectf -float(%f) -```.example.hhvm.out -float(3.536136) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlConnectResult/clientStats.md b/api-examples/class.AsyncMysqlConnectResult/clientStats.md deleted file mode 100644 index ab872697a..000000000 --- a/api-examples/class.AsyncMysqlConnectResult/clientStats.md +++ /dev/null @@ -1,41 +0,0 @@ -Every connection has a connection result. You get the connection result from a call to `AsyncMysqlConnection::connectResult`. And one of the methods on an `AsyncMysqlConnectResult` is `clientStats()`, which gives you some information about the client you are connecting too. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function get_client_stats(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $cstats = $conn->connectResult()?->clientStats(); - \var_dump($cstats?->callbackDelayMicrosAvg()); - $conn->close(); - return $cstats; -} - -<<__EntryPoint>> -async function run(): Awaitable { - $cs = await get_client_stats(); - \var_dump($cs); -} -```.hhvm.expectf -float(%f) -object(AsyncMysqlClientStats) (0) { -} -```.example.hhvm.out -float(20.75) -object(AsyncMysqlClientStats) (0) { -} -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlConnectResult/elapsedMicros.md b/api-examples/class.AsyncMysqlConnectResult/elapsedMicros.md deleted file mode 100644 index 42ec7c8ca..000000000 --- a/api-examples/class.AsyncMysqlConnectResult/elapsedMicros.md +++ /dev/null @@ -1,36 +0,0 @@ -Every connection has a connection result. You get the connection result from a call to `AsyncMysqlConnection::connectResult`. And one of the methods on an `AsyncMysqlConnectResult` is `elapsedMicros()`, which tells you how long it took to make the connection. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function get_connection_time(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $em = $conn->connectResult()?->elapsedMicros(); - $conn->close(); - return $em; -} - -<<__EntryPoint>> -async function run(): Awaitable { - $em = await get_connection_time(); - \var_dump($em); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(3334) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlConnectResult/endTime.md b/api-examples/class.AsyncMysqlConnectResult/endTime.md deleted file mode 100644 index 2daafcca5..000000000 --- a/api-examples/class.AsyncMysqlConnectResult/endTime.md +++ /dev/null @@ -1,42 +0,0 @@ -Every connection has a connection result. You get the connection result from a call to `AsyncMysqlConnection::connectResult`. And one of the methods on an `AsyncMysqlConnectResult` is `endTime()`, which tells you when the connection operation completed. - -Note that - -``` - elapsedMicros() ~== endTime() - startTime() -``` - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function get_connection_start_time(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $et = $conn->connectResult()?->endTime(); - $conn->close(); - return $et; -} - -<<__EntryPoint>> -async function run(): Awaitable { - $et = await get_connection_start_time(); - \var_dump($et); -} -```.hhvm.expectf -float(%f) -```.example.hhvm.out -float(17354.068556) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlConnectResult/startTime.md b/api-examples/class.AsyncMysqlConnectResult/startTime.md deleted file mode 100644 index fe575bf46..000000000 --- a/api-examples/class.AsyncMysqlConnectResult/startTime.md +++ /dev/null @@ -1,42 +0,0 @@ -Every connection has a connection result. You get the connection result from a call to `AsyncMysqlConnection::connectResult`. And one of the methods on an `AsyncMysqlConnectResult` is `startTime()`, which tells you when the connection operation started. - -Note that - -``` - elapsedMicros() ~== endTime() - startTime() -``` - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function get_connection_start_time(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $st = $conn->connectResult()?->endTime(); - $conn->close(); - return $st; -} - -<<__EntryPoint>> -async function run(): Awaitable { - $st = await get_connection_start_time(); - \var_dump($st); -} -```.hhvm.expectf -float(%f) -```.example.hhvm.out -float(17354.768659) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlConnection/close.md b/api-examples/class.AsyncMysqlConnection/close.md deleted file mode 100644 index 5d0a4040d..000000000 --- a/api-examples/class.AsyncMysqlConnection/close.md +++ /dev/null @@ -1,45 +0,0 @@ -Closing a database connection is usually a good idea. This example shows the closing of a connection using `AsyncMysqlConnection::close` and then tries to invoke a query on that connection afterwards. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT name FROM test_table WHERE userID = 1'); - $conn->close(); - try { - $result2 = await $conn->query( - 'SELECT name FROM test_table WHERE userID = 1', - ); - } catch (\Exception $ex) { // probably InvalidArgumentException on query - echo "Connection closed\n"; - } - return $result->numRows(); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -Connection closed -int(%d) -```.example.hhvm.out -Connection closed -int(1) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlConnection/connectResult.md b/api-examples/class.AsyncMysqlConnection/connectResult.md deleted file mode 100644 index 747b237b5..000000000 --- a/api-examples/class.AsyncMysqlConnection/connectResult.md +++ /dev/null @@ -1,38 +0,0 @@ -This example shows how to get data about the async MySQL connection you made via a call to `AsyncMysqlConnection::connectResult`. An `AsyncMysqlConnectResult` is returned and there are various statistical methods you can call. Here, we call `elapsedTime` to show the time it took to make the connection. - -Interestingly, if you run this example twice or more, you may notice that the second time on will show a lower elapsed time than the first. This could be due to caching mechanisms, etc. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function get_connect_time(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = $conn->connectResult(); // returns ?\AsyncMysqlConnectResult - $conn->close(); - return $result?->elapsedMicros(); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $time = await get_connect_time(); - \var_dump($time); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(2984) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlConnection/escapeString.md b/api-examples/class.AsyncMysqlConnection/escapeString.md deleted file mode 100644 index b345d9fb6..000000000 --- a/api-examples/class.AsyncMysqlConnection/escapeString.md +++ /dev/null @@ -1,58 +0,0 @@ -The following example shows you how to use `AsyncMysqlConnection::escapeString` -in order to make sure any string pass to something like -`AsyncMysqlConnection::query` is safe for a database query. This is similar to -[`mysql_real_escape_string`](http://php.net/manual/en/function.mysql-real-escape-string.php). - -We *strongly* recommend using an API like `AsyncMysqlConnection::queryf` instead, -which automatically escapes strings passed to `%s` placeholders. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} - -async function get_data( - \AsyncMysqlConnection $conn, - string $name, -): Awaitable<\AsyncMysqlQueryResult> { - /* DON'T DO THIS! - * - * Use AsyncMysqlConnection::queryf() instead, which automatically escapes - * strings for %s placeholders. - */ - $escaped_name = $conn->escapeString($name); - \var_dump($escaped_name); - return await $conn->query( - "SELECT age FROM test_table where name = '".$escaped_name."'", - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await get_data($conn, 'Joel Marcey'); - $x = $result->numRows(); - $result = await get_data($conn, 'Daffy\nDuck'); - $conn->close(); - return $x + $result->numRows(); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); -} -```.hhvm.expect -string(11) "Joel Marcey" -string(12) "Daffy\\nDuck" -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlConnection/host.md b/api-examples/class.AsyncMysqlConnection/host.md deleted file mode 100644 index f3b8ab093..000000000 --- a/api-examples/class.AsyncMysqlConnection/host.md +++ /dev/null @@ -1,36 +0,0 @@ -The following example shows how to get the host of the MySQL server that this connection is associated with via `AsyncMysqlConnection::host`. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function get_host(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $info = $conn->host(); - $conn->close(); - return $info; -} - -<<__EntryPoint>> -async function run(): Awaitable { - $info = await get_host(); - \var_dump($info); -} -```.hhvm.expectf -string(%d) "%s" -```.example.hhvm.out -string(9) "localhost" -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlConnection/isReusable.md b/api-examples/class.AsyncMysqlConnection/isReusable.md deleted file mode 100644 index adb0a99fb..000000000 --- a/api-examples/class.AsyncMysqlConnection/isReusable.md +++ /dev/null @@ -1,91 +0,0 @@ -The following example shows how to make a connection not reusable in a connection pool with `AsyncMysqlConnection::setReusable` and test it with `AsyncMysqlConnection::isReusable`. By default, connections in pools are reusable. So, here we create a pool connection that is assigned to `$conn`. When we close `$conn`, that destroys that connection permanently. So when we get `$conn2`, a whole new connection will need to be created since we can't use the connection that was associated to `$conn`. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - $conn = await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); - // By default pool connections are automatically set to be reusable - $conn->setReusable(false); - return $conn; -} - -async function simple_query(\AsyncMysqlConnection $conn): Awaitable { - $result = await $conn->query('SELECT name FROM test_table WHERE userID = 1'); - return $result->numRows(); -} - -async function simple_query_2(\AsyncMysqlConnection $conn): Awaitable { - $result = await $conn->query('SELECT name FROM test_table WHERE userID = 2'); - return $result->numRows(); -} - -async function get_connection( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await connect($pool); -} - -function get_pool(): \AsyncMysqlConnectionPool { - $options = darray[ - 'pool_connection_limit' => 1, - ]; - return new \AsyncMysqlConnectionPool($options); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $pool = get_pool(); - - $conn = await get_connection($pool); - // This will be false now - \var_dump($conn->isReusable()); - $r2 = await simple_query($conn); - $conn->close(); - - $conn2 = await get_connection($pool); - $r2 = await simple_query_2($conn2); - // You will see one destroyed pool connection since we close $conn above - // and we didn't set it to be reusable - \var_dump($pool->getPoolStats()); - $conn2->close(); -} -```.hhvm.expectf -bool(false) -darray(5) { - ["created_pool_connections"]=> - int(2) - ["destroyed_pool_connections"]=> - int(1) - ["connections_requested"]=> - int(2) - ["pool_hits"]=> - int(%d) - ["pool_misses"]=> - int(%d) -} -```.example.hhvm.out -bool(false) -darray(5) { - ["created_pool_connections"]=> - int(2) - ["destroyed_pool_connections"]=> - int(1) - ["connections_requested"]=> - int(2) - ["pool_hits"]=> - int(0) - ["pool_misses"]=> - int(2) -} -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlConnection/lastActivityTime.md b/api-examples/class.AsyncMysqlConnection/lastActivityTime.md deleted file mode 100644 index 03d1eea54..000000000 --- a/api-examples/class.AsyncMysqlConnection/lastActivityTime.md +++ /dev/null @@ -1,36 +0,0 @@ -This example shows how to determine the last time a successful call was made using a given connection via `AsyncMysqlConnection::lastActivityTime`. The value returned is seconds since epoch as a `float`. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function get_time(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $t = $conn->lastActivityTime(); - $conn->close(); - return $t; -} - -<<__EntryPoint>> -async function run(): Awaitable { - $t = await get_time(); - \var_dump($t); -} -```.hhvm.expectf -float(%f) -```.example.hhvm.out -float(17272.084797) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlConnection/multiQuery.md b/api-examples/class.AsyncMysqlConnection/multiQuery.md deleted file mode 100644 index 104b3dea3..000000000 --- a/api-examples/class.AsyncMysqlConnection/multiQuery.md +++ /dev/null @@ -1,47 +0,0 @@ -`AsyncMysqlConnection::multiQuery` is similar to `AsyncMysqlConnection::query`, except that you can pass an array of queries to run one after the other. Then when you `await` on the call, you will get a `Vector` of `AsyncMysqlQueryResult`, one result for each query. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_multi_query(): Awaitable { - // In our test database, the third query will return an empty result since - // we do not have a user ID of 3. - $queries = Vector { - 'SELECT name FROM test_table WHERE userID = 1', - 'SELECT age, email FROM test_table WHERE userID = 2', - 'SELECT name FROM test_table WHERE userID = 3', - }; - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $results = await $conn->multiQuery($queries); - $conn->close(); - $x = 0; - foreach ($results as $result) { - $x += $result->numRows(); - } - return $x; -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_multi_query(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(1) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlConnection/port.md b/api-examples/class.AsyncMysqlConnection/port.md deleted file mode 100644 index ba90d29da..000000000 --- a/api-examples/class.AsyncMysqlConnection/port.md +++ /dev/null @@ -1,36 +0,0 @@ -The following example shows how to get the port of the MySQL server that this connection is associated with via `AsyncMysqlConnection::port`. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function get_port(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $port = $conn->port(); - $conn->close(); - return $port; -} - -<<__EntryPoint>> -async function run(): Awaitable { - $port = await get_port(); - \var_dump($port); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(3306) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlConnection/query.md b/api-examples/class.AsyncMysqlConnection/query.md deleted file mode 100644 index 078969d54..000000000 --- a/api-examples/class.AsyncMysqlConnection/query.md +++ /dev/null @@ -1,36 +0,0 @@ -The following example shows a basic usage of `AsyncMysqlConnection::query`. First you get a connection from an `AsyncMysqlConnectionPool`, then you can make the query. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT name FROM test_table WHERE userID = 1'); - $conn->close(); - return $result->numRows(); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(1) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlConnection/queryf.md b/api-examples/class.AsyncMysqlConnection/queryf.md deleted file mode 100644 index eed06101f..000000000 --- a/api-examples/class.AsyncMysqlConnection/queryf.md +++ /dev/null @@ -1,153 +0,0 @@ -The following example shows how to use `AsyncMysqlConnection::queryf`. First you get a connection from an `AsyncMysqlConnectionPool`; then you decide what parameters you want to pass as query placeholders. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} - -async function get_data( - \AsyncMysqlConnection $conn, - string $col, - int $id, -): Awaitable<\AsyncMysqlQueryResult> { - return await $conn->queryf( - 'SELECT %C FROM test_table where userID = %d', - $col, - $id, - ); -} - -async function simple_queryf(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await get_data($conn, 'name', 1); - $x = $result->numRows(); - $result = await get_data($conn, 'name', 2); - $conn->close(); - return $x + $result->numRows(); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_queryf(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(1) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` - -The following example uses the `%=s` placeholder in order to allow you to check whether an email address with the provided `string` exists in the table, or, if `null` is passed, whether there is a user with a `null` email address. - -```percent-equal-placeholders.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} - -async function get_data( - \AsyncMysqlConnection $conn, - string $col, - ?string $email, -): Awaitable<\AsyncMysqlQueryResult> { - // %=s allows you to check an actual string value or IS NULL - return await $conn->queryf( - 'SELECT %C FROM test_table where email %=s', - $col, - $email, - ); -} - -async function simple_queryf(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await get_data($conn, 'name', 'joelm@fb.com'); - $x = $result->numRows(); - $result = await get_data($conn, 'name', null); - $conn->close(); - return $x + $result->numRows(); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_queryf(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(18) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` - -The following example shows how to use the `%L` placeholder for `AsyncMysqlConnection::queryf`. First you get a connection from an `AsyncMysqlConnectionPool`; then we are passing a vector of ids to used in the placeholder. The placeholder ends up being `%Ld` since the ids are integers. - -```percent-L-placeholders.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} - -async function get_data( - \AsyncMysqlConnection $conn, - Vector $ids, -): Awaitable<\AsyncMysqlQueryResult> { - return await $conn->queryf( - 'SELECT name FROM test_table where userID IN (%Ld)', - $ids, - ); -} - -async function percent_L_queryf(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $ids = Vector {1, 2}; - $result = await get_data($conn, $ids); - $conn->close(); - return $result->numRows(); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await percent_L_queryf(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(1) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlConnection/releaseConnection.md b/api-examples/class.AsyncMysqlConnection/releaseConnection.md deleted file mode 100644 index 0ac104c63..000000000 --- a/api-examples/class.AsyncMysqlConnection/releaseConnection.md +++ /dev/null @@ -1,55 +0,0 @@ -If you ever want to get a plain, vanilla synchronous MySQL connection from your async connection, you call `AsyncMysqlConnection::releaseConnection`. This examples show how to get such a connection, noting too that your async connection is destroyed. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT name FROM test_table WHERE userID = 1'); - $sync_connection = $conn->releaseConnection(); - \var_dump($sync_connection); - try { - $result2 = await $conn->query( - 'SELECT name FROM test_table WHERE userID = 1', - ); - } catch (\Exception $ex) { // probably InvalidArgumentException on query - echo "Connection destroyed when released\n"; - } - // This call will block since it is not async - $sync_result = \mysql_query( - 'SELECT name FROM test_table WHERE userID = 1', - $sync_connection, - ); - $sync_rows = \mysql_num_rows($sync_result); - \mysql_close($sync_connection); - return $result->numRows() + $sync_rows; -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -resource(%d) of type (mysql link) -Connection destroyed when released -int(%d) -```.example.hhvm.out -resource(4) of type (mysql link) -Connection destroyed when released -int(2) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlConnection/serverInfo.md b/api-examples/class.AsyncMysqlConnection/serverInfo.md deleted file mode 100644 index bb2860e70..000000000 --- a/api-examples/class.AsyncMysqlConnection/serverInfo.md +++ /dev/null @@ -1,36 +0,0 @@ -The following example shows how to get the version of the MySQL server that this connection is associated with via `AsyncMysqlConnection::serverInfo`. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function get_server_info(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $info = $conn->serverInfo(); - $conn->close(); - return $info; -} - -<<__EntryPoint>> -async function run(): Awaitable { - $info = await get_server_info(); - \var_dump($info); -} -```.hhvm.expectf -string(%d) "%s" -```.example.hhvm.out -string(23) "8.0.22-0ubuntu0.20.04.2" -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlConnection/setReusable.md b/api-examples/class.AsyncMysqlConnection/setReusable.md deleted file mode 100644 index 2799f8e6e..000000000 --- a/api-examples/class.AsyncMysqlConnection/setReusable.md +++ /dev/null @@ -1,90 +0,0 @@ -The following example shows how to make a connection not reusable in a connection pool with `AsyncMysqlConnection::setReusable`. By default, connections in pools are reusable. So, here we create a pool connection that is assigned to `$conn`. When we close `$conn`, that destroys that connection permanently. So when we get `$conn2`, a whole new connection will need to be created since we can't use the connection that was associated to `$conn`. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - $conn = await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); - // By default pool connections are automatically set to be reusable - $conn->setReusable(false); - return $conn; -} - -async function simple_query(\AsyncMysqlConnection $conn): Awaitable { - $result = await $conn->query('SELECT name FROM test_table WHERE userID = 1'); - return $result->numRows(); -} - -async function simple_query_2(\AsyncMysqlConnection $conn): Awaitable { - $result = await $conn->query('SELECT name FROM test_table WHERE userID = 2'); - return $result->numRows(); -} - -async function get_connection( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await connect($pool); -} - -function get_pool(): \AsyncMysqlConnectionPool { - $options = darray[ - 'pool_connection_limit' => 1, - ]; - return new \AsyncMysqlConnectionPool($options); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $pool = get_pool(); - - $conn = await get_connection($pool); - \var_dump($conn->isReusable()); - $r2 = await simple_query($conn); - $conn->close(); - - $conn2 = await get_connection($pool); - $r2 = await simple_query_2($conn2); - // You will see one destroyed pool connection since we close $conn above - // and we didn't set it to be reusable - \var_dump($pool->getPoolStats()); - $conn2->close(); -} -```.hhvm.expectf -bool(false) -darray(5) { - ["created_pool_connections"]=> - int(2) - ["destroyed_pool_connections"]=> - int(1) - ["connections_requested"]=> - int(2) - ["pool_hits"]=> - int(%d) - ["pool_misses"]=> - int(%d) -} -```.example.hhvm.out -bool(false) -darray(5) { - ["created_pool_connections"]=> - int(2) - ["destroyed_pool_connections"]=> - int(1) - ["connections_requested"]=> - int(2) - ["pool_hits"]=> - int(0) - ["pool_misses"]=> - int(2) -} -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlConnection/warningCount.md b/api-examples/class.AsyncMysqlConnection/warningCount.md deleted file mode 100644 index a5703ab38..000000000 --- a/api-examples/class.AsyncMysqlConnection/warningCount.md +++ /dev/null @@ -1,37 +0,0 @@ -The following example shows how to get the number of errors or warnings on the last SQL query via `AsyncMysqlConnection::warningCount`. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function get_warning_count_on_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT name FROM test_table WHERE userID = 1'); - $wc = $conn->warningCount(); - $conn->close(); - return $wc; -} - -<<__EntryPoint>> -async function run(): Awaitable { - $wc = await get_warning_count_on_query(); - \var_dump($wc); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(0) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlConnectionPool/__construct.md b/api-examples/class.AsyncMysqlConnectionPool/__construct.md deleted file mode 100644 index 04ebe2ce7..000000000 --- a/api-examples/class.AsyncMysqlConnectionPool/__construct.md +++ /dev/null @@ -1,80 +0,0 @@ -The following example shows you how to create an `AsyncMysqlConnectionPool` with various options, and then connect to MySQL asynchronously using those pool options. The various pool options that you can construct an AsyncMysqlConnectionPool with are: - -* `connection_limit` - Defines the limit of opened connections for each set of User, Database, Host, etc. -* `total_connection_limit` - Defines the total limit of opened connection as a whole. -* `idle_timeout_micros` - Sets the maximum idle time in microseconds a connection can be left in the pool without being killed by the pool. -* `age_timeout_micros` - Sets the maximum age (means the time since started) of a connection, the pool will then kill this connection when reaches that limit. -* `expiration_policy` - There are 2 policies for the expiration of a connection: `IdleTime` and `Age`, in the Idle policy a connection will only die after some time being idle; in Age policy we extend the idle one to kill also by age. - -This example focuses on the `connection_limit` and `idle_timeout_micros` options. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -function set_connection_pool( - darray $options, -): \AsyncMysqlConnectionPool { - return new \AsyncMysqlConnectionPool($options); -} - -async function connect_with_pool( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} - -function get_stats(\AsyncMysqlConnectionPool $pool): dict { - return dict($pool->getPoolStats()); -} - -<<__EntryPoint>> -async function run_it(): Awaitable { - $options = darray[ - 'pool_connection_limit' => 2, - ]; - // We will have a 2 pool connection limit - $pool = set_connection_pool($options); - $conn_awaitables = Vector {}; - try { - // One of these three connections will throw the exception when we join - // because we are going beyond our connection limit - $conn_awaitables[] = connect_with_pool($pool); - $conn_awaitables[] = connect_with_pool($pool); - $conn_awaitables[] = connect_with_pool($pool); - $conns = await \HH\Asio\v($conn_awaitables); - } catch (\AsyncMysqlConnectException $ex) { - $stats = get_stats($pool); - echo "Allowed pool connections: ". - $stats['created_pool_connections']. - \PHP_EOL. - "Requested pool connections: ". - $stats['connections_requested']. - \PHP_EOL; - } - - $options = darray[ - 'idle_timeout_micros' => 2000000, - 'expiration_policy' => 'IdleTime', - ]; - $pool = set_connection_pool($options); - $conn = await connect_with_pool($pool); - \sleep(10); // Idle for 5 seconds. So should timeout here. - try { - $result = await $conn->query("SELECT * FROM test_table"); - } catch (\AsyncMysqlQueryException $ex) { - echo "Hit idle limit"; - } -} -```.hhvm.expect -Allowed pool connections: 2 -Requested pool connections: 3 -Hit idle limit -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlConnectionPool/connect.md b/api-examples/class.AsyncMysqlConnectionPool/connect.md deleted file mode 100644 index 7ec72fdcf..000000000 --- a/api-examples/class.AsyncMysqlConnectionPool/connect.md +++ /dev/null @@ -1,88 +0,0 @@ -It is **highly recommended** that you use connection pools when using async MySQL. That way you don't have to create a new connection every time you want to make a query to the database. The following example shows you how to connect to a MySQL database using an `AsyncMySqlConnectionPool`. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -class MyPool { - private \AsyncMysqlConnectionPool $pool; - - public function __construct() { - $this->pool = new \AsyncMysqlConnectionPool(darray[]); - } - - public function getPool(): \AsyncMysqlConnectionPool { - return $this->pool; - } - - public async function connect(): Awaitable<\AsyncMysqlConnection> { - return await $this->pool - ->connect(CI::$host, CI::$port, CI::$db, CI::$user, CI::$passwd); - } -} - - -async function get_num_rows(\AsyncMysqlConnection $conn): Awaitable { - $result = await $conn->query('SELECT * FROM test_table'); - return $result->numRows(); -} - -async function get_row_data( - \AsyncMysqlConnection $conn, -): Awaitable>> { - $result = await $conn->query('SELECT * FROM test_table'); - return $result->vectorRows(); -} - -async function run_it_1(MyPool $pool): Awaitable { - $conn = await $pool->connect(); - $rows = await get_num_rows($conn); - \var_dump($rows); -} - -async function run_it_2(MyPool $pool): Awaitable { - $conn = await $pool->connect(); - $data = await get_row_data($conn); - \var_dump($data->count()); - // Should show only one created pool connection since we are pooling it - \var_dump($pool->getPool()->getPoolStats()); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $pool = new MyPool(); - await run_it_1($pool); - await run_it_2($pool); -} -```.hhvm.expectf -int(%d) -int(%d) -darray(5) { - ["created_pool_connections"]=> - int(1) - ["destroyed_pool_connections"]=> - int(0) - ["connections_requested"]=> - int(2) - ["pool_hits"]=> - int(%d) - ["pool_misses"]=> - int(%d) -} -```.example.hhvm.out -int(21) -int(21) -darray(5) { - ["created_pool_connections"]=> - int(1) - ["destroyed_pool_connections"]=> - int(0) - ["connections_requested"]=> - int(2) - ["pool_hits"]=> - int(1) - ["pool_misses"]=> - int(1) -} -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlConnectionPool/getPoolStats.md b/api-examples/class.AsyncMysqlConnectionPool/getPoolStats.md deleted file mode 100644 index 14146f719..000000000 --- a/api-examples/class.AsyncMysqlConnectionPool/getPoolStats.md +++ /dev/null @@ -1,69 +0,0 @@ -The following example shows how to gather `AsyncMySqlConnectionPool` statistics using its `getStats()` method. The statistics that are gathered are connection statistics. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - - -function set_connection_pool( - darray $options = darray[], -): \AsyncMysqlConnectionPool { - return new \AsyncMysqlConnectionPool($options); -} - -async function connect_with_pool( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} - -function get_stats(\AsyncMysqlConnectionPool $pool): mixed { - return $pool->getPoolStats(); -} - -<<__EntryPoint>> -async function run_it(): Awaitable { - $pool = set_connection_pool(); - $conn_awaitables = Vector {}; - $conn_awaitables[] = connect_with_pool($pool); - $conn_awaitables[] = connect_with_pool($pool); - $conn_awaitables[] = connect_with_pool($pool); - $conns = await \HH\Asio\v($conn_awaitables); - // Get pool connection stats, like pool connections created, how many - // connections were requested, etc. - \var_dump(get_stats($pool)); -} -```.hhvm.expectf -darray(5) { - ["created_pool_connections"]=> - int(3) - ["destroyed_pool_connections"]=> - int(0) - ["connections_requested"]=> - int(3) - ["pool_hits"]=> - int(%d) - ["pool_misses"]=> - int(%d) -} -```.example.hhvm.out -darray(5) { - ["created_pool_connections"]=> - int(3) - ["destroyed_pool_connections"]=> - int(0) - ["connections_requested"]=> - int(3) - ["pool_hits"]=> - int(0) - ["pool_misses"]=> - int(3) -} -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlErrorResult/clientStats.md b/api-examples/class.AsyncMysqlErrorResult/clientStats.md deleted file mode 100644 index dd7ef9340..000000000 --- a/api-examples/class.AsyncMysqlErrorResult/clientStats.md +++ /dev/null @@ -1,49 +0,0 @@ -When an error occurs when establishing a connection or on a query, and you catch the exception that is thrown, you will get an `AsyncMysqlErrorResult`. And one of the methods on an `AsyncMysqlErrorResult` is `clientStats()`, which gives you some information about the client you are connecting too. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query_error(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - try { - $result = await $conn->query('SELECT bogus FROM bogus WHERE bogus = 1'); - } catch (\AsyncMysqlQueryException $ex) { - $qr = $ex->getResult(); - // Actually `AsyncMysqlQueryErrorResult` - \var_dump($qr is \AsyncMysqlErrorResult); - \var_dump($qr->clientStats()->callbackDelayMicrosAvg()); - $conn->close(); - return 0; - } - $conn->close(); - return $result->numRows(); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query_error(); - \var_dump($r); -} -```.hhvm.expectf -bool(true) -float(%f) -int(%d) -```.example.hhvm.out -bool(true) -float(12.438720703125) -int(0) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlErrorResult/elapsedMicros.md b/api-examples/class.AsyncMysqlErrorResult/elapsedMicros.md deleted file mode 100644 index ce8ac55e2..000000000 --- a/api-examples/class.AsyncMysqlErrorResult/elapsedMicros.md +++ /dev/null @@ -1,49 +0,0 @@ -When an error occurs when establishing a connection or on a query, and you catch the exception that is thrown, you will get an `AsyncMysqlErrorResult`. And one of the methods on an `AsyncMysqlErrorResult` is `elapsedMicros()`, which tells you how long the operation took until the error occurred. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query_error(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - try { - $result = await $conn->query('SELECT bogus FROM bogus WHERE bogus = 1'); - } catch (\AsyncMysqlQueryException $ex) { - $qr = $ex->getResult(); - // Actually `AsyncMysqlQueryErrorResult` - \var_dump($qr is \AsyncMysqlErrorResult); - \var_dump($qr->elapsedMicros()); - $conn->close(); - return 0; - } - $conn->close(); - return $result->numRows(); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query_error(); - \var_dump($r); -} -```.hhvm.expectf -bool(true) -int(%d) -int(%d) -```.example.hhvm.out -bool(true) -int(693) -int(0) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlErrorResult/endTime.md b/api-examples/class.AsyncMysqlErrorResult/endTime.md deleted file mode 100644 index 45df793fc..000000000 --- a/api-examples/class.AsyncMysqlErrorResult/endTime.md +++ /dev/null @@ -1,55 +0,0 @@ -When an error occurs when establishing a connection or on a query, and you catch the exception that is thrown, you will get an `AsyncMysqlErrorResult`. And one of the methods on an `AsyncMysqlErrorResult` is `endTime()`, which tells you when the connection operation completed. - -Note that - -``` - elapsedMicros() ~== endTime() - startTime() -``` - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query_error(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - try { - $result = await $conn->query('SELECT bogus FROM bogus WHERE bogus = 1'); - } catch (\AsyncMysqlQueryException $ex) { - $qr = $ex->getResult(); - // Actually `AsyncMysqlQueryErrorResult` - \var_dump($qr is \AsyncMysqlErrorResult); - \var_dump($qr->endTime()); - $conn->close(); - return 0; - } - $conn->close(); - return $result->numRows(); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query_error(); - \var_dump($r); -} -```.hhvm.expectf -bool(true) -float(%f) -int(%d) -```.example.hhvm.out -bool(true) -float(17245.263537) -int(0) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlErrorResult/failureType.md b/api-examples/class.AsyncMysqlErrorResult/failureType.md deleted file mode 100644 index e0cc4f04c..000000000 --- a/api-examples/class.AsyncMysqlErrorResult/failureType.md +++ /dev/null @@ -1,49 +0,0 @@ -When an error occurs when establishing a connection or on a query, and you catch the exception that is thrown, you will get an `AsyncMysqlErrorResult`. And one of the methods on an `AsyncMysqlErrorResult` is `failureType()`, which tells you whether the operation was a timeout (via the string `TimedOut`) or a server rejection of our connection or query (via the string `Failed`). - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query_error(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - try { - $result = await $conn->query('SELECT bogus FROM bogus WHERE bogus = 1'); - } catch (\AsyncMysqlQueryException $ex) { - $qr = $ex->getResult(); - // Actually `AsyncMysqlQueryErrorResult` - \var_dump($qr is \AsyncMysqlErrorResult); - \var_dump($qr->failureType()); - $conn->close(); - return 0; - } - $conn->close(); - return $result->numRows(); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query_error(); - \var_dump($r); -} -```.hhvm.expectf -bool(true) -string(6) "Failed" -int(%d) -```.example.hhvm.out -bool(true) -string(6) "Failed" -int(0) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlErrorResult/mysql_errno.md b/api-examples/class.AsyncMysqlErrorResult/mysql_errno.md deleted file mode 100644 index 3d41e380d..000000000 --- a/api-examples/class.AsyncMysqlErrorResult/mysql_errno.md +++ /dev/null @@ -1,50 +0,0 @@ -When an error occurs when establishing a connection or on a query, and you catch the exception that is thrown, you will get an `AsyncMysqlErrorResult`. And one of the methods on an `AsyncMysqlErrorResult` is `mysql_errno()`, which gives you the MySQL error number. In this case, the error number is 1146, which represents a table not existing. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query_error(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - try { - $result = await $conn->query('SELECT bogus FROM bogus WHERE bogus = 1'); - } catch (\AsyncMysqlQueryException $ex) { - $qr = $ex->getResult(); - // Actually `AsyncMysqlQueryErrorResult` - \var_dump($qr is \AsyncMysqlErrorResult); - // Error should be 1146 .. Table doesn't exist - \var_dump($qr->mysql_errno()); - $conn->close(); - return 0; - } - $conn->close(); - return $result->numRows(); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query_error(); - \var_dump($r); -} -```.hhvm.expectf -bool(true) -int(1146) -int(%d) -```.example.hhvm.out -bool(true) -int(1146) -int(0) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlErrorResult/mysql_error.md b/api-examples/class.AsyncMysqlErrorResult/mysql_error.md deleted file mode 100644 index 8b5f4a876..000000000 --- a/api-examples/class.AsyncMysqlErrorResult/mysql_error.md +++ /dev/null @@ -1,50 +0,0 @@ -When an error occurs when establishing a connection or on a query, and you catch the exception that is thrown, you will get an `AsyncMysqlErrorResult`. And one of the methods on an `AsyncMysqlErrorResult` is `mysql_error()`, which gives you the MySQL error string. In this case, the error string is letting us know that the `bogus` table does not exist. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query_error(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - try { - $result = await $conn->query('SELECT bogus FROM bogus WHERE bogus = 1'); - } catch (\AsyncMysqlQueryException $ex) { - $qr = $ex->getResult(); - // Actually `AsyncMysqlQueryErrorResult` - \var_dump($qr is \AsyncMysqlErrorResult); - // Error should be "Table doesn't exist..."" - \var_dump($qr->mysql_error()); - $conn->close(); - return 0; - } - $conn->close(); - return $result->numRows(); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query_error(); - \var_dump($r); -} -```.hhvm.expectf -bool(true) -string(34) "Table 'testdb.bogus' doesn't exist" -int(%d) -```.example.hhvm.out -bool(true) -string(34) "Table 'testdb.bogus' doesn't exist" -int(0) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlErrorResult/mysql_normalize_error.md b/api-examples/class.AsyncMysqlErrorResult/mysql_normalize_error.md deleted file mode 100644 index 01febdfd9..000000000 --- a/api-examples/class.AsyncMysqlErrorResult/mysql_normalize_error.md +++ /dev/null @@ -1,50 +0,0 @@ -When an error occurs when establishing a connection or on a query, and you catch the exception that is thrown, you will get an `AsyncMysqlErrorResult`. And one of the methods on an `AsyncMysqlErrorResult` is `mysql_normalize_error()`, which gives you possibly alternative, normalized version of the error provided by `mysql_error()`. Many times they are the same; it depends on how the client provides the error messages. In this case, the two errors are the same; the error string is letting us know that the `bogus` table does not exist. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query_error(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - try { - $result = await $conn->query('SELECT bogus FROM bogus WHERE bogus = 1'); - } catch (\AsyncMysqlQueryException $ex) { - $qr = $ex->getResult(); - // Actually `AsyncMysqlQueryErrorResult` - \var_dump($qr is \AsyncMysqlErrorResult); - // Error should be "Table doesn't exist..."" - \var_dump($qr->mysql_normalize_error()); - $conn->close(); - return 0; - } - $conn->close(); - return $result->numRows(); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query_error(); - \var_dump($r); -} -```.hhvm.expectf -bool(true) -string(34) "Table 'testdb.bogus' doesn't exist" -int(%d) -```.example.hhvm.out -bool(true) -string(34) "Table 'testdb.bogus' doesn't exist" -int(0) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlErrorResult/startTime.md b/api-examples/class.AsyncMysqlErrorResult/startTime.md deleted file mode 100644 index 662c53a1b..000000000 --- a/api-examples/class.AsyncMysqlErrorResult/startTime.md +++ /dev/null @@ -1,55 +0,0 @@ -When an error occurs when establishing a connection or on a query, and you catch the exception that is thrown, you will get an `AsyncMysqlErrorResult`. And one of the methods on an `AsyncMysqlErrorResult` is `startTime()`, which tells you when the connection operation began. - -Note that - -``` - elapsedMicros() ~== endTime() - startTime() -``` - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query_error(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - try { - $result = await $conn->query('SELECT bogus FROM bogus WHERE bogus = 1'); - } catch (\AsyncMysqlQueryException $ex) { - $qr = $ex->getResult(); - // Actually `AsyncMysqlQueryErrorResult` - \var_dump($qr is \AsyncMysqlErrorResult); - \var_dump($qr->startTime()); - $conn->close(); - return 0; - } - $conn->close(); - return $result->numRows(); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query_error(); - \var_dump($r); -} -```.hhvm.expectf -bool(true) -float(%f) -int(%d) -```.example.hhvm.out -bool(true) -float(17246.106603) -int(0) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlException/__construct.md b/api-examples/class.AsyncMysqlException/__construct.md deleted file mode 100644 index d9c4e2ed8..000000000 --- a/api-examples/class.AsyncMysqlException/__construct.md +++ /dev/null @@ -1,55 +0,0 @@ -The following example shows how to catch an `AsyncMysqlException`. Normally you would construct one implicitly via a `try/catch` block, like we did in this example. - -The two current subclasses of `AsyncMysqlException` are `AsyncMysqlConnectionException` for connection problems and `AsyncMysqlQueryException` for querying issues. - -Note that you can explicitly construct one by creating an object like `new AsyncMysqlException(AsyncMysqlErrorResult $result)`. But this is not normally done. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - "thisIsNotThePassword", - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = null; - try { - $conn = await connect($pool); - $result = await $conn->query( - 'SELECT name FROM test_table WHERE userID = 1', - ); - $conn->close(); - return $result->vectorRows()[0][0]; - } catch (\AsyncMysqlConnectException $ex) { // implicitly constructed - return "Connection Exception"; - } catch (\AsyncMysqlQueryException $ex) { // implicitly constructed - return "Query Exception"; - } catch (\AsyncMysqlException $ex) { - return null; - } finally { - if ($conn) { - $conn->close(); - } - } -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -string(20) "Connection Exception" -```.example.hhvm.out -string(20) "Connection Exception" -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlException/failed.md b/api-examples/class.AsyncMysqlException/failed.md deleted file mode 100644 index 64d678565..000000000 --- a/api-examples/class.AsyncMysqlException/failed.md +++ /dev/null @@ -1,56 +0,0 @@ -The following example shows how to use `AsyncMysqlException::failed` to determine if the connection failed in some other way than a timeout. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - "thisIsNotThePassword", - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = null; - $ret = null; - try { - $conn = await connect($pool); - $result = await $conn->query( - 'SELECT name FROM test_table WHERE userID = 1', - ); - $conn->close(); - return $result->vectorRows()[0][0]; - } catch (\AsyncMysqlConnectException $ex) { // implicitly constructed - $ret = "Connection Exception"; - \var_dump($ex->failed()); - } catch (\AsyncMysqlQueryException $ex) { // implicitly constructed - $ret = "Query Exception"; - } catch (\AsyncMysqlException $ex) { - $ret = null; - } finally { - if ($conn) { - $conn->close(); - } - } - return $ret; -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -bool(true) -string(20) "Connection Exception" -```.example.hhvm.out -bool(true) -string(20) "Connection Exception" -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlException/getResult.md b/api-examples/class.AsyncMysqlException/getResult.md deleted file mode 100644 index 23a6eb0a6..000000000 --- a/api-examples/class.AsyncMysqlException/getResult.md +++ /dev/null @@ -1,56 +0,0 @@ -The following example shows how to use `AsyncMysqlException::getResult` to get the `AsyncMysqlErrorResult` object associated with this exception. Particularly, we call `elapsedMicros()` on that object. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - "thisIsNotThePassword", - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = null; - $ret = null; - try { - $conn = await connect($pool); - $result = await $conn->query( - 'SELECT name FROM test_table WHERE userID = 1', - ); - $conn->close(); - return $result->vectorRows()[0][0]; - } catch (\AsyncMysqlConnectException $ex) { // implicitly constructed - $ret = "Connection Exception"; - \var_dump($ex->getResult()->elapsedMicros()); - } catch (\AsyncMysqlQueryException $ex) { // implicitly constructed - $ret = "Query Exception"; - } catch (\AsyncMysqlException $ex) { - $ret = null; - } finally { - if ($conn) { - $conn->close(); - } - } - return $ret; -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -string(20) "Connection Exception" -```.example.hhvm.out -int(4710) -string(20) "Connection Exception" -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlException/mysqlErrorCode.md b/api-examples/class.AsyncMysqlException/mysqlErrorCode.md deleted file mode 100644 index eb6e38c18..000000000 --- a/api-examples/class.AsyncMysqlException/mysqlErrorCode.md +++ /dev/null @@ -1,56 +0,0 @@ -The following example shows how to use `AsyncMysqlException::mysqlErrorCode` to get the raw MySQL error code associated with this exception. The most likely error code for this example will be `1045` for access denied. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - "thisIsNotThePassword", - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = null; - $ret = null; - try { - $conn = await connect($pool); - $result = await $conn->query( - 'SELECT name FROM test_table WHERE userID = 1', - ); - $conn->close(); - return $result->vectorRows()[0][0]; - } catch (\AsyncMysqlConnectException $ex) { // implicitly constructed - $ret = "Connection Exception"; - \var_dump($ex->mysqlErrorCode()); - } catch (\AsyncMysqlQueryException $ex) { // implicitly constructed - $ret = "Query Exception"; - } catch (\AsyncMysqlException $ex) { - $ret = null; - } finally { - if ($conn) { - $conn->close(); - } - } - return $ret; -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -string(20) "Connection Exception" -```.example.hhvm.out -int(1045) -string(20) "Connection Exception" -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlException/mysqlErrorString.md b/api-examples/class.AsyncMysqlException/mysqlErrorString.md deleted file mode 100644 index 3d9d6059b..000000000 --- a/api-examples/class.AsyncMysqlException/mysqlErrorString.md +++ /dev/null @@ -1,60 +0,0 @@ -The following example shows how to use `AsyncMysqlException::mysqlErrorString` to get the raw MySQL error string associated with this exception. For this example, the most likely exception string will be something like: - -``` -Access denied for user 'testuser'@'localhost' (using password: YES) -``` - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - "thisIsNotThePassword", - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = null; - $ret = null; - try { - $conn = await connect($pool); - $result = await $conn->query( - 'SELECT name FROM test_table WHERE userID = 1', - ); - $conn->close(); - return $result->vectorRows()[0][0]; - } catch (\AsyncMysqlConnectException $ex) { // implicitly constructed - $ret = "Connection Exception"; - \var_dump($ex->mysqlErrorString()); - } catch (\AsyncMysqlQueryException $ex) { // implicitly constructed - $ret = "Query Exception"; - } catch (\AsyncMysqlException $ex) { - $ret = null; - } finally { - if ($conn) { - $conn->close(); - } - } - return $ret; -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -string(%d) "%s" -string(20) "Connection Exception" -```.example.hhvm.out -string(67) "Access denied for user 'testuser'@'localhost' (using password: YES)" -string(20) "Connection Exception" -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlException/timedOut.md b/api-examples/class.AsyncMysqlException/timedOut.md deleted file mode 100644 index 205dcd424..000000000 --- a/api-examples/class.AsyncMysqlException/timedOut.md +++ /dev/null @@ -1,56 +0,0 @@ -The following example shows how to use `AsyncMysqlException::timedOut` to determine if the connection failed by a timeout. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - "thisIsNotThePassword", - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = null; - $ret = null; - try { - $conn = await connect($pool); - $result = await $conn->query( - 'SELECT name FROM test_table WHERE userID = 1', - ); - $conn->close(); - return $result->vectorRows()[0][0]; - } catch (\AsyncMysqlConnectException $ex) { // implicitly constructed - $ret = "Connection Exception"; - \var_dump($ex->timedOut()); - } catch (\AsyncMysqlQueryException $ex) { // implicitly constructed - $ret = "Query Exception"; - } catch (\AsyncMysqlException $ex) { - $ret = null; - } finally { - if ($conn) { - $conn->close(); - } - } - return $ret; -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -bool(false) -string(20) "Connection Exception" -```.example.hhvm.out -bool(false) -string(20) "Connection Exception" -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlQueryErrorResult/getSuccessfulResults.md b/api-examples/class.AsyncMysqlQueryErrorResult/getSuccessfulResults.md deleted file mode 100644 index f1b7d13c6..000000000 --- a/api-examples/class.AsyncMysqlQueryErrorResult/getSuccessfulResults.md +++ /dev/null @@ -1,62 +0,0 @@ -This example shows how we can get the successful results of a multi-query, even though one of those queries gave us an error (which we caught in the exception). This is done via `AsyncMysqlQueryErrorResult::getSuccessfulResults`. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function multi_query_error(): Awaitable { - $queries = Vector { - 'SELECT name FROM test_table WHERE userID = 1', - 'SELECT age, email FROM test_table WHERE userID = 2', - 'SELECT bogus FROM bogus WHERE bogus = 1', - }; - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - try { - $result = await $conn->multiQuery($queries); - } catch (\AsyncMysqlQueryException $ex) { - $qr = $ex->getResult(); - \var_dump($qr is \AsyncMysqlQueryErrorResult); - // Constructor to the exception takes AsyncMysqlErrorResult, need to - // ensure typechecker that we have an AsyncMysqlQueryErrorResult - invariant($qr is \AsyncMysqlQueryErrorResult, "Bad news if not"); - $rows = 0; - // Ok, we had an error in our multiquery, but maybe we had some - // successful results in some of the queries. - if (\array_key_exists(0, $qr->getSuccessfulResults())) { - $rows = $qr->getSuccessfulResults()[0]->numRows(); - } - \var_dump($rows); - $conn->close(); - return null; - } - $conn->close(); - return $result->numRows(); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await multi_query_error(); - \var_dump($r); -} -```.hhvm.expectf -bool(true) -int(%d) -NULL -```.example.hhvm.out -bool(true) -int(1) -NULL -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlQueryErrorResult/numSuccessfulQueries.md b/api-examples/class.AsyncMysqlQueryErrorResult/numSuccessfulQueries.md deleted file mode 100644 index faff21752..000000000 --- a/api-examples/class.AsyncMysqlQueryErrorResult/numSuccessfulQueries.md +++ /dev/null @@ -1,56 +0,0 @@ -This example shows how we can get the number of successful queries of a multi-query, even though one of those queries gave us an error (which we caught in the exception). This is done via `AsyncMysqlQueryErrorResult::numSuccessfulQueries`. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function multi_query_error(): Awaitable { - $queries = Vector { - 'SELECT name FROM test_table WHERE userID = 1', - 'SELECT age, email FROM test_table WHERE userID = 2', - 'SELECT bogus FROM bogus WHERE bogus = 1', - }; - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - try { - $result = await $conn->multiQuery($queries); - } catch (\AsyncMysqlQueryException $ex) { - $qr = $ex->getResult(); - \var_dump($qr is \AsyncMysqlQueryErrorResult); - // Constructor to the exception takes AsyncMysqlErrorResult, need to - // ensure typechecker that we have an AsyncMysqlQueryErrorResult - invariant($qr is \AsyncMysqlQueryErrorResult, "Bad news if not"); - \var_dump($qr->numSuccessfulQueries()); - $conn->close(); - return null; - } - $conn->close(); - return $result->numRows(); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await multi_query_error(); - \var_dump($r); -} -```.hhvm.expectf -bool(true) -int(%d) -NULL -```.example.hhvm.out -bool(true) -int(2) -NULL -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlQueryResult/clientStats.md b/api-examples/class.AsyncMysqlQueryResult/clientStats.md deleted file mode 100644 index 33b065e40..000000000 --- a/api-examples/class.AsyncMysqlQueryResult/clientStats.md +++ /dev/null @@ -1,39 +0,0 @@ -You can get some statistical information from the MySQL client when you get an `AsyncMysqlQueryResult` via the `clientStats()` method. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT name FROM test_table WHERE userID = 1'); - \var_dump($result->clientStats()->callbackDelayMicrosAvg()); - $conn->close(); - return $result->numRows(); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -float(%f) -int(%d) -```.example.hhvm.out -float(21.760009765625) -int(1) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlQueryResult/elapsedMicros.md b/api-examples/class.AsyncMysqlQueryResult/elapsedMicros.md deleted file mode 100644 index 5c740280c..000000000 --- a/api-examples/class.AsyncMysqlQueryResult/elapsedMicros.md +++ /dev/null @@ -1,46 +0,0 @@ -Every successful query has a result. And one of the methods on an `AsyncMysqlQueryResult` is `elapsedMicros()`, which tells you how long it took to perform the query and get the result. - -Note that - -``` - elapsedMicros() ~== endTime() - startTime() -``` - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT name FROM test_table WHERE userID = 1'); - // How long did it take to get this result? - \var_dump($result->elapsedMicros()); - $conn->close(); - return $result->numRows(); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -int(%d) -```.example.hhvm.out -int(286) -int(1) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlQueryResult/endTime.md b/api-examples/class.AsyncMysqlQueryResult/endTime.md deleted file mode 100644 index b075acdf3..000000000 --- a/api-examples/class.AsyncMysqlQueryResult/endTime.md +++ /dev/null @@ -1,46 +0,0 @@ -Every successful query has a result. And one of the methods on an `AsyncMysqlQueryResult` is `endTime()`, which tells you the time when we finally got our result. - -Note that - -``` - elapsedMicros() ~== endTime() - startTime() -``` - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT name FROM test_table WHERE userID = 1'); - // What time was it when we finally got this result? - \var_dump($result->endTime()); - $conn->close(); - return $result->numRows(); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -float(%f) -int(%d) -```.example.hhvm.out -float(17309.077334) -int(1) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlQueryResult/lastInsertId.md b/api-examples/class.AsyncMysqlQueryResult/lastInsertId.md deleted file mode 100644 index da6796e18..000000000 --- a/api-examples/class.AsyncMysqlQueryResult/lastInsertId.md +++ /dev/null @@ -1,55 +0,0 @@ -This example shows how to use the `AsyncMysqlQueryResult::lastInsertId` method to get the last primary id inserted into a table, if one exists. This will return `0` if your query did not actually insert an id, for example in a `SELECT` statement. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $id = \rand(100, 60000); // userID is a SMALLINT - $name = \str_shuffle("ABCDEFGHIJ"); - $query = 'INSERT INTO test_table (userID, name) VALUES ('. - $id. - ', "'. - $name. - '")'; - try { - $result = await $conn->query($query); - // What was the last primary id we inserted into the table? - \var_dump($result->lastInsertId()); - } catch (\AsyncMysqlQueryException $ex) { - // this could happen if we try to insert duplicate user id - // But to keep test output consistent, just var dump a positive number - \var_dump(\PHP_INT_MAX); - $conn->close(); - return 0; - } - $conn->close(); - return $result->numRows(); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -int(%d) -```.example.hhvm.out -int(21301) -int(0) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlQueryResult/mapRows.md b/api-examples/class.AsyncMysqlQueryResult/mapRows.md deleted file mode 100644 index 00f2067db..000000000 --- a/api-examples/class.AsyncMysqlQueryResult/mapRows.md +++ /dev/null @@ -1,56 +0,0 @@ -When executing a query, you can get the rows returned from it in the form of a `Vector` of `Map` objects, where each key of the `Map` is a column name. This example shows how to use `AsyncMysqlQueryResult::mapRows` to get that `Map`. A resulting `Map` may look like: - -``` -object(HH\Vector)#9 (2) { - [0]=> - object(HH\Map)#10 (1) { - ["name"]=> - string(11) "Joel Marcey" - } - [1]=> - object(HH\Map)#11 (1) { - ["name"]=> - string(11) "Fred Emmott" - } -} -``` - -Note that all values in the `Map` returned from `mapRows` will be `string` or `null`. If you want specifically-typed values, use `mapRowsTyped` - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT name FROM test_table WHERE userID < 50'); - \var_dump($result->mapRows()->count() === $result->numRows()); - $conn->close(); - return $result->numRows(); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -bool(true) -int(%d) -```.example.hhvm.out -bool(true) -int(1) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlQueryResult/mapRowsTyped.md b/api-examples/class.AsyncMysqlQueryResult/mapRowsTyped.md deleted file mode 100644 index 58390c87f..000000000 --- a/api-examples/class.AsyncMysqlQueryResult/mapRowsTyped.md +++ /dev/null @@ -1,62 +0,0 @@ -When executing a query, you can get the rows returned from it in the form of a `Vector` of `Map` objects, where each key of the `Map` is a column name. This example shows how to use `AsyncMysqlQueryResult::mapRowsTyped` to get that `Map`. A resulting `Map` may look like: - -``` -object(HH\Vector)#9 (2) { - [0]=> - object(HH\Map)#10 (2) { - ["name"]=> - string(11) "Joel Marcey" - ["age"]=> - int(41) - } - [1]=> - object(HH\Map)#11 (2) { - ["name"]=> - string(11) "Fred Emmott" - ["age"]=> - int(26) - } -} -``` - -Note that all values in the `Map` returned from `mapRowsTyped` will be the actual typed representation of the database type, or `null`. Above you can see we have `string` and `int`. If you want just `string` values for everything, use `mapRows` - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query( - 'SELECT name, age FROM test_table WHERE userID < 50', - ); - \var_dump($result->mapRowsTyped()->count() === $result->numRows()); - $conn->close(); - return $result->numRows(); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -bool(true) -int(%d) -```.example.hhvm.out -bool(true) -int(1) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlQueryResult/numRows.md b/api-examples/class.AsyncMysqlQueryResult/numRows.md deleted file mode 100644 index d8cdc044c..000000000 --- a/api-examples/class.AsyncMysqlQueryResult/numRows.md +++ /dev/null @@ -1,37 +0,0 @@ -This example shows how to determine the number of rows returned from a given query using `AsyncMysqlQueryResult::numRows`. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT name FROM test_table WHERE userID < 50'); - $conn->close(); - // How many rows did this query return? - return $result->numRows(); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(1) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlQueryResult/numRowsAffected.md b/api-examples/class.AsyncMysqlQueryResult/numRowsAffected.md deleted file mode 100644 index 92b8bb371..000000000 --- a/api-examples/class.AsyncMysqlQueryResult/numRowsAffected.md +++ /dev/null @@ -1,55 +0,0 @@ -This example shows how to determine the number of rows affected by a given query using `AsyncMysqlQueryResult::numRowsAffected`. This is especially useful on an `INSERT` query or similar, where you won't get any rows back in your result, but you want to make sure your query did what it was supposed to do. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $id = \rand(100, 60000); // userID is a SMALLINT - $name = \str_shuffle("ABCDEFGHIJ"); - $query = 'INSERT INTO test_table (userID, name) VALUES ('. - $id. - ', "'. - $name. - '")'; - try { - $result = await $conn->query($query); - // How many rows were affected? Should be 1. - \var_dump($result->numRowsAffected()); - } catch (\AsyncMysqlQueryException $ex) { - // this could happen if we try to insert duplicate user id - // But to keep test output consistent, just var dump a positive number - \var_dump(\PHP_INT_MAX); - $conn->close(); - return 0; - } - $conn->close(); - return $result->numRows(); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -int(0) -```.example.hhvm.out -int(1) -int(0) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlQueryResult/rowBlocks.md b/api-examples/class.AsyncMysqlQueryResult/rowBlocks.md deleted file mode 100644 index 24558c5fb..000000000 --- a/api-examples/class.AsyncMysqlQueryResult/rowBlocks.md +++ /dev/null @@ -1,67 +0,0 @@ -The following example shows how a call to `AsyncMysqlQueryResult::rowBlocks` gets you a `Vector` of `AsyncMysqlRowBlock` objects. Each object can then be queried for statistical data on that row, such as the number of fields that came back with the result, etc. - -**NOTE**: A call to `rowBlocks()` actually pops the first element of that `Vector`. So, for example, if you have the following: - -``` -object(HH\Vector)#9 (1) { - [0]=> - object(AsyncMysqlRowBlock)#10 (0) { - } -} -``` - -a call to `rowBlocks()` will make it so that you know have: - -``` -object(HH\Vector)#9 (0) { -} -``` - -and thus a subsequent call to `rowBlocks()` will return an empty `Vector`. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT * FROM test_table WHERE userID < 50'); - // A call to $result->rowBlocks() actually pops the first element of the - // row block Vector. So it mutates it. - $row_blocks = $result->rowBlocks(); - if ($row_blocks->count() > 0) { - // An AsyncMysqlRowBlock - $row_block = $row_blocks[0]; - \var_dump($row_block->fieldName(2)); // string - } else { - \var_dump('nothing'); - } - $conn->close(); - return $result->numRows(); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -string(%d) "%s" -int(%d) -```.example.hhvm.out -string(3) "age" -int(1) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlQueryResult/startTime.md b/api-examples/class.AsyncMysqlQueryResult/startTime.md deleted file mode 100644 index 9ff8e3edf..000000000 --- a/api-examples/class.AsyncMysqlQueryResult/startTime.md +++ /dev/null @@ -1,46 +0,0 @@ -Every successful query has a result. And one of the methods on an `AsyncMysqlQueryResult` is `startTime()`, which tells you the time when we started to get our result. - -Note that - -``` - elapsedMicros() ~== endTime() - startTime() -``` - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT name FROM test_table WHERE userID = 1'); - // What time was it when we started to get this result? - \var_dump($result->startTime()); - $conn->close(); - return $result->numRows(); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -float(%f) -int(%d) -```.example.hhvm.out -float(17311.243147) -int(1) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlQueryResult/vectorRows.md b/api-examples/class.AsyncMysqlQueryResult/vectorRows.md deleted file mode 100644 index 43756ef37..000000000 --- a/api-examples/class.AsyncMysqlQueryResult/vectorRows.md +++ /dev/null @@ -1,58 +0,0 @@ -When executing a query, you can get the rows returned from it in the form of a `Vector` of `Vector` objects, where each value of the `Vector` is a column value. This example shows how to use `AsyncMysqlQueryResult::vectorRows` to get that `Vector`. A resulting `Vector` may look like: - -``` -object(HH\Vector)#9 (2) { - [0]=> - object(HH\Vector)#10 (1) { - [0]=> - string(11) "Joel Marcey" - } - [1]=> - object(HH\Vector)#11 (1) { - [0]=> - string(11) "Fred Emmott" - } -} -``` - -Note that all values in the `Vector` returned from `vectorRows` will be `string` or `null`. If you want specifically-typed values, use `vectorRowsTyped`. - -Also understand that if you want the actual column names associated with the values in the `Vector`, you should use `mapRows` instead. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT name FROM test_table WHERE userID < 50'); - \var_dump($result->vectorRows()->count() === $result->numRows()); - $conn->close(); - return $result->numRows(); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -bool(true) -int(%d) -```.example.hhvm.out -bool(true) -int(1) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlQueryResult/vectorRowsTyped.md b/api-examples/class.AsyncMysqlQueryResult/vectorRowsTyped.md deleted file mode 100644 index dcdb5ac72..000000000 --- a/api-examples/class.AsyncMysqlQueryResult/vectorRowsTyped.md +++ /dev/null @@ -1,64 +0,0 @@ -When executing a query, you can get the rows returned from it in the form of a `Vector` of `Vector` objects, where each value of the `Vector` is a column value. This example shows how to use `AsyncMysqlQueryResult::vectorRowsTyped` to get that `Vector`. A resulting `Vector` may look like: - -``` -object(HH\Vector)#9 (2) { - [0]=> - object(HH\Vector)#10 (2) { - [0]=> - string(11) "Joel Marcey" - [1]=> - int(41) - } - [1]=> - object(HH\Vector)#11 (2) { - [0]=> - string(11) "Fred Emmott" - [1]=> - int(26) - } -} -``` - -Note that all values in the `Vector` returned from `vectorRowsTyped` will be the actual typed representation of the database type, or `null`. Above you can see we have `string` and `int`. If you want just `string` values for everything, use `vectorRows` - -Also understand that if you want the actual column names associated with the values in the `Vector`, you should use `mapRowsTyped` instead. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query( - 'SELECT name, age FROM test_table WHERE userID < 50', - ); - \var_dump($result->vectorRowsTyped()->count() === $result->numRows()); - $conn->close(); - return $result->numRows(); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -bool(true) -int(%d) -```.example.hhvm.out -bool(true) -int(1) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlResult/clientStats.md b/api-examples/class.AsyncMysqlResult/clientStats.md deleted file mode 100644 index 2c7bcf06d..000000000 --- a/api-examples/class.AsyncMysqlResult/clientStats.md +++ /dev/null @@ -1,14 +0,0 @@ -AsyncMysqlResult is abstract. See specific, concrete classes for examples of `AsyncMysqlResult::clientStats` (e.g., AsyncMysqlConnectResult, AsyncMysqlErrorResult) - -```basic-usage.hack -echo "AsyncMysqlResult is abstract. See specific, concrete classes for ". - "examples of clientStats (e.g., AsyncMysqlConnectResult, ". - "AsyncMysqlErrorResult)". - \PHP_EOL; -```.hhvm.expectf -AsyncMysqlResult is abstract. See specific, concrete classes for examples of clientStats (e.g., AsyncMysqlConnectResult, AsyncMysqlErrorResult) -```.example.hhvm.out -AsyncMysqlResult is abstract. See specific, concrete classes for examples of clientStats (e.g., AsyncMysqlConnectResult, AsyncMysqlErrorResult) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlResult/elapsedMicros.md b/api-examples/class.AsyncMysqlResult/elapsedMicros.md deleted file mode 100644 index a81010e34..000000000 --- a/api-examples/class.AsyncMysqlResult/elapsedMicros.md +++ /dev/null @@ -1 +0,0 @@ -AsyncMysqlResult is abstract. See specific, concrete classes for examples of `AsyncMysqlResult::elapsedMicros` (e.g., AsyncMysqlConnectResult, AsyncMysqlErrorResult) diff --git a/api-examples/class.AsyncMysqlResult/endTime.md b/api-examples/class.AsyncMysqlResult/endTime.md deleted file mode 100644 index 2bc957d25..000000000 --- a/api-examples/class.AsyncMysqlResult/endTime.md +++ /dev/null @@ -1 +0,0 @@ -AsyncMysqlResult is abstract. See specific, concrete classes for examples of `AsyncMysqlResult::endTime` (e.g., AsyncMysqlConnectResult, AsyncMysqlErrorResult) diff --git a/api-examples/class.AsyncMysqlResult/startTime.md b/api-examples/class.AsyncMysqlResult/startTime.md deleted file mode 100644 index fa3110356..000000000 --- a/api-examples/class.AsyncMysqlResult/startTime.md +++ /dev/null @@ -1 +0,0 @@ -AsyncMysqlResult is abstract. See specific, concrete classes for examples of `AsyncMysqlResult::startTime` (e.g., AsyncMysqlConnectResult, AsyncMysqlErrorResult) diff --git a/api-examples/class.AsyncMysqlRow/at.md b/api-examples/class.AsyncMysqlRow/at.md deleted file mode 100644 index 0ad2a870d..000000000 --- a/api-examples/class.AsyncMysqlRow/at.md +++ /dev/null @@ -1,50 +0,0 @@ -The following example shows how to use `AsyncMysqlRow::at` to get a field value from the resulting row block. In this case, we get a `Vector` of `AsyncMysqlRowBlock`s, then the first row block in that `Vector`, then the first `AsyncMysqlRow` in that row block. Finally, we get the value of the `age` field in that row. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT * FROM test_table WHERE userID < 50'); - $conn->close(); - // A call to $result->rowBlocks() actually pops the first element of the - // row block Vector. So the call actually mutates the Vector. - $row_blocks = $result->rowBlocks(); - if (!$row_blocks->isEmpty()) { - // An AsyncMysqlRowBlock - $row_block = $row_blocks[0]; - if (!$row_block->isEmpty()) { - // An AsyncMysqlRow - $row = $row_block->getRow(0); - return (int)$row->at("age"); - } - return -1; - } else { - return -1; - } -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(42) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlRow/count.md b/api-examples/class.AsyncMysqlRow/count.md deleted file mode 100644 index 3744ae1a2..000000000 --- a/api-examples/class.AsyncMysqlRow/count.md +++ /dev/null @@ -1,50 +0,0 @@ -The following example shows how to use `AsyncMysqlRow:count` to get the number of fields in the given row. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT * FROM test_table WHERE userID < 50'); - $conn->close(); - // A call to $result->rowBlocks() actually pops the first element of the - // row block Vector. So the call actually mutates the Vector. - $row_blocks = $result->rowBlocks(); - if (!$row_blocks->isEmpty()) { - // An AsyncMysqlRowBlock - $row_block = $row_blocks[0]; - if (!$row_block->isEmpty()) { - // An AsyncMysqlRow - $row = $row_block->getRow(0); - return $row->count(); // int - } - return -1; - } else { - return -1; - } -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(4) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlRow/fieldType.md b/api-examples/class.AsyncMysqlRow/fieldType.md deleted file mode 100644 index 02e29d531..000000000 --- a/api-examples/class.AsyncMysqlRow/fieldType.md +++ /dev/null @@ -1,92 +0,0 @@ -The following example shows how to use `AsyncMysqlRow::fieldType` to get the data type of the `email` field. Here are the available data types: - -Type Value | Type Description | Int Value ----------- | ---------------- | --------- -MYSQL_TYPE_DECIMAL | DECIMAL or NUMERIC field | 0 -MYSQL_TYPE_TINY | TINYINT field | 1 -MYSQL_TYPE_SHORT | SMALLINT field | 2 -MYSQL_TYPE_LONG | INTEGER field | 3 -MYSQL_TYPE_FLOAT | FLOAT field | 4 -MYSQL_TYPE_DOUBLE | DOUBLE or REAL field | 5 -MYSQL_TYPE_NULL | NULL-type field | 6 -MYSQL_TYPE_TIMESTAMP | TIMESTAMP field | 7 -MYSQL_TYPE_LONGLONG | BIGINT field | 8 -MYSQL_TYPE_INT24 | MEDIUMINT field | 9 -MYSQL_TYPE_DATE | DATE field | 10 -MYSQL_TYPE_TIME | TIME field | 11 -MYSQL_TYPE_DATETIME | DATETIME field | 12 -MYSQL_TYPE_YEAR | YEAR field | 13 -MYSQL_TYPE_BIT | BIT field (MySQL 5.0.3 and up) | 16 -MYSQL_TYPE_NEWDECIMAL | Precision math DECIMAL or NUMERIC field (MySQL 5.0.3 and up) | 246 -MYSQL_TYPE_ENUM | ENUM field | 247 -MYSQL_TYPE_SET | SET field | 248 -MYSQL_TYPE_BLOB | BLOB or TEXT field (use max_length to determine the maximum length) | 252 -MYSQL_TYPE_VAR_STRING | VARCHAR or VARBINARY field | 253 -MYSQL_TYPE_STRING | CHAR or BINARY field | 254 -MYSQL_TYPE_GEOMETRY | Spatial field | 255 - - -See: [http://mflib.org/mysql/include/mysql_com.h](http://mflib.org/mysql/include/mysql_com.h) and [https://dev.mysql.com/doc/refman/5.0/en/c-api-data-structures.html](https://dev.mysql.com/doc/refman/5.0/en/c-api-data-structures.html). - -This is an example of what could have been used to create the table from where we are getting our field flags - -``` -CREATE TABLE test_table ( -userID SMALLINT UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT, -name VARCHAR(40) NOT NULL, -age SMALLINT NULL, -email VARCHAR(60) NULL, -PRIMARY KEY (userID) -); -``` - -So, in our example, 253 would be returned for the `email` field. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT * FROM test_table WHERE userID < 50'); - $conn->close(); - // A call to $result->rowBlocks() actually pops the first element of the - // row block Vector. So the call actually mutates the Vector. - $row_blocks = $result->rowBlocks(); - if (!$row_blocks->isEmpty()) { - // An AsyncMysqlRowBlock - $row_block = $row_blocks[0]; - if (!$row_block->isEmpty()) { - // An AsyncMysqlRow - $row = $row_block->getRow(0); - return $row->fieldType('email'); // int - } - return -1; - } else { - return -1; - } -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(253) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlRow/getFieldAsDouble.md b/api-examples/class.AsyncMysqlRow/getFieldAsDouble.md deleted file mode 100644 index 80ab473df..000000000 --- a/api-examples/class.AsyncMysqlRow/getFieldAsDouble.md +++ /dev/null @@ -1,62 +0,0 @@ -The following example shows how to get a field value as a `float` value via `AsyncMysqlRow::getFieldAsDouble`. Assume this was the SQL used to create the example table: - -``` -CREATE TABLE test_table ( -userID SMALLINT UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT, -name VARCHAR(40) NOT NULL, -age SMALLINT NULL, -email VARCHAR(60) NULL, -PRIMARY KEY (userID) -); -``` - -In this case, we are actually getting a field that is an `int` (or `SMALLINT`). But there is an automatic conversion to a `float`. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT * FROM test_table WHERE userID < 50'); - $conn->close(); - // A call to $result->rowBlocks() actually pops the first element of the - // row block Vector. So the call actually mutates the Vector. - $row_blocks = $result->rowBlocks(); - if (!$row_blocks->isEmpty()) { - // An AsyncMysqlRowBlock - $row_block = $row_blocks[0]; - if (!$row_block->isEmpty()) { - // An AsyncMysqlRow - $row = $row_block->getRow(0); - return $row->getFieldAsDouble('age'); // age int coerced to float - } - return -1.0; - } else { - return -1.0; - } -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -float(%f) -```.example.hhvm.out -float(42) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlRow/getFieldAsInt.md b/api-examples/class.AsyncMysqlRow/getFieldAsInt.md deleted file mode 100644 index 8007512da..000000000 --- a/api-examples/class.AsyncMysqlRow/getFieldAsInt.md +++ /dev/null @@ -1,62 +0,0 @@ -The following example shows how to get a field value as an `int` value via `AsyncMysqlRow::getFieldAsInt`. Assume this was the SQL used to create the example table: - -``` -CREATE TABLE test_table ( -userID SMALLINT UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT, -name VARCHAR(40) NOT NULL, -age SMALLINT NULL, -email VARCHAR(60) NULL, -PRIMARY KEY (userID) -); -``` - -In this case, we are actually getting a field that is an `int` (or `SMALLINT`). - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT * FROM test_table WHERE userID < 50'); - $conn->close(); - // A call to $result->rowBlocks() actually pops the first element of the - // row block Vector. So the call actually mutates the Vector. - $row_blocks = $result->rowBlocks(); - if (!$row_blocks->isEmpty()) { - // An AsyncMysqlRowBlock - $row_block = $row_blocks[0]; - if (!$row_block->isEmpty()) { - // An AsyncMysqlRow - $row = $row_block->getRow(0); - return $row->getFieldAsInt('age'); // int - } - return -1; - } else { - return -1; - } -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(42) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlRow/getFieldAsString.md b/api-examples/class.AsyncMysqlRow/getFieldAsString.md deleted file mode 100644 index 9bd80c84e..000000000 --- a/api-examples/class.AsyncMysqlRow/getFieldAsString.md +++ /dev/null @@ -1,62 +0,0 @@ -The following example shows how to get a field value as an `string` value via `AsyncMysqlRow::getFieldAsString`. Assume this was the SQL used to create the example table: - -``` -CREATE TABLE test_table ( -userID SMALLINT UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT, -name VARCHAR(40) NOT NULL, -age SMALLINT NULL, -email VARCHAR(60) NULL, -PRIMARY KEY (userID) -); -``` - -In this case, we are actually getting a field that is a `string` (or `VARCHAR`). - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT * FROM test_table WHERE userID < 50'); - $conn->close(); - // A call to $result->rowBlocks() actually pops the first element of the - // row block Vector. So the call actually mutates the Vector. - $row_blocks = $result->rowBlocks(); - if (!$row_blocks->isEmpty()) { - // An AsyncMysqlRowBlock - $row_block = $row_blocks[0]; - if (!$row_block->isEmpty()) { - // An AsyncMysqlRow - $row = $row_block->getRow(0); - return $row->getFieldAsString('name'); // string - } - return ""; - } else { - return ""; - } -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -string(%d) "%s" -```.example.hhvm.out -string(3) "Jan" -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlRow/getIterator.md b/api-examples/class.AsyncMysqlRow/getIterator.md deleted file mode 100644 index 6704332a2..000000000 --- a/api-examples/class.AsyncMysqlRow/getIterator.md +++ /dev/null @@ -1,58 +0,0 @@ -The following example shows you how to get an iterator of an `AsyncMysqlRow` via `getIterator()`. Getting an iterator of an `AsyncMysqlRow` gives you an `AsyncMysqlRowIterator`, where each key of that iterator is an `int` representing the key to the field of the `AsyncMysqlRow`, and each value from `current()` is the value of the field of that `AsyncMysqlRow`. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function iterate(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT * FROM test_table WHERE userID < 50'); - $conn->close(); - // A call to $result->rowBlocks() actually pops the first element of the - // row block Vector. So the call actually mutates the Vector. - $row_blocks = $result->rowBlocks(); - if (!$row_blocks->isEmpty()) { - // An AsyncMysqlRowBlock - $row_block = $row_blocks[0]; - if (!$row_block->isEmpty()) { - // An AsyncMysqlRow - $row = $row_block->getRow(0); - // An AsyncMysqlRowIterator - $it = $row->getIterator(); - while ($it->valid()) { - // current() will give you a string value of the field in the row - if ($it->key() > 0 && \is_numeric($it->current())) { - return \intval($it->current()); - } - $it->next(); - } - } - return -1; - } else { - return -1; - } -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await iterate(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(42) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlRow/isNull.md b/api-examples/class.AsyncMysqlRow/isNull.md deleted file mode 100644 index c449ff432..000000000 --- a/api-examples/class.AsyncMysqlRow/isNull.md +++ /dev/null @@ -1,53 +0,0 @@ -The following example uses `AsyncMysqlRow::isNull` to check if a field value is `null` (e.g., if a field was set in SQL to something like `age SMALLINT NULL`, then that field *could* be `null`). - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT * FROM test_table WHERE userID < 50'); - $conn->close(); - // A call to $result->rowBlocks() actually pops the first element of the - // row block Vector. So the call actually mutates the Vector. - $row_blocks = $result->rowBlocks(); - if (!$row_blocks->isEmpty()) { - // An AsyncMysqlRowBlock - $row_block = $row_blocks[0]; - if (!$row_block->isEmpty()) { - // An AsyncMysqlRow - $row = $row_block->getRow(0); - if (!$row->isNull("age")) { - return $row->getFieldAsInt("age"); - } - return -1; - } - return -1; - } else { - return -1; - } -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(42) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlRowBlock/at.md b/api-examples/class.AsyncMysqlRowBlock/at.md deleted file mode 100644 index 127f0d00f..000000000 --- a/api-examples/class.AsyncMysqlRowBlock/at.md +++ /dev/null @@ -1,45 +0,0 @@ -The following example shows how to use `AsyncMysqlRowBlock::at` to get a field value from the resulting row block. In this case we are looking at the 0th element of the row block and wanting the age field. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT * FROM test_table WHERE userID < 50'); - $conn->close(); - // A call to $result->rowBlocks() actually pops the first element of the - // row block Vector. So the call actually mutates the Vector. - $row_blocks = $result->rowBlocks(); - if ($row_blocks->count() > 0) { - // An AsyncMysqlRowBlock - $row_block = $row_blocks[0]; - return (int)$row_block->at(0, "age"); - } else { - return -1; - } -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(42) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlRowBlock/count.md b/api-examples/class.AsyncMysqlRowBlock/count.md deleted file mode 100644 index 813fdd518..000000000 --- a/api-examples/class.AsyncMysqlRowBlock/count.md +++ /dev/null @@ -1,45 +0,0 @@ -The following example shows how to use `AsyncMysqlRowBlock::count` to get the number of rows in the given row block. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT * FROM test_table WHERE userID < 50'); - $conn->close(); - // A call to $result->rowBlocks() actually pops the first element of the - // row block Vector. So the call actually mutates the Vector. - $row_blocks = $result->rowBlocks(); - if ($row_blocks->count() > 0) { - // An AsyncMysqlRowBlock - $row_block = $row_blocks[0]; - return $row_block->count(); // int - } else { - return -1; - } -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(1) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlRowBlock/fieldFlags.md b/api-examples/class.AsyncMysqlRowBlock/fieldFlags.md deleted file mode 100644 index 60890c366..000000000 --- a/api-examples/class.AsyncMysqlRowBlock/fieldFlags.md +++ /dev/null @@ -1,77 +0,0 @@ -The following example shows how to use `AsyncMysqlRowBlock::fieldFlags` to get the bitwise `OR` combination of the flags that are set for the `userID` field. The flags are as follows: - -Flag Value | Flag Description | Int Value ----------- | ---------------- | --------- -NOT_NULL_FLAG | Field cannot be NULL | 1 -PRI_KEY_FLAG | Field is part of a primary key | 2 -UNIQUE_KEY_FLAG | Field is part of a unique key | 4 -MULTIPLE_KEY_FLAG | Field is part of a nonunique key | 8 -BLOB_FLAG | Field is a BLOB or TEXT (deprecated) | 16 -UNSIGNED_FLAG | Field has the UNSIGNED attribute | 32 -ZEROFILL_FLAG | Field has the ZEROFILL attribute | 64 -BINARY_FLAG | Field has the BINARY attribute | 128 -AUTO_INCREMENT_FLAG | Field has the AUTO_INCREMENT attribute | 256 -ENUM_FLAG | Field is an ENUM | 512 -SET_FLAG | Field is a SET | 1024 -TIMESTAMP_FLAG | Field is a TIMESTAMP (deprecated) | 2048 -NO_DEFAULT_VALUE_FLAG | Field has no default value; see additional notes following table | 4096 -PART_KEY_FLAG | Field is at least part of a key | 16384 -NUM_FLAG | Field is numeric; see additional notes following table | 32768 - -See: [http://mflib.org/mysql/include/mysql_com.h](http://mflib.org/mysql/include/mysql_com.h) - -This is an example of what could have been used to create the table from where we are getting our field flags - -``` -CREATE TABLE test_table ( -userID SMALLINT UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT, -name VARCHAR(40) NOT NULL, -age SMALLINT NULL, -email VARCHAR(60) NULL, -PRIMARY KEY (userID) -); -``` - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT * FROM test_table WHERE userID < 50'); - $conn->close(); - // A call to $result->rowBlocks() actually pops the first element of the - // row block Vector. So the call actually mutates the Vector. - $row_blocks = $result->rowBlocks(); - if ($row_blocks->count() > 0) { - // An AsyncMysqlRowBlock - $row_block = $row_blocks[0]; - return $row_block->fieldFlags('userID'); // int - } else { - return -1; - } -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(49763) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlRowBlock/fieldName.md b/api-examples/class.AsyncMysqlRowBlock/fieldName.md deleted file mode 100644 index 23f98dcd3..000000000 --- a/api-examples/class.AsyncMysqlRowBlock/fieldName.md +++ /dev/null @@ -1,59 +0,0 @@ -The following example shows how to use `AsyncMysqlRowBlock::fieldName` to get the name of a field at a given index in the row block - -This is an example of what could have been used to create the table from where we are getting our field flags - -``` -CREATE TABLE test_table ( -userID SMALLINT UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT, -name VARCHAR(40) NOT NULL, -age SMALLINT NULL, -email VARCHAR(60) NULL, -PRIMARY KEY (userID) -); -``` - -So, in the example, given the table created with the SQL above, the string "age" would be returned (0-indexed). - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT * FROM test_table WHERE userID < 50'); - $conn->close(); - // A call to $result->rowBlocks() actually pops the first element of the - // row block Vector. So the call actually mutates the Vector. - $row_blocks = $result->rowBlocks(); - if ($row_blocks->count() > 0) { - // An AsyncMysqlRowBlock - $row_block = $row_blocks[0]; - return $row_block->fieldName(2); // a string - } else { - return "nothing"; - } -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -string(%d) "%s" -```.example.hhvm.out -string(3) "age" -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlRowBlock/fieldType.md b/api-examples/class.AsyncMysqlRowBlock/fieldType.md deleted file mode 100644 index 2a232b88a..000000000 --- a/api-examples/class.AsyncMysqlRowBlock/fieldType.md +++ /dev/null @@ -1,87 +0,0 @@ -The following example shows how to use `AsyncMysqlRowBlock::fieldType` to get the data type of the `email` field. Here are the available data types: - -Type Value | Type Description | Int Value ----------- | ---------------- | --------- -MYSQL_TYPE_DECIMAL | DECIMAL or NUMERIC field | 0 -MYSQL_TYPE_TINY | TINYINT field | 1 -MYSQL_TYPE_SHORT | SMALLINT field | 2 -MYSQL_TYPE_LONG | INTEGER field | 3 -MYSQL_TYPE_FLOAT | FLOAT field | 4 -MYSQL_TYPE_DOUBLE | DOUBLE or REAL field | 5 -MYSQL_TYPE_NULL | NULL-type field | 6 -MYSQL_TYPE_TIMESTAMP | TIMESTAMP field | 7 -MYSQL_TYPE_LONGLONG | BIGINT field | 8 -MYSQL_TYPE_INT24 | MEDIUMINT field | 9 -MYSQL_TYPE_DATE | DATE field | 10 -MYSQL_TYPE_TIME | TIME field | 11 -MYSQL_TYPE_DATETIME | DATETIME field | 12 -MYSQL_TYPE_YEAR | YEAR field | 13 -MYSQL_TYPE_BIT | BIT field (MySQL 5.0.3 and up) | 16 -MYSQL_TYPE_NEWDECIMAL | Precision math DECIMAL or NUMERIC field (MySQL 5.0.3 and up) | 246 -MYSQL_TYPE_ENUM | ENUM field | 247 -MYSQL_TYPE_SET | SET field | 248 -MYSQL_TYPE_BLOB | BLOB or TEXT field (use max_length to determine the maximum length) | 252 -MYSQL_TYPE_VAR_STRING | VARCHAR or VARBINARY field | 253 -MYSQL_TYPE_STRING | CHAR or BINARY field | 254 -MYSQL_TYPE_GEOMETRY | Spatial field | 255 - - -See: [http://mflib.org/mysql/include/mysql_com.h](http://mflib.org/mysql/include/mysql_com.h) and [https://dev.mysql.com/doc/refman/5.0/en/c-api-data-structures.html](https://dev.mysql.com/doc/refman/5.0/en/c-api-data-structures.html). - -This is an example of what could have been used to create the table from where we are getting our field flags - -``` -CREATE TABLE test_table ( -userID SMALLINT UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT, -name VARCHAR(40) NOT NULL, -age SMALLINT NULL, -email VARCHAR(60) NULL, -PRIMARY KEY (userID) -); -``` - -So, in our example, 253 would be returned for the `email` field. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT * FROM test_table WHERE userID < 50'); - $conn->close(); - // A call to $result->rowBlocks() actually pops the first element of the - // row block Vector. So the call actually mutates the Vector. - $row_blocks = $result->rowBlocks(); - if ($row_blocks->count() > 0) { - // An AsyncMysqlRowBlock - $row_block = $row_blocks[0]; - return $row_block->fieldType('email'); // int - } else { - return -1; - } -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(253) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlRowBlock/fieldsCount.md b/api-examples/class.AsyncMysqlRowBlock/fieldsCount.md deleted file mode 100644 index de42729b6..000000000 --- a/api-examples/class.AsyncMysqlRowBlock/fieldsCount.md +++ /dev/null @@ -1,59 +0,0 @@ -The following example shows how to use `AsyncMysqlRowBlock::fieldsCount` to get the total number of fields represented in the row block - -This is an example of what could have been used to create the table from where we are getting our field flags - -``` -CREATE TABLE test_table ( -userID SMALLINT UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT, -name VARCHAR(40) NOT NULL, -age SMALLINT NULL, -email VARCHAR(60) NULL, -PRIMARY KEY (userID) -); -``` - -So, in the example, given the table created with the SQL above, there are 4 fields. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT * FROM test_table WHERE userID < 50'); - $conn->close(); - // A call to $result->rowBlocks() actually pops the first element of the - // row block Vector. So the call actually mutates the Vector. - $row_blocks = $result->rowBlocks(); - if ($row_blocks->count() > 0) { - // An AsyncMysqlRowBlock - $row_block = $row_blocks[0]; - return $row_block->fieldsCount(); // int - } else { - return -1; - } -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(4) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlRowBlock/getFieldAsDouble.md b/api-examples/class.AsyncMysqlRowBlock/getFieldAsDouble.md deleted file mode 100644 index 557db0c55..000000000 --- a/api-examples/class.AsyncMysqlRowBlock/getFieldAsDouble.md +++ /dev/null @@ -1,57 +0,0 @@ -The following example shows how to get a field value as a `float` value via `AsyncMysqlRowBlock::getFieldAsDouble`. Assume this was the SQL used to create the example table: - -``` -CREATE TABLE test_table ( -userID SMALLINT UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT, -name VARCHAR(40) NOT NULL, -age SMALLINT NULL, -email VARCHAR(60) NULL, -PRIMARY KEY (userID) -); -``` - -In this case, we are actually getting a field that is an `int` (or `SMALLINT`). But there is an automatic conversion to a `float`. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT * FROM test_table WHERE userID < 50'); - $conn->close(); - // A call to $result->rowBlocks() actually pops the first element of the - // row block Vector. So the call actually mutates the Vector. - $row_blocks = $result->rowBlocks(); - if ($row_blocks->count() > 0) { - // An AsyncMysqlRowBlock - $row_block = $row_blocks[0]; - return $row_block->getFieldAsDouble(0, 'age'); // int will be a float value - } else { - return -1.0; - } -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -float(%f) -```.example.hhvm.out -float(42) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlRowBlock/getFieldAsInt.md b/api-examples/class.AsyncMysqlRowBlock/getFieldAsInt.md deleted file mode 100644 index f6dcdf80f..000000000 --- a/api-examples/class.AsyncMysqlRowBlock/getFieldAsInt.md +++ /dev/null @@ -1,57 +0,0 @@ -The following example shows how to get a field value as an `int` value via `AsyncMysqlRowBlock::getFieldAsInt`. Assume this was the SQL used to create the example table: - -``` -CREATE TABLE test_table ( -userID SMALLINT UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT, -name VARCHAR(40) NOT NULL, -age SMALLINT NULL, -email VARCHAR(60) NULL, -PRIMARY KEY (userID) -); -``` - -In this case, we are actually getting a field that is an `int` (or `SMALLINT`). - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT * FROM test_table WHERE userID < 50'); - $conn->close(); - // A call to $result->rowBlocks() actually pops the first element of the - // row block Vector. So the call actually mutates the Vector. - $row_blocks = $result->rowBlocks(); - if ($row_blocks->count() > 0) { - // An AsyncMysqlRowBlock - $row_block = $row_blocks[0]; - return $row_block->getFieldAsInt(0, 'age'); - } else { - return -1; - } -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(42) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlRowBlock/getFieldAsString.md b/api-examples/class.AsyncMysqlRowBlock/getFieldAsString.md deleted file mode 100644 index b1cc8c720..000000000 --- a/api-examples/class.AsyncMysqlRowBlock/getFieldAsString.md +++ /dev/null @@ -1,57 +0,0 @@ -The following example shows how to get a field value as an `string` value via `AsyncMysqlRowBlock::getFieldAsString`. Assume this was the SQL used to create the example table: - -``` -CREATE TABLE test_table ( -userID SMALLINT UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT, -name VARCHAR(40) NOT NULL, -age SMALLINT NULL, -email VARCHAR(60) NULL, -PRIMARY KEY (userID) -); -``` - -In this case, we are actually getting a field that is a `string` (or `VARCHAR`). - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT * FROM test_table WHERE userID < 50'); - $conn->close(); - // A call to $result->rowBlocks() actually pops the first element of the - // row block Vector. So the call actually mutates the Vector. - $row_blocks = $result->rowBlocks(); - if ($row_blocks->count() > 0) { - // An AsyncMysqlRowBlock - $row_block = $row_blocks[0]; - return $row_block->getFieldAsString(0, 'name'); // string - } else { - return "nothing"; - } -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -string(%d) "%s" -```.example.hhvm.out -string(3) "Jan" -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlRowBlock/getIterator.md b/api-examples/class.AsyncMysqlRowBlock/getIterator.md deleted file mode 100644 index 3c1558415..000000000 --- a/api-examples/class.AsyncMysqlRowBlock/getIterator.md +++ /dev/null @@ -1,64 +0,0 @@ -The following example shows you how to get an iterator of an `AsyncMysqlRowBlock` via `getIterator()`. Getting an iterator of an `AsyncMysqlRowBlock` gives you an `AsyncMysqlRowBlockIterator`, where each key of that iterator is an `int` representing the key to an `AsyncMysqlRow` of that row block, and each value from `current()` is the actual `AsyncMysqlRow`. - -And then you can perform operations on that `AsyncMysqlRow`, including get an iterator of that as well. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function iterate(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT * FROM test_table WHERE userID < 50'); - $conn->close(); - // A call to $result->rowBlocks() actually pops the first element of the - // row block Vector. So the call actually mutates the Vector. - $row_blocks = $result->rowBlocks(); - if ($row_blocks->count() > 0) { - // An AsyncMysqlRowBlock - $row_block = $row_blocks[0]; - // An AsyncMysqlRowBlockIterator - $rbit = $row_block->getIterator(); - // Iterating through a row block iterator will have an int key and - // an AsyncMysqlRow as its value - while ($rbit->valid()) { - // current() gets you am AsyncMysqlRow, getIterator() gets you - // an AsyncmysqlRowIterator - $rit = $rbit->current()->getIterator(); - while ($rit->valid()) { - // current() will give you a string value of the field in the row - if ($rit->key() > 0 && \is_numeric($rit->current())) { - return \intval($rit->current()); - } - $rit->next(); - } - $rbit->next(); - } - return -1; - } else { - return -1; - } -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await iterate(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(42) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlRowBlock/getRow.md b/api-examples/class.AsyncMysqlRowBlock/getRow.md deleted file mode 100644 index e47b957a6..000000000 --- a/api-examples/class.AsyncMysqlRowBlock/getRow.md +++ /dev/null @@ -1,47 +0,0 @@ -The following example shows you how to get a row from a row block via `AsyncMysqlRowBlock::getRow`. You pass an `int` specifying the row of the row block you want. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT * FROM test_table WHERE userID < 50'); - $conn->close(); - // A call to $result->rowBlocks() actually pops the first element of the - // row block Vector. So the call actually mutates the Vector. - $row_blocks = $result->rowBlocks(); - if ($row_blocks->count() > 0) { - // An AsyncMysqlRowBlock - $row_block = $row_blocks[0]; - // The next two lines are similar to $row_block->getFieldAsString(0, 'name') - $row = $row_block->getRow(0); // An AsyncMysqlRow - return $row->getFieldAsString('name'); // string - } else { - return "nothing"; - } -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -string(%d) "%s" -```.example.hhvm.out -string(3) "Jan" -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlRowBlock/isEmpty.md b/api-examples/class.AsyncMysqlRowBlock/isEmpty.md deleted file mode 100644 index dcc04381f..000000000 --- a/api-examples/class.AsyncMysqlRowBlock/isEmpty.md +++ /dev/null @@ -1,45 +0,0 @@ -The following example uses `AsyncMysqlRowBlock::isEmpty` to determine whether there are actually any row_blocks returned from the call to `AsyncMysqlRowBlock::rowBlocks()` method - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT * FROM test_table WHERE userID < 50'); - $conn->close(); - // A call to $result->rowBlocks() actually pops the first element of the - // row block Vector. So the call actually mutates the Vector. - $row_blocks = $result->rowBlocks(); - if (!$row_blocks->isEmpty()) { - // An AsyncMysqlRowBlock - $row_block = $row_blocks[0]; - return $row_block->count(); // int - } else { - return -1; - } -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(1) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlRowBlock/isNull.md b/api-examples/class.AsyncMysqlRowBlock/isNull.md deleted file mode 100644 index 17e1f5c61..000000000 --- a/api-examples/class.AsyncMysqlRowBlock/isNull.md +++ /dev/null @@ -1,48 +0,0 @@ -The following example uses `AsyncMysqlRowBlock::isNull` to check if a field value is `null` (e.g., if a field was set in SQL to something like `age SMALLINT NULL`, then that field *could* be `null`). - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function simple_query(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT * FROM test_table WHERE userID < 50'); - $conn->close(); - // A call to $result->rowBlocks() actually pops the first element of the - // row block Vector. So the call actually mutates the Vector. - $row_blocks = $result->rowBlocks(); - if (!$row_blocks->isEmpty()) { - // An AsyncMysqlRowBlock - $row_block = $row_blocks[0]; - if (!$row_block->isNull(0, 'age')) { - return $row_block->getFieldAsInt(0, 'age'); - } - return -1; - } else { - return -1; - } -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await simple_query(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(42) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlRowBlockIterator/current.md b/api-examples/class.AsyncMysqlRowBlockIterator/current.md deleted file mode 100644 index 06dc2db06..000000000 --- a/api-examples/class.AsyncMysqlRowBlockIterator/current.md +++ /dev/null @@ -1,63 +0,0 @@ -The following example shows you how to use `AsyncMysqlRowBlockIterator::current` to get an `AsyncMysqlRow` from the iterator. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function iterate(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT * FROM test_table WHERE userID < 50'); - $conn->close(); - // A call to $result->rowBlocks() actually pops the first element of the - // row block Vector. So the call actually mutates the Vector. - $row_blocks = $result->rowBlocks(); - if ($row_blocks->count() > 0) { - // An AsyncMysqlRowBlock - $row_block = $row_blocks[0]; - // An AsyncMysqlRowBlockIterator - $rbit = $row_block->getIterator(); - // Iterating through a row block iterator will have an int key and - // an AsyncMysqlRow as its value - while ($rbit->valid()) { - // current() gets you an AsyncMysqlRow - $row = $rbit->current(); - // getIterator() gets you an AsyncmysqlRowIterator - $rit = $row->getIterator(); - while ($rit->valid()) { - // current() will give you a string value of the field in the row - if ($rit->key() > 0 && \is_numeric($rit->current())) { - return \intval($rit->current()); - } - $rit->next(); - } - $rbit->next(); - } - return -1; - } else { - return -1; - } -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await iterate(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(42) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlRowBlockIterator/key.md b/api-examples/class.AsyncMysqlRowBlockIterator/key.md deleted file mode 100644 index 04c53f2d4..000000000 --- a/api-examples/class.AsyncMysqlRowBlockIterator/key.md +++ /dev/null @@ -1,63 +0,0 @@ -The following example shows you how to use `AsyncMysqlRowBlockIterator::key` to get the actual key pointing to an `AsyncMysqlRow` within the block iterator. The key will be an `int`. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function iterate(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT * FROM test_table WHERE userID < 50'); - $conn->close(); - // A call to $result->rowBlocks() actually pops the first element of the - // row block Vector. So the call actually mutates the Vector. - $row_blocks = $result->rowBlocks(); - if ($row_blocks->count() > 0) { - // An AsyncMysqlRowBlock - $row_block = $row_blocks[0]; - // An AsyncMysqlRowBlockIterator - $rbit = $row_block->getIterator(); - // Iterating through a row block iterator will have an int key and - // an AsyncMysqlRow as its value - while ($rbit->valid()) { - // current() gets you an AsyncMysqlRow - $row = $rbit->current(); - // getIterator() gets you an AsyncmysqlRowIterator - $rit = $row->getIterator(); - while ($rit->valid()) { - // current() will give you a string value of the field in the row - if ($rit->key() > 0 && \is_numeric($rit->current())) { - return \intval($rit->current()); - } - $rit->next(); - } - $rbit->next(); - } - return -1; - } else { - return -1; - } -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await iterate(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(42) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlRowBlockIterator/next.md b/api-examples/class.AsyncMysqlRowBlockIterator/next.md deleted file mode 100644 index 8b50c095d..000000000 --- a/api-examples/class.AsyncMysqlRowBlockIterator/next.md +++ /dev/null @@ -1,63 +0,0 @@ -The following example shows you how to use `AsyncMysqlRowBlockIterator::next` to move on to the next `AsyncMysqlRow` in the iterator, assuming one exists. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function iterate(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT * FROM test_table WHERE userID < 50'); - $conn->close(); - // A call to $result->rowBlocks() actually pops the first element of the - // row block Vector. So the call actually mutates the Vector. - $row_blocks = $result->rowBlocks(); - if ($row_blocks->count() > 0) { - // An AsyncMysqlRowBlock - $row_block = $row_blocks[0]; - // An AsyncMysqlRowBlockIterator - $rbit = $row_block->getIterator(); - // Iterating through a row block iterator will have an int key and - // an AsyncMysqlRow as its value - while ($rbit->valid()) { - // current() gets you an AsyncMysqlRow - $row = $rbit->current(); - // getIterator() gets you an AsyncmysqlRowIterator - $rit = $row->getIterator(); - while ($rit->valid()) { - // current() will give you a string value of the field in the row - if ($rit->key() > 0 && \is_numeric($rit->current())) { - return \intval($rit->current()); - } - $rit->next(); // move to the next field - } - $rbit->next(); // move to the next AsyncMysqlRow - } - return -1; - } else { - return -1; - } -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await iterate(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(42) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlRowBlockIterator/rewind.md b/api-examples/class.AsyncMysqlRowBlockIterator/rewind.md deleted file mode 100644 index 369414b53..000000000 --- a/api-examples/class.AsyncMysqlRowBlockIterator/rewind.md +++ /dev/null @@ -1,78 +0,0 @@ -The following example shows how to use `AsyncMysqlRowBlockIterator::rewind` to get back to the beginning of the iterator as necessary. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function iterate(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT * FROM test_table WHERE userID < 50'); - $conn->close(); - $ret = -1; - // A call to $result->rowBlocks() actually pops the first element of the - // row block Vector. So the call actually mutates the Vector. - $row_blocks = $result->rowBlocks(); - if ($row_blocks->count() > 0) { - // An AsyncMysqlRowBlock - $row_block = $row_blocks[0]; - // An AsyncMysqlRowBlockIterator - $rbit = $row_block->getIterator(); - // Iterating through a row block iterator will have an int key and - // an AsyncMysqlRow as its value - while ($rbit->valid()) { - // current() gets you an AsyncMysqlRow - $row = $rbit->current(); - // getIterator() gets you an AsyncmysqlRowIterator - $rit = $row->getIterator(); - while ($rit->valid()) { - // current() will give you a string value of the field in the row - if ($rit->key() > 0 && \is_numeric($rit->current())) { - $ret = \intval($rit->current()); - break; - } - $rit->next(); // move to the next field - } - if ($ret > -1) { - break; - } - $rbit->next(); // move to the next AsyncMysqlRow - } - - if ($ret > -1) { - $rbit->rewind(); // Go back to the beginning of AsyncMysqlBlockIterator - while ($rbit->valid()) { - if ($rbit->current() is \AsyncMysqlRow) { - $ret++; - } - $rbit->next(); - } - } - return $ret; - } else { - return -1; - } -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await iterate(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(43) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlRowBlockIterator/valid.md b/api-examples/class.AsyncMysqlRowBlockIterator/valid.md deleted file mode 100644 index eef2d21b1..000000000 --- a/api-examples/class.AsyncMysqlRowBlockIterator/valid.md +++ /dev/null @@ -1,63 +0,0 @@ -The following example shows how to use `AsyncMysqlRowBlockIterator::valid` to determine whether the current iterator is still valid (i.e., there was actually something to iterate over, or we have reached the end) - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function iterate(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT * FROM test_table WHERE userID < 50'); - $conn->close(); - // A call to $result->rowBlocks() actually pops the first element of the - // row block Vector. So the call actually mutates the Vector. - $row_blocks = $result->rowBlocks(); - if ($row_blocks->count() > 0) { - // An AsyncMysqlRowBlock - $row_block = $row_blocks[0]; - // An AsyncMysqlRowBlockIterator - $rbit = $row_block->getIterator(); - // Iterating through a row block iterator will have an int key and - // an AsyncMysqlRow as its value - while ($rbit->valid()) { - // current() gets you an AsyncMysqlRow - $row = $rbit->current(); - // getIterator() gets you an AsyncmysqlRowIterator - $rit = $row->getIterator(); - while ($rit->valid()) { - // current() will give you a string value of the field in the row - if ($rit->key() > 0 && \is_numeric($rit->current())) { - return \intval($rit->current()); - } - $rit->next(); - } - $rbit->next(); - } - return -1; - } else { - return -1; - } -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await iterate(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(42) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlRowIterator/current.md b/api-examples/class.AsyncMysqlRowIterator/current.md deleted file mode 100644 index 79130ea70..000000000 --- a/api-examples/class.AsyncMysqlRowIterator/current.md +++ /dev/null @@ -1,58 +0,0 @@ -The following example shows you how to use `AsyncMysqlRowIterator::current` to get a field value from the iterator. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function iterate(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT * FROM test_table WHERE userID < 50'); - $conn->close(); - // A call to $result->rowBlocks() actually pops the first element of the - // row block Vector. So the call actually mutates the Vector. - $row_blocks = $result->rowBlocks(); - if (!$row_blocks->isEmpty()) { - // An AsyncMysqlRowBlock - $row_block = $row_blocks[0]; - if (!$row_block->isEmpty()) { - // An AsyncMysqlRow - $row = $row_block->getRow(0); - // An AsyncMysqlRowIterator - $it = $row->getIterator(); - while ($it->valid()) { - // current() will give you a string value of the field in the row - if ($it->key() > 0 && \is_numeric($it->current())) { - return \intval($it->current()); - } - $it->next(); - } - } - return -1; - } else { - return -1; - } -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await iterate(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(42) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlRowIterator/key.md b/api-examples/class.AsyncMysqlRowIterator/key.md deleted file mode 100644 index 6d1e74a1b..000000000 --- a/api-examples/class.AsyncMysqlRowIterator/key.md +++ /dev/null @@ -1,58 +0,0 @@ -The following example shows you how to use `AsyncMysqlRowIterator::key` to get the actual `int` key pointing to the field within the row iterator. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function iterate(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT * FROM test_table WHERE userID < 50'); - $conn->close(); - // A call to $result->rowBlocks() actually pops the first element of the - // row block Vector. So the call actually mutates the Vector. - $row_blocks = $result->rowBlocks(); - if (!$row_blocks->isEmpty()) { - // An AsyncMysqlRowBlock - $row_block = $row_blocks[0]; - if (!$row_block->isEmpty()) { - // An AsyncMysqlRow - $row = $row_block->getRow(0); - // An AsyncMysqlRowIterator - $it = $row->getIterator(); - while ($it->valid()) { - // current() will give you a string value of the field in the row - if ($it->key() > 0 && \is_numeric($it->current())) { - return \intval($it->current()); - } - $it->next(); - } - } - return -1; - } else { - return -1; - } -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await iterate(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(42) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlRowIterator/next.md b/api-examples/class.AsyncMysqlRowIterator/next.md deleted file mode 100644 index 0ebc50fd4..000000000 --- a/api-examples/class.AsyncMysqlRowIterator/next.md +++ /dev/null @@ -1,58 +0,0 @@ -The following example shows you how to use `AsyncMysqlRowIterator::next` to move on to the next field in the iterator, assuming one exists. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function iterate(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT * FROM test_table WHERE userID < 50'); - $conn->close(); - // A call to $result->rowBlocks() actually pops the first element of the - // row block Vector. So the call actually mutates the Vector. - $row_blocks = $result->rowBlocks(); - if (!$row_blocks->isEmpty()) { - // An AsyncMysqlRowBlock - $row_block = $row_blocks[0]; - if (!$row_block->isEmpty()) { - // An AsyncMysqlRow - $row = $row_block->getRow(0); - // An AsyncMysqlRowIterator - $it = $row->getIterator(); - while ($it->valid()) { - // current() will give you a string value of the field in the row - if ($it->key() > 0 && \is_numeric($it->current())) { - return \intval($it->current()); - } - $it->next(); // The next field in the iterator - } - } - return -1; - } else { - return -1; - } -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await iterate(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(42) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlRowIterator/rewind.md b/api-examples/class.AsyncMysqlRowIterator/rewind.md deleted file mode 100644 index 737267394..000000000 --- a/api-examples/class.AsyncMysqlRowIterator/rewind.md +++ /dev/null @@ -1,67 +0,0 @@ -The following example shows how to use `AsyncMysqlRowIterator::rewind` to get back to the beginning of the iterator as necessary. - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function iterate(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT * FROM test_table WHERE userID < 50'); - $conn->close(); - // A call to $result->rowBlocks() actually pops the first element of the - // row block Vector. So the call actually mutates the Vector. - $row_blocks = $result->rowBlocks(); - if (!$row_blocks->isEmpty()) { - // An AsyncMysqlRowBlock - $row_block = $row_blocks[0]; - if (!$row_block->isEmpty()) { - // An AsyncMysqlRow - $row = $row_block->getRow(0); - // An AsyncMysqlRowIterator - $it = $row->getIterator(); - while ($it->valid()) { - // current() will give you a string value of the field in the row - if ($it->key() > 0 && \is_numeric($it->current())) { - return \intval($it->current()); - } - $it->next(); - } - // If we didn't find something to return - $it->rewind(); - while ($it->valid()) { - // current() will give you a string value of the field in the row - if ($it->key() > 0 && \is_string($it->current())) { - return 1; - } - $it->next(); - } - } - return -1; - } else { - return -1; - } -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await iterate(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(42) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.AsyncMysqlRowIterator/valid.md b/api-examples/class.AsyncMysqlRowIterator/valid.md deleted file mode 100644 index 13de1cdca..000000000 --- a/api-examples/class.AsyncMysqlRowIterator/valid.md +++ /dev/null @@ -1,58 +0,0 @@ -The following example shows how to use `AsyncMysqlRowIterator::valid` to determine whether the current iterator is still valid (i.e., there was actually something to iterate over, or we have reached the end). - -```basic-usage.hack -use \Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function connect( - \AsyncMysqlConnectionPool $pool, -): Awaitable<\AsyncMysqlConnection> { - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} -async function iterate(): Awaitable { - $pool = new \AsyncMysqlConnectionPool(darray[]); - $conn = await connect($pool); - $result = await $conn->query('SELECT * FROM test_table WHERE userID < 50'); - $conn->close(); - // A call to $result->rowBlocks() actually pops the first element of the - // row block Vector. So the call actually mutates the Vector. - $row_blocks = $result->rowBlocks(); - if (!$row_blocks->isEmpty()) { - // An AsyncMysqlRowBlock - $row_block = $row_blocks[0]; - if (!$row_block->isEmpty()) { - // An AsyncMysqlRow - $row = $row_block->getRow(0); - // An AsyncMysqlRowIterator - $it = $row->getIterator(); - while ($it->valid()) { - // current() will give you a string value of the field in the row - if ($it->key() > 0 && \is_numeric($it->current())) { - return \intval($it->current()); - } - $it->next(); - } - } - return -1; - } else { - return -1; - } -} - -<<__EntryPoint>> -async function run(): Awaitable { - $r = await iterate(); - \var_dump($r); -} -```.hhvm.expectf -int(%d) -```.example.hhvm.out -int(42) -```.skipif -await \Hack\UserDocumentation\API\Examples\AsyncMysql\skipif_async(); -``` diff --git a/api-examples/class.HH.ImmMap/__construct.md b/api-examples/class.HH.ImmMap/__construct.md deleted file mode 100644 index e664fad14..000000000 --- a/api-examples/class.HH.ImmMap/__construct.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::__construct`](/hack/reference/class/Map/__construct/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/__toString.md b/api-examples/class.HH.ImmMap/__toString.md deleted file mode 100644 index a40a17c3f..000000000 --- a/api-examples/class.HH.ImmMap/__toString.md +++ /dev/null @@ -1,9 +0,0 @@ -The string version of an `ImmMap` is always `"ImmMap"`: - -```basic-usage.hack -$im = ImmMap {'a' => 1, 'b' => 2, 'c' => 3}; -echo $im->__toString()."\n"; - -$im3 = ImmMap {}; -echo $im3->__toString()."\n"; -``` diff --git a/api-examples/class.HH.ImmMap/at.md b/api-examples/class.HH.ImmMap/at.md deleted file mode 100644 index d15b9586e..000000000 --- a/api-examples/class.HH.ImmMap/at.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::at`](/hack/reference/class/Map/at/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/concat.md b/api-examples/class.HH.ImmMap/concat.md deleted file mode 100644 index 649c6df6f..000000000 --- a/api-examples/class.HH.ImmMap/concat.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::concat`](/hack/reference/class/Map/concat/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/contains.md b/api-examples/class.HH.ImmMap/contains.md deleted file mode 100644 index f89f57704..000000000 --- a/api-examples/class.HH.ImmMap/contains.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::contains`](/hack/reference/class/Map/contains/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/containsKey.md b/api-examples/class.HH.ImmMap/containsKey.md deleted file mode 100644 index 97e6676e4..000000000 --- a/api-examples/class.HH.ImmMap/containsKey.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::containsKey`](/hack/reference/class/Map/containsKey/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/count.md b/api-examples/class.HH.ImmMap/count.md deleted file mode 100644 index 875fd8238..000000000 --- a/api-examples/class.HH.ImmMap/count.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::count`](/hack/reference/class/Map/count/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/differenceByKey.md b/api-examples/class.HH.ImmMap/differenceByKey.md deleted file mode 100644 index 3a85ce0f3..000000000 --- a/api-examples/class.HH.ImmMap/differenceByKey.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::differenceByKey`](/hack/reference/class/Map/differenceByKey/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/filter.md b/api-examples/class.HH.ImmMap/filter.md deleted file mode 100644 index 42337bd41..000000000 --- a/api-examples/class.HH.ImmMap/filter.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::filter`](/hack/reference/class/Map/filter/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/filterWithKey.md b/api-examples/class.HH.ImmMap/filterWithKey.md deleted file mode 100644 index 49b760165..000000000 --- a/api-examples/class.HH.ImmMap/filterWithKey.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::filterWithKey`](/hack/reference/class/Map/filterWithKey/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/firstKey.md b/api-examples/class.HH.ImmMap/firstKey.md deleted file mode 100644 index 961a27728..000000000 --- a/api-examples/class.HH.ImmMap/firstKey.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::firstKey`](/hack/reference/class/Map/firstKey/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/firstValue.md b/api-examples/class.HH.ImmMap/firstValue.md deleted file mode 100644 index 18c9f8285..000000000 --- a/api-examples/class.HH.ImmMap/firstValue.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::firstValue`](/hack/reference/class/Map/firstValue/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/fromItems.md b/api-examples/class.HH.ImmMap/fromItems.md deleted file mode 100644 index 8a4eebf68..000000000 --- a/api-examples/class.HH.ImmMap/fromItems.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::fromItems`](/hack/reference/class/Map/fromItems/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/get.md b/api-examples/class.HH.ImmMap/get.md deleted file mode 100644 index 452e6b293..000000000 --- a/api-examples/class.HH.ImmMap/get.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::get`](/hack/reference/class/Map/get/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/getIterator.md b/api-examples/class.HH.ImmMap/getIterator.md deleted file mode 100644 index 03bba615a..000000000 --- a/api-examples/class.HH.ImmMap/getIterator.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::getIterator`](/hack/reference/class/Map/getIterator/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/immutable.md b/api-examples/class.HH.ImmMap/immutable.md deleted file mode 100644 index 9eb3f859a..000000000 --- a/api-examples/class.HH.ImmMap/immutable.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::immutable`](/hack/reference/class/Map/immutable/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/isEmpty.md b/api-examples/class.HH.ImmMap/isEmpty.md deleted file mode 100644 index 16dc01c9e..000000000 --- a/api-examples/class.HH.ImmMap/isEmpty.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::isEmpty`](/hack/reference/class/Map/isEmpty/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/items.md b/api-examples/class.HH.ImmMap/items.md deleted file mode 100644 index 396739ec2..000000000 --- a/api-examples/class.HH.ImmMap/items.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::items`](/hack/reference/class/Map/items/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/keys.md b/api-examples/class.HH.ImmMap/keys.md deleted file mode 100644 index fe2c28770..000000000 --- a/api-examples/class.HH.ImmMap/keys.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::keys`](/hack/reference/class/Map/keys/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/lastKey.md b/api-examples/class.HH.ImmMap/lastKey.md deleted file mode 100644 index 6611cda2c..000000000 --- a/api-examples/class.HH.ImmMap/lastKey.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::lastKey`](/hack/reference/class/Map/lastKey/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/lastValue.md b/api-examples/class.HH.ImmMap/lastValue.md deleted file mode 100644 index fed01aa32..000000000 --- a/api-examples/class.HH.ImmMap/lastValue.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::lastValue`](/hack/reference/class/Map/lastValue/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/lazy.md b/api-examples/class.HH.ImmMap/lazy.md deleted file mode 100644 index 23eb99bed..000000000 --- a/api-examples/class.HH.ImmMap/lazy.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::lazy`](/hack/reference/class/Map/lazy/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/map.md b/api-examples/class.HH.ImmMap/map.md deleted file mode 100644 index d97c00c56..000000000 --- a/api-examples/class.HH.ImmMap/map.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::map`](/hack/reference/class/Map/map/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/mapWithKey.md b/api-examples/class.HH.ImmMap/mapWithKey.md deleted file mode 100644 index c6a8bb4f9..000000000 --- a/api-examples/class.HH.ImmMap/mapWithKey.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::mapWithKey`](/hack/reference/class/Map/mapWithKey/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/skip.md b/api-examples/class.HH.ImmMap/skip.md deleted file mode 100644 index 5785857a5..000000000 --- a/api-examples/class.HH.ImmMap/skip.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::skip`](/hack/reference/class/Map/skip/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/skipWhile.md b/api-examples/class.HH.ImmMap/skipWhile.md deleted file mode 100644 index 4a3c9b9d5..000000000 --- a/api-examples/class.HH.ImmMap/skipWhile.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::skipWhile`](/hack/reference/class/Map/skipWhile/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/slice.md b/api-examples/class.HH.ImmMap/slice.md deleted file mode 100644 index 23d131815..000000000 --- a/api-examples/class.HH.ImmMap/slice.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::slice`](/hack/reference/class/Map/slice/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/take.md b/api-examples/class.HH.ImmMap/take.md deleted file mode 100644 index 1c95ee739..000000000 --- a/api-examples/class.HH.ImmMap/take.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::take`](/hack/reference/class/Map/take/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/takeWhile.md b/api-examples/class.HH.ImmMap/takeWhile.md deleted file mode 100644 index 4e576787b..000000000 --- a/api-examples/class.HH.ImmMap/takeWhile.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::takeWhile`](/hack/reference/class/Map/takeWhile/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/toDArray.md b/api-examples/class.HH.ImmMap/toDArray.md deleted file mode 100644 index 84602a755..000000000 --- a/api-examples/class.HH.ImmMap/toDArray.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::toDArray`](/hack/reference/class/Map/toDArray/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/toImmMap.md b/api-examples/class.HH.ImmMap/toImmMap.md deleted file mode 100644 index caf122937..000000000 --- a/api-examples/class.HH.ImmMap/toImmMap.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::toImmMap`](/hack/reference/class/Map/toImmMap/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/toImmSet.md b/api-examples/class.HH.ImmMap/toImmSet.md deleted file mode 100644 index 4da868067..000000000 --- a/api-examples/class.HH.ImmMap/toImmSet.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::toImmSet`](/hack/reference/class/Map/toImmSet/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/toImmVector.md b/api-examples/class.HH.ImmMap/toImmVector.md deleted file mode 100644 index ffe25e11b..000000000 --- a/api-examples/class.HH.ImmMap/toImmVector.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::toImmVector`](/hack/reference/class/Map/toImmVector/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/toKeysArray.md b/api-examples/class.HH.ImmMap/toKeysArray.md deleted file mode 100644 index 8404e7e9e..000000000 --- a/api-examples/class.HH.ImmMap/toKeysArray.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::toKeysArray`](/hack/reference/class/Map/toKeysArray/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/toMap.md b/api-examples/class.HH.ImmMap/toMap.md deleted file mode 100644 index 54117b748..000000000 --- a/api-examples/class.HH.ImmMap/toMap.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::toMap`](/hack/reference/class/Map/toMap/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/toSet.md b/api-examples/class.HH.ImmMap/toSet.md deleted file mode 100644 index f24e9a331..000000000 --- a/api-examples/class.HH.ImmMap/toSet.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::toSet`](/hack/reference/class/Map/toSet/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/toValuesArray.md b/api-examples/class.HH.ImmMap/toValuesArray.md deleted file mode 100644 index 82d6875ba..000000000 --- a/api-examples/class.HH.ImmMap/toValuesArray.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::toValuesArray`](/hack/reference/class/Map/toValuesArray/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/toVector.md b/api-examples/class.HH.ImmMap/toVector.md deleted file mode 100644 index 7992ab331..000000000 --- a/api-examples/class.HH.ImmMap/toVector.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::toVector`](/hack/reference/class/Map/toVector/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/values.md b/api-examples/class.HH.ImmMap/values.md deleted file mode 100644 index 3a27232f8..000000000 --- a/api-examples/class.HH.ImmMap/values.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::values`](/hack/reference/class/Map/values/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmMap/zip.md b/api-examples/class.HH.ImmMap/zip.md deleted file mode 100644 index 686227314..000000000 --- a/api-examples/class.HH.ImmMap/zip.md +++ /dev/null @@ -1 +0,0 @@ -See [`Map::zip`](/hack/reference/class/Map/zip/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/__construct.md b/api-examples/class.HH.ImmSet/__construct.md deleted file mode 100644 index ff3487cb3..000000000 --- a/api-examples/class.HH.ImmSet/__construct.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set`](/hack/reference/class/Set/__construct/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/__toString.md b/api-examples/class.HH.ImmSet/__toString.md deleted file mode 100644 index fcc40dbfa..000000000 --- a/api-examples/class.HH.ImmSet/__toString.md +++ /dev/null @@ -1,12 +0,0 @@ -The string version of an `ImmSet` is always `"ImmSet"`: - -```basic-usage.hack -$is = ImmSet {1, 2, 3}; -echo $is->__toString()."\n"; - -$is2 = ImmSet {'a', 'b', 'c'}; -echo $is2->__toString()."\n"; - -$is3 = ImmSet {}; -echo $is3->__toString()."\n"; -``` diff --git a/api-examples/class.HH.ImmSet/concat.md b/api-examples/class.HH.ImmSet/concat.md deleted file mode 100644 index 3325f9626..000000000 --- a/api-examples/class.HH.ImmSet/concat.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::concat`](/hack/reference/class/Set/concat/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/contains.md b/api-examples/class.HH.ImmSet/contains.md deleted file mode 100644 index 839b90664..000000000 --- a/api-examples/class.HH.ImmSet/contains.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::contains`](/hack/reference/class/Set/contains/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/count.md b/api-examples/class.HH.ImmSet/count.md deleted file mode 100644 index 58e651764..000000000 --- a/api-examples/class.HH.ImmSet/count.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::count`](/hack/reference/class/Set/count/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/filter.md b/api-examples/class.HH.ImmSet/filter.md deleted file mode 100644 index 898ff4510..000000000 --- a/api-examples/class.HH.ImmSet/filter.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::filter`](/hack/reference/class/Set/filter/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/filterWithKey.md b/api-examples/class.HH.ImmSet/filterWithKey.md deleted file mode 100644 index 5eb27dfe2..000000000 --- a/api-examples/class.HH.ImmSet/filterWithKey.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::filterWithKey`](/hack/reference/class/Set/filterWithKey/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/firstKey.md b/api-examples/class.HH.ImmSet/firstKey.md deleted file mode 100644 index ad9c91213..000000000 --- a/api-examples/class.HH.ImmSet/firstKey.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::firstKey`](/hack/reference/class/Set/firstKey/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/firstValue.md b/api-examples/class.HH.ImmSet/firstValue.md deleted file mode 100644 index dc91a13de..000000000 --- a/api-examples/class.HH.ImmSet/firstValue.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::firstValue`](/hack/reference/class/Set/firstValue/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/fromArrays.md b/api-examples/class.HH.ImmSet/fromArrays.md deleted file mode 100644 index 544bf43e9..000000000 --- a/api-examples/class.HH.ImmSet/fromArrays.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::fromArrays`](/hack/reference/class/Set/fromArrays/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/fromItems.md b/api-examples/class.HH.ImmSet/fromItems.md deleted file mode 100644 index 0f2001939..000000000 --- a/api-examples/class.HH.ImmSet/fromItems.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::fromItems`](/hack/reference/class/Set/fromItems/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/fromKeysOf.md b/api-examples/class.HH.ImmSet/fromKeysOf.md deleted file mode 100644 index 72c1175ad..000000000 --- a/api-examples/class.HH.ImmSet/fromKeysOf.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::fromKeysOf`](/hack/reference/class/Set/fromKeysOf/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/getIterator.md b/api-examples/class.HH.ImmSet/getIterator.md deleted file mode 100644 index f7499b1cc..000000000 --- a/api-examples/class.HH.ImmSet/getIterator.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::getIterator`](/hack/reference/class/Set/getIterator/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/immutable.md b/api-examples/class.HH.ImmSet/immutable.md deleted file mode 100644 index a094b8cbb..000000000 --- a/api-examples/class.HH.ImmSet/immutable.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::immutable`](/hack/reference/class/Set/immutable/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/isEmpty.md b/api-examples/class.HH.ImmSet/isEmpty.md deleted file mode 100644 index ecc055320..000000000 --- a/api-examples/class.HH.ImmSet/isEmpty.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::isEmpty`](/hack/reference/class/Set/isEmpty/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/items.md b/api-examples/class.HH.ImmSet/items.md deleted file mode 100644 index 2da647792..000000000 --- a/api-examples/class.HH.ImmSet/items.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::items`](/hack/reference/class/Set/items/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/keys.md b/api-examples/class.HH.ImmSet/keys.md deleted file mode 100644 index a7cbbf098..000000000 --- a/api-examples/class.HH.ImmSet/keys.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::keys`](/hack/reference/class/Set/keys/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/lastKey.md b/api-examples/class.HH.ImmSet/lastKey.md deleted file mode 100644 index 4f33101f2..000000000 --- a/api-examples/class.HH.ImmSet/lastKey.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::lastKey`](/hack/reference/class/Set/lastKey/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/lastValue.md b/api-examples/class.HH.ImmSet/lastValue.md deleted file mode 100644 index 2702060ab..000000000 --- a/api-examples/class.HH.ImmSet/lastValue.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::lastValue`](/hack/reference/class/Set/lastValue/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/lazy.md b/api-examples/class.HH.ImmSet/lazy.md deleted file mode 100644 index ac64447f3..000000000 --- a/api-examples/class.HH.ImmSet/lazy.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::lazy`](/hack/reference/class/Set/lazy/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/map.md b/api-examples/class.HH.ImmSet/map.md deleted file mode 100644 index 28f05c5b5..000000000 --- a/api-examples/class.HH.ImmSet/map.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::map`](/hack/reference/class/Set/map/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/mapWithKey.md b/api-examples/class.HH.ImmSet/mapWithKey.md deleted file mode 100644 index 8760a4478..000000000 --- a/api-examples/class.HH.ImmSet/mapWithKey.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::mapWithKey`](/hack/reference/class/Set/mapWithKey/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/skip.md b/api-examples/class.HH.ImmSet/skip.md deleted file mode 100644 index d3f9b543a..000000000 --- a/api-examples/class.HH.ImmSet/skip.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::skip`](/hack/reference/class/Set/skip/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/skipWhile.md b/api-examples/class.HH.ImmSet/skipWhile.md deleted file mode 100644 index c640cd4de..000000000 --- a/api-examples/class.HH.ImmSet/skipWhile.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::skipWhile`](/hack/reference/class/Set/skipWhile/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/slice.md b/api-examples/class.HH.ImmSet/slice.md deleted file mode 100644 index 9282e08c0..000000000 --- a/api-examples/class.HH.ImmSet/slice.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::slice`](/hack/reference/class/Set/slice/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/take.md b/api-examples/class.HH.ImmSet/take.md deleted file mode 100644 index 4bad81f99..000000000 --- a/api-examples/class.HH.ImmSet/take.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::take`](/hack/reference/class/Set/take/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/takeWhile.md b/api-examples/class.HH.ImmSet/takeWhile.md deleted file mode 100644 index bf2a322e2..000000000 --- a/api-examples/class.HH.ImmSet/takeWhile.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::takeWhile`](/hack/reference/class/Set/takeWhile/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/toDArray.md b/api-examples/class.HH.ImmSet/toDArray.md deleted file mode 100644 index d40d2a077..000000000 --- a/api-examples/class.HH.ImmSet/toDArray.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::toDArray`](/hack/reference/class/Set/toDArray/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/toImmMap.md b/api-examples/class.HH.ImmSet/toImmMap.md deleted file mode 100644 index 52a587bf2..000000000 --- a/api-examples/class.HH.ImmSet/toImmMap.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::toImmMap`](/hack/reference/class/Set/toImmMap/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/toImmSet.md b/api-examples/class.HH.ImmSet/toImmSet.md deleted file mode 100644 index c5dbbf503..000000000 --- a/api-examples/class.HH.ImmSet/toImmSet.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::toImmSet`](/hack/reference/class/Set/toImmSet/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/toImmVector.md b/api-examples/class.HH.ImmSet/toImmVector.md deleted file mode 100644 index 2749c2c8f..000000000 --- a/api-examples/class.HH.ImmSet/toImmVector.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::toImmVector`](/hack/reference/class/Set/toImmVector/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/toKeysArray.md b/api-examples/class.HH.ImmSet/toKeysArray.md deleted file mode 100644 index abd1259e0..000000000 --- a/api-examples/class.HH.ImmSet/toKeysArray.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::toKeysArray`](/hack/reference/class/Set/toKeysArray/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/toMap.md b/api-examples/class.HH.ImmSet/toMap.md deleted file mode 100644 index 365afe416..000000000 --- a/api-examples/class.HH.ImmSet/toMap.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::toMap`](/hack/reference/class/Set/toMap/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/toSet.md b/api-examples/class.HH.ImmSet/toSet.md deleted file mode 100644 index 7562fab09..000000000 --- a/api-examples/class.HH.ImmSet/toSet.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::toSet`](/hack/reference/class/Set/toSet/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/toVArray.md b/api-examples/class.HH.ImmSet/toVArray.md deleted file mode 100644 index 612760b0a..000000000 --- a/api-examples/class.HH.ImmSet/toVArray.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::toVArray`](/hack/reference/class/Set/toVArray/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/toValuesArray.md b/api-examples/class.HH.ImmSet/toValuesArray.md deleted file mode 100644 index b6a26bcca..000000000 --- a/api-examples/class.HH.ImmSet/toValuesArray.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::toValuesArray`](/hack/reference/class/Set/toValuesArray/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/toVector.md b/api-examples/class.HH.ImmSet/toVector.md deleted file mode 100644 index 46565c502..000000000 --- a/api-examples/class.HH.ImmSet/toVector.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::toVector`](/hack/reference/class/Set/toVector/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/values.md b/api-examples/class.HH.ImmSet/values.md deleted file mode 100644 index 4989b3b2f..000000000 --- a/api-examples/class.HH.ImmSet/values.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::values`](/hack/reference/class/Set/values/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmSet/zip.md b/api-examples/class.HH.ImmSet/zip.md deleted file mode 100644 index a51914a20..000000000 --- a/api-examples/class.HH.ImmSet/zip.md +++ /dev/null @@ -1 +0,0 @@ -See [`Set::zip`](/hack/reference/class/Set/zip/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/__construct.md b/api-examples/class.HH.ImmVector/__construct.md deleted file mode 100644 index 6598353bf..000000000 --- a/api-examples/class.HH.ImmVector/__construct.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector`](/hack/reference/class/Vector/__construct/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/__toString.md b/api-examples/class.HH.ImmVector/__toString.md deleted file mode 100644 index 7610c28e2..000000000 --- a/api-examples/class.HH.ImmVector/__toString.md +++ /dev/null @@ -1,12 +0,0 @@ -The string version of a `Vector` is always `"Vector"`: - -```basic-usage.hack -$v = Vector {1, 2, 3}; -echo $v->__toString()."\n"; - -$v2 = Vector {'a', 'b', 'c'}; -echo $v2->__toString()."\n"; - -$v3 = Vector {}; -echo $v3->__toString()."\n"; -``` diff --git a/api-examples/class.HH.ImmVector/at.md b/api-examples/class.HH.ImmVector/at.md deleted file mode 100644 index 841398777..000000000 --- a/api-examples/class.HH.ImmVector/at.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::at`](/hack/reference/class/Vector/at/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/concat.md b/api-examples/class.HH.ImmVector/concat.md deleted file mode 100644 index 09ed9edd2..000000000 --- a/api-examples/class.HH.ImmVector/concat.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::concat`](/hack/reference/class/Vector/concat/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/containsKey.md b/api-examples/class.HH.ImmVector/containsKey.md deleted file mode 100644 index bba5808c3..000000000 --- a/api-examples/class.HH.ImmVector/containsKey.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::containsKey`](/hack/reference/class/Vector/containsKey/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/count.md b/api-examples/class.HH.ImmVector/count.md deleted file mode 100644 index 0950f1ec5..000000000 --- a/api-examples/class.HH.ImmVector/count.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::count`](/hack/reference/class/Vector/count/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/filter.md b/api-examples/class.HH.ImmVector/filter.md deleted file mode 100644 index 922fb4a52..000000000 --- a/api-examples/class.HH.ImmVector/filter.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::filter`](/hack/reference/class/Vector/filter/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/filterWithKey.md b/api-examples/class.HH.ImmVector/filterWithKey.md deleted file mode 100644 index 8c94b1203..000000000 --- a/api-examples/class.HH.ImmVector/filterWithKey.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::filterWithKey`](/hack/reference/class/Vector/filterWithKey/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/firstKey.md b/api-examples/class.HH.ImmVector/firstKey.md deleted file mode 100644 index 7021d2764..000000000 --- a/api-examples/class.HH.ImmVector/firstKey.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::firstKey`](/hack/reference/class/Vector/firstKey/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/firstValue.md b/api-examples/class.HH.ImmVector/firstValue.md deleted file mode 100644 index bf85642ce..000000000 --- a/api-examples/class.HH.ImmVector/firstValue.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::firstValue`](/hack/reference/class/Vector/firstValue/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/fromItems.md b/api-examples/class.HH.ImmVector/fromItems.md deleted file mode 100644 index 55baedbf8..000000000 --- a/api-examples/class.HH.ImmVector/fromItems.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::fromItems`](/hack/reference/class/Vector/fromItems/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/fromKeysOf.md b/api-examples/class.HH.ImmVector/fromKeysOf.md deleted file mode 100644 index 9a4f84b7c..000000000 --- a/api-examples/class.HH.ImmVector/fromKeysOf.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::fromKeysOf`](/hack/reference/class/Vector/fromKeysOf/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/get.md b/api-examples/class.HH.ImmVector/get.md deleted file mode 100644 index f76210a27..000000000 --- a/api-examples/class.HH.ImmVector/get.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::get`](/hack/reference/class/Vector/get/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/getIterator.md b/api-examples/class.HH.ImmVector/getIterator.md deleted file mode 100644 index 87bcc61b9..000000000 --- a/api-examples/class.HH.ImmVector/getIterator.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::getIterator`](/hack/reference/class/Vector/getIterator/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/immutable.md b/api-examples/class.HH.ImmVector/immutable.md deleted file mode 100644 index e931bee69..000000000 --- a/api-examples/class.HH.ImmVector/immutable.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::immutable`](/hack/reference/class/Vector/immutable/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/isEmpty.md b/api-examples/class.HH.ImmVector/isEmpty.md deleted file mode 100644 index a6b0a8874..000000000 --- a/api-examples/class.HH.ImmVector/isEmpty.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::isEmpty`](/hack/reference/class/Vector/isEmpty/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/items.md b/api-examples/class.HH.ImmVector/items.md deleted file mode 100644 index e5f0934b9..000000000 --- a/api-examples/class.HH.ImmVector/items.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::items`](/hack/reference/class/Vector/items/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/keys.md b/api-examples/class.HH.ImmVector/keys.md deleted file mode 100644 index 6b27b26df..000000000 --- a/api-examples/class.HH.ImmVector/keys.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::keys`](/hack/reference/class/Vector/keys/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/lastKey.md b/api-examples/class.HH.ImmVector/lastKey.md deleted file mode 100644 index 6395440b5..000000000 --- a/api-examples/class.HH.ImmVector/lastKey.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::lastKey`](/hack/reference/class/Vector/lastKey/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/lastValue.md b/api-examples/class.HH.ImmVector/lastValue.md deleted file mode 100644 index 149b88b78..000000000 --- a/api-examples/class.HH.ImmVector/lastValue.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::lastValue`](/hack/reference/class/Vector/lastValue/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/lazy.md b/api-examples/class.HH.ImmVector/lazy.md deleted file mode 100644 index 71a7d01dc..000000000 --- a/api-examples/class.HH.ImmVector/lazy.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::lazy`](/hack/reference/class/Vector/lazy/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/linearSearch.md b/api-examples/class.HH.ImmVector/linearSearch.md deleted file mode 100644 index 6c8b9107d..000000000 --- a/api-examples/class.HH.ImmVector/linearSearch.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::linearSearch`](/hack/reference/class/Vector/linearSearch/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/map.md b/api-examples/class.HH.ImmVector/map.md deleted file mode 100644 index 23ea374c4..000000000 --- a/api-examples/class.HH.ImmVector/map.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::map`](/hack/reference/class/Vector/map/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/mapWithKey.md b/api-examples/class.HH.ImmVector/mapWithKey.md deleted file mode 100644 index 53663ae70..000000000 --- a/api-examples/class.HH.ImmVector/mapWithKey.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::mapWithKey`](/hack/reference/class/Vector/mapWithKey/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/skip.md b/api-examples/class.HH.ImmVector/skip.md deleted file mode 100644 index d695c8ddb..000000000 --- a/api-examples/class.HH.ImmVector/skip.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::skip`](/hack/reference/class/Vector/skip/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/skipWhile.md b/api-examples/class.HH.ImmVector/skipWhile.md deleted file mode 100644 index 5463adc29..000000000 --- a/api-examples/class.HH.ImmVector/skipWhile.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::skipWhile`](/hack/reference/class/Vector/skipWhile/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/slice.md b/api-examples/class.HH.ImmVector/slice.md deleted file mode 100644 index 1e0af4eac..000000000 --- a/api-examples/class.HH.ImmVector/slice.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::slice`](/hack/reference/class/Vector/slice/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/take.md b/api-examples/class.HH.ImmVector/take.md deleted file mode 100644 index de95a26f6..000000000 --- a/api-examples/class.HH.ImmVector/take.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::take`](/hack/reference/class/Vector/take/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/takeWhile.md b/api-examples/class.HH.ImmVector/takeWhile.md deleted file mode 100644 index 71761353a..000000000 --- a/api-examples/class.HH.ImmVector/takeWhile.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::takeWhile`](/hack/reference/class/Vector/takeWhile/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/toImmMap.md b/api-examples/class.HH.ImmVector/toImmMap.md deleted file mode 100644 index 3a9ffe8f5..000000000 --- a/api-examples/class.HH.ImmVector/toImmMap.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::toImmMap`](/hack/reference/class/Vector/toImmMap/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/toImmSet.md b/api-examples/class.HH.ImmVector/toImmSet.md deleted file mode 100644 index 9f95e7192..000000000 --- a/api-examples/class.HH.ImmVector/toImmSet.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::toImmSet`](/hack/reference/class/Vector/toImmSet/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/toImmVector.md b/api-examples/class.HH.ImmVector/toImmVector.md deleted file mode 100644 index 171f92c5e..000000000 --- a/api-examples/class.HH.ImmVector/toImmVector.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::toImmVector`](/hack/reference/class/Vector/toImmVector/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/toKeysArray.md b/api-examples/class.HH.ImmVector/toKeysArray.md deleted file mode 100644 index dbf3ee593..000000000 --- a/api-examples/class.HH.ImmVector/toKeysArray.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::toKeysArray`](/hack/reference/class/Vector/toKeysArray/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/toMap.md b/api-examples/class.HH.ImmVector/toMap.md deleted file mode 100644 index 4e3111638..000000000 --- a/api-examples/class.HH.ImmVector/toMap.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::toMap`](/hack/reference/class/Vector/toMap/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/toSet.md b/api-examples/class.HH.ImmVector/toSet.md deleted file mode 100644 index 67cf0ed45..000000000 --- a/api-examples/class.HH.ImmVector/toSet.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::toSet`](/hack/reference/class/Vector/toSet/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/toVArray.md b/api-examples/class.HH.ImmVector/toVArray.md deleted file mode 100644 index 3f7a8c0aa..000000000 --- a/api-examples/class.HH.ImmVector/toVArray.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::toVArray`](/hack/reference/class/Vector/toVArray/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/toValuesArray.md b/api-examples/class.HH.ImmVector/toValuesArray.md deleted file mode 100644 index 4851d3b27..000000000 --- a/api-examples/class.HH.ImmVector/toValuesArray.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::toValuesArray`](/hack/reference/class/Vector/toValuesArray/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/toVector.md b/api-examples/class.HH.ImmVector/toVector.md deleted file mode 100644 index f86454a8a..000000000 --- a/api-examples/class.HH.ImmVector/toVector.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::toVector`](/hack/reference/class/Vector/toVector/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/values.md b/api-examples/class.HH.ImmVector/values.md deleted file mode 100644 index 1e7cd6e8c..000000000 --- a/api-examples/class.HH.ImmVector/values.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::values`](/hack/reference/class/Vector/values/#examples) for usage examples. diff --git a/api-examples/class.HH.ImmVector/zip.md b/api-examples/class.HH.ImmVector/zip.md deleted file mode 100644 index f59cc74a9..000000000 --- a/api-examples/class.HH.ImmVector/zip.md +++ /dev/null @@ -1 +0,0 @@ -See [`Vector::zip`](/hack/reference/class/Vector/zip/#examples) for usage examples. diff --git a/api-examples/class.HH.Map/__construct.md b/api-examples/class.HH.Map/__construct.md deleted file mode 100644 index 7f2e41e90..000000000 --- a/api-examples/class.HH.Map/__construct.md +++ /dev/null @@ -1,24 +0,0 @@ -This example shows how to create a `Map` from various `KeyedTraversable`s: - -```basic-usage.hack -// Create a new string-keyed Map from an associative array -$m = new Map(darray[ - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', -]); -\var_dump($m); - -// Create a new integer-keyed Map from a Vector -$m = new Map(Vector {'red', 'green', 'blue', 'yellow'}); -\var_dump($m); -``` - -This example shows how passing `null` to the constructor creates an empty `Map`: - -```null-empty.hack -// An empty Map is created if null is provided -$m = new Map(null); -\var_dump($m); -``` diff --git a/api-examples/class.HH.Map/__toString.md b/api-examples/class.HH.Map/__toString.md deleted file mode 100644 index 34e7c6eea..000000000 --- a/api-examples/class.HH.Map/__toString.md +++ /dev/null @@ -1,9 +0,0 @@ -The string version of a `Map` is always `"Map"`: - -```basic-usage.hack -$m = Map {'a' => 1, 'b' => 2, 'c' => 3}; -echo $m->__toString()."\n"; - -$m3 = Map {}; -echo $m3->__toString()."\n"; -``` diff --git a/api-examples/class.HH.Map/add.md b/api-examples/class.HH.Map/add.md deleted file mode 100644 index 8c6f8ca20..000000000 --- a/api-examples/class.HH.Map/add.md +++ /dev/null @@ -1,14 +0,0 @@ -The following example adds a single key-value pair to the `Map` `$m` and also adds multiple key-value pairs to `$m` through chaining. Since `Map::add()` returns a [shallow copy](https://en.wikipedia.org/wiki/Object_copying#Shallow_copy) of `$m` itself, you can chain a bunch of `add()` calls together, and that will add all those values to `$m`. - -```basic-usage.hack -$m = Map {}; - -$m->add(Pair {'red', '#ff0000'}); -\var_dump($m); - -// Map::add returns the Map so it can be chained -$m->add(Pair {'green', '#00ff00'}) - ->add(Pair {'blue', '#0000ff'}) - ->add(Pair {'yellow', '#ffff00'}); -\var_dump($m); -``` diff --git a/api-examples/class.HH.Map/addAll.md b/api-examples/class.HH.Map/addAll.md deleted file mode 100644 index 7c7d5e48a..000000000 --- a/api-examples/class.HH.Map/addAll.md +++ /dev/null @@ -1,20 +0,0 @@ -The following example adds a collection of key-value pairs to the `Map` `$m` and also adds multiple collections of key-value pairs to `$m` through chaining. Since `Map::addAll()` returns a [shallow copy](https://en.wikipedia.org/wiki/Object_copying#Shallow_copy) of `$m` itself, you can chain a bunch of `addAll()` calls together. - -```basic-usage.hack -$m = Map {}; - -// Add all the key-value pairs in an array -$m->addAll(varray[Pair {'red', '#ff0000'}]); - -// Map::addAll returns the Map so it can be chained -$m->addAll(Vector { - Pair {'green', '#00ff00'}, - Pair {'blue', '#0000ff'}, -}) - ->addAll(ImmVector { - Pair {'yellow', '#ffff00'}, - Pair {'purple', '#663399'}, - }); - -\var_dump($m); -``` diff --git a/api-examples/class.HH.Map/at.md b/api-examples/class.HH.Map/at.md deleted file mode 100644 index cdf482349..000000000 --- a/api-examples/class.HH.Map/at.md +++ /dev/null @@ -1,30 +0,0 @@ -This example prints the values at the keys `red` and `green` in the `Map`: - -```existing-key.hack -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', -}; - -// Print the value at the key 'red' -\var_dump($m->at('red')); - -// Print the value at the key 'yellow' -\var_dump($m->at('yellow')); -``` - -This example throws an `OutOfBoundsException` because the `Map` has no key 'blurple': - -```missing-key.hack -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', -}; - -// Key 'blurple' doesn't exist (this will throw an exception) -\var_dump($m->at('blurple')); -``` diff --git a/api-examples/class.HH.Map/clear.md b/api-examples/class.HH.Map/clear.md deleted file mode 100644 index 8466732b9..000000000 --- a/api-examples/class.HH.Map/clear.md +++ /dev/null @@ -1,12 +0,0 @@ -```basic-usage.hack -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', -}; -\var_dump($m); - -$m->clear(); -\var_dump($m); -``` diff --git a/api-examples/class.HH.Map/concat.md b/api-examples/class.HH.Map/concat.md deleted file mode 100644 index 52b72848c..000000000 --- a/api-examples/class.HH.Map/concat.md +++ /dev/null @@ -1,17 +0,0 @@ -This example creates new `Vector`s by concatenating the values in a `Map` with `Traversable`s: - -```basic-usage.hack -$m = Map { - 'red' => '#ff0000', -}; - -// Create a Vector by concating the values from $m with a Set -$v1 = $m->concat(Set {'#00ff00', '#0000ff'}); - -// Create a Vector by concating the values from $m with a Vector -$v2 = $m->concat(Vector {'#ffff00', '#663399'}); - -\var_dump($m->values()); // $m contains the value '#ff0000' -\var_dump($v1); // $v1 contains '#ff0000', '#00ff00', '#0000ff' -\var_dump($v2); // $v2 contains '#ff0000', '#ffff00', '#663399' -``` diff --git a/api-examples/class.HH.Map/contains.md b/api-examples/class.HH.Map/contains.md deleted file mode 100644 index f3cf2aa79..000000000 --- a/api-examples/class.HH.Map/contains.md +++ /dev/null @@ -1,17 +0,0 @@ -```basic-usage.hack -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', -}; - -// Prints "true", since key "red" is the first key -\var_dump($m->containsKey('red')); - -// Prints "true", since key "yellow" is the last key -\var_dump($m->containsKey('yellow')); - -// Prints "false", since key "blurple" isn't in the Map -\var_dump($m->containsKey('blurple')); -``` diff --git a/api-examples/class.HH.Map/containsKey.md b/api-examples/class.HH.Map/containsKey.md deleted file mode 100644 index f3cf2aa79..000000000 --- a/api-examples/class.HH.Map/containsKey.md +++ /dev/null @@ -1,17 +0,0 @@ -```basic-usage.hack -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', -}; - -// Prints "true", since key "red" is the first key -\var_dump($m->containsKey('red')); - -// Prints "true", since key "yellow" is the last key -\var_dump($m->containsKey('yellow')); - -// Prints "false", since key "blurple" isn't in the Map -\var_dump($m->containsKey('blurple')); -``` diff --git a/api-examples/class.HH.Map/count.md b/api-examples/class.HH.Map/count.md deleted file mode 100644 index b2863d524..000000000 --- a/api-examples/class.HH.Map/count.md +++ /dev/null @@ -1,12 +0,0 @@ -```basic-usage.hack -$m = Map {}; -\var_dump($m->count()); - -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', -}; -\var_dump($m->count()); -``` diff --git a/api-examples/class.HH.Map/differenceByKey.md b/api-examples/class.HH.Map/differenceByKey.md deleted file mode 100644 index fb27338e0..000000000 --- a/api-examples/class.HH.Map/differenceByKey.md +++ /dev/null @@ -1,15 +0,0 @@ -This example shows how `differenceByKey` can be used to get a new `Map` with some keys excluded: - -```basic-usage.hack -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', - 'purple' => '#663399', -}; - -$m2 = $m->differenceByKey(Set {'red', 'green', 'blue'}); - -\var_dump($m2); -``` diff --git a/api-examples/class.HH.Map/filter.md b/api-examples/class.HH.Map/filter.md deleted file mode 100644 index 2bdd0971a..000000000 --- a/api-examples/class.HH.Map/filter.md +++ /dev/null @@ -1,15 +0,0 @@ -This example shows how `filter` returns a new `Map` containing only the values (and their corresponding keys) for which `$callback` returned `true`: - -```basic-usage.hack -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', - 'purple' => '#663399', -}; - -// Filter $m for colors with a 100% red component -$red_100 = $m->filter($hex_code ==> \strpos($hex_code, '#ff') === 0); -\var_dump($red_100); -``` diff --git a/api-examples/class.HH.Map/filterWithKey.md b/api-examples/class.HH.Map/filterWithKey.md deleted file mode 100644 index 46ed88235..000000000 --- a/api-examples/class.HH.Map/filterWithKey.md +++ /dev/null @@ -1,24 +0,0 @@ -This example shows how `filterWithKey` allows you to use an element's value and corresponding key to determine whether to include it in the filtered `Map`. - -```basic-usage.hack -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', - 'purple' => '#663399', -}; - -$primary_colors = Set {'red', 'green', 'blue'}; - -// Filter non-primary colors with a 100% red component -$non_primary_red_100 = $m->filterWithKey( - ($color, $hex_code) ==> { - $is_primary = $primary_colors->contains($color); - $has_full_red_component = \strpos($hex_code, '#ff') === 0; - return $has_full_red_component && !$is_primary; - }, -); - -\var_dump($non_primary_red_100); -``` diff --git a/api-examples/class.HH.Map/firstKey.md b/api-examples/class.HH.Map/firstKey.md deleted file mode 100644 index f453cede7..000000000 --- a/api-examples/class.HH.Map/firstKey.md +++ /dev/null @@ -1,14 +0,0 @@ -The following example gets the first key from `Map`. An empty `Map` will return `null` as its first key. - -```basic-usage.hack -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', -}; -\var_dump($m->firstKey()); - -$m = Map {}; -\var_dump($m->firstKey()); -``` diff --git a/api-examples/class.HH.Map/firstValue.md b/api-examples/class.HH.Map/firstValue.md deleted file mode 100644 index 7f397fc23..000000000 --- a/api-examples/class.HH.Map/firstValue.md +++ /dev/null @@ -1,14 +0,0 @@ -The following example gets the first value from a `Map`. An empty `Map` will return `null` as its first value. - -```basic-usage.hack -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', -}; -\var_dump($m->firstValue()); - -$m = Map {}; -\var_dump($m->firstValue()); -``` diff --git a/api-examples/class.HH.Map/fromItems.md b/api-examples/class.HH.Map/fromItems.md deleted file mode 100644 index 02c97ee01..000000000 --- a/api-examples/class.HH.Map/fromItems.md +++ /dev/null @@ -1,25 +0,0 @@ -This example shows that a `Map` can be created from any `Traversable` of key-value pairs: - -```basic-usage.hack -// Create a new Map from an array of key-value pairs -$m = Map::fromItems(varray[ - Pair {'red', '#ff0000'}, - Pair {'green', '#00ff00'}, - Pair {'blue', '#0000ff'}, - Pair {'yellow', '#ffff00'}, -]); -\var_dump($m); - -// Create a new Map from a Vector of key-value pairs -$m = Map::fromItems(Vector { - Pair {'red', '#ff0000'}, - Pair {'green', '#00ff00'}, - Pair {'blue', '#0000ff'}, - Pair {'yellow', '#ffff00'}, -}); -\var_dump($m); - -// An empty Map is created if null is provided -$m = Map::fromItems(null); -\var_dump($m); -``` diff --git a/api-examples/class.HH.Map/get.md b/api-examples/class.HH.Map/get.md deleted file mode 100644 index 46b1cc7ed..000000000 --- a/api-examples/class.HH.Map/get.md +++ /dev/null @@ -1,16 +0,0 @@ -This example shows how `get` can be used to access the value at a key that may not exist: - -```basic-usage.hack -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', -}; - -// Prints the value at key 'red' -\var_dump($m->get('red')); - -// Prints NULL since key 'blurple' doesn't exist -\var_dump($m->get('blurple')); -``` diff --git a/api-examples/class.HH.Map/getIterator.md b/api-examples/class.HH.Map/getIterator.md deleted file mode 100644 index f6f368165..000000000 --- a/api-examples/class.HH.Map/getIterator.md +++ /dev/null @@ -1,19 +0,0 @@ -This example shows how to get a `KeyedIterator` from a `Map` and how to consume it: - -```basic-usage.hack -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', -}; - -// Get an iterator for the Map of colors to hex codes -$iterator = $m->getIterator(); - -// Print each color (key) and hex code (value) using the iterator -while ($iterator->valid()) { - echo $iterator->key().' => '.$iterator->current()."\n"; - $iterator->next(); -} -``` diff --git a/api-examples/class.HH.Map/immutable.md b/api-examples/class.HH.Map/immutable.md deleted file mode 100644 index 794dd5a19..000000000 --- a/api-examples/class.HH.Map/immutable.md +++ /dev/null @@ -1,20 +0,0 @@ -```basic-usage.hack -function expects_immutable(ImmMap $iv): void { - \var_dump($iv); -} - -<<__EntryPoint>> -function basic_usage_main(): void { - $m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', - }; - - // Get a deep, immutable copy of $m - $immutable_map = $m->immutable(); - - expects_immutable($immutable_map); -} -``` diff --git a/api-examples/class.HH.Map/isEmpty.md b/api-examples/class.HH.Map/isEmpty.md deleted file mode 100644 index 858c96433..000000000 --- a/api-examples/class.HH.Map/isEmpty.md +++ /dev/null @@ -1,13 +0,0 @@ -```basic-usage.hack -$m = Map {}; -\var_dump($m->isEmpty()); - -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', - 'purple' => '#663399', -}; -\var_dump($m->isEmpty()); -``` diff --git a/api-examples/class.HH.Map/items.md b/api-examples/class.HH.Map/items.md deleted file mode 100644 index 51342c334..000000000 --- a/api-examples/class.HH.Map/items.md +++ /dev/null @@ -1,27 +0,0 @@ -This example shows that `items()` returns an `Iterable` view of the `Map`. The `Iterable` will produce the key-value pairs of the `Map` at the time it's iterated. - -```basic-usage.hack -<<__EntryPoint>> -function basic_usage_main(): void { - $m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', - }; - - // Get an Iterable view of the Map - $items = $m->items(); - - // Add another color to the original Map $m - $m->add(Pair {'purple', '#663399'}); - - // Print each color and hex code using the Iterable - foreach ($items as $key_value_pair) { - echo $key_value_pair[0].' => '.$key_value_pair[1]."\n"; - } -} - -// This wouldn't work because the Iterable interface is read-only: -// $iterable->add(Pair {'purple', '#ff6600'}); -``` diff --git a/api-examples/class.HH.Map/keys.md b/api-examples/class.HH.Map/keys.md deleted file mode 100644 index 87f472adb..000000000 --- a/api-examples/class.HH.Map/keys.md +++ /dev/null @@ -1,9 +0,0 @@ -```basic-usage.hack -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', -}; -\var_dump($m->keys()); -``` diff --git a/api-examples/class.HH.Map/lastKey.md b/api-examples/class.HH.Map/lastKey.md deleted file mode 100644 index a549c14ab..000000000 --- a/api-examples/class.HH.Map/lastKey.md +++ /dev/null @@ -1,14 +0,0 @@ -This example shows how `lastKey()` can be used even when a `Map` may be empty: - -```basic-usage.hack -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', -}; -\var_dump($m->lastKey()); - -$m = Map {}; -\var_dump($m->lastKey()); -``` diff --git a/api-examples/class.HH.Map/lastValue.md b/api-examples/class.HH.Map/lastValue.md deleted file mode 100644 index d671f0b0a..000000000 --- a/api-examples/class.HH.Map/lastValue.md +++ /dev/null @@ -1,14 +0,0 @@ -This example shows how `lastValue()` can be used even when a `Map` may be empty: - -```basic-usage.hack -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', -}; -\var_dump($m->lastValue()); - -$m = Map {}; -\var_dump($m->lastValue()); -``` diff --git a/api-examples/class.HH.Map/lazy.md b/api-examples/class.HH.Map/lazy.md deleted file mode 100644 index d82f32060..000000000 --- a/api-examples/class.HH.Map/lazy.md +++ /dev/null @@ -1,75 +0,0 @@ -This example shows you how to use `lazy()` on a rather large `Map` and the time for both a *strict* and *non-strict* version. Since we only need 5 of the elements in the end, the lazy view actually allows us to stop after we meet our required 5 without having to actually filter and allocate all 1000000 elements up front. - -```basic-usage.hack -$map = new Map(\range(0, 1000000)); - -$s = \microtime(true); -$non_lazy = $map->filter($x ==> $x % 2 === 0)->take(5); -$e = \microtime(true); - -\var_dump($non_lazy); -echo "Time non-lazy: ".\strval($e - $s).\PHP_EOL; - -// Using a lazy view of the Map can save us a bunch of time, possibly even -// cutting this call time by 90%. -$s = \microtime(true); -$lazy = $map->lazy()->filter($x ==> $x % 2 === 0)->take(5); -$e = \microtime(true); - -\var_dump(new Map($lazy)); -echo "Time lazy: ".\strval($e - $s).\PHP_EOL; -```.hhvm.expectf -object(HH\Map) (5) { - [0]=> - int(0) - [2]=> - int(2) - [4]=> - int(4) - [6]=> - int(6) - [8]=> - int(8) -} -Time non-lazy: %f -object(HH\Map) (5) { - [0]=> - int(0) - [2]=> - int(2) - [4]=> - int(4) - [6]=> - int(6) - [8]=> - int(8) -} -Time lazy: %f -```.example.hhvm.out -object(HH\Map) (5) { - [0]=> - int(0) - [2]=> - int(2) - [4]=> - int(4) - [6]=> - int(6) - [8]=> - int(8) -} -Time non-lazy: 0.11302947998047 -object(HH\Map) (5) { - [0]=> - int(0) - [2]=> - int(2) - [4]=> - int(4) - [6]=> - int(6) - [8]=> - int(8) -} -Time lazy: 0.0068733692169189 -``` diff --git a/api-examples/class.HH.Map/map.md b/api-examples/class.HH.Map/map.md deleted file mode 100644 index 5d9b3b80d..000000000 --- a/api-examples/class.HH.Map/map.md +++ /dev/null @@ -1,30 +0,0 @@ -In this example the `Map`'s values are mapped to the same type (`string`s): - -```map-to-strings.hack -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', -}; - -$capitalized = $m->map(fun('strtoupper')); -\var_dump($capitalized); - -$css_colors = $capitalized->map($hex_code ==> "color: {$hex_code};"); -\var_dump($css_colors); -``` - -In this example the `Map`'s values are mapped to a different type (`int`s): - -```map-to-ints.hack -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', -}; - -$decimal_codes = $m->map(fun('hexdec')); -\var_dump($decimal_codes); -``` diff --git a/api-examples/class.HH.Map/mapWithKey.md b/api-examples/class.HH.Map/mapWithKey.md deleted file mode 100644 index 2d2c43863..000000000 --- a/api-examples/class.HH.Map/mapWithKey.md +++ /dev/null @@ -1,16 +0,0 @@ -This example shows how `mapWithKey` can be used to create a new `Map` based on `$m`'s keys and values: - -```basic-usage.hack -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', -}; - -$css_colors = $m->mapWithKey( - ($color, $hex_code) ==> "color: {$hex_code}; /* {$color} */", -); - -echo \implode("\n", $css_colors)."\n"; -``` diff --git a/api-examples/class.HH.Map/remove.md b/api-examples/class.HH.Map/remove.md deleted file mode 100644 index d38a9c8c7..000000000 --- a/api-examples/class.HH.Map/remove.md +++ /dev/null @@ -1,18 +0,0 @@ -Since `Map::remove()` returns a [shallow copy](https://en.wikipedia.org/wiki/Object_copying#Shallow_copy) of `$m` itself, you can chain a bunch of `remove()` calls together. - -```basic-usage.hack -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', -}; - -// Remove key 'red' -$m->remove('red'); -\var_dump($m); - -// Remove keys 'green' and 'blue' -$m->remove('green')->remove('blue'); -\var_dump($m); -``` diff --git a/api-examples/class.HH.Map/removeKey.md b/api-examples/class.HH.Map/removeKey.md deleted file mode 100644 index 1ff77f4f7..000000000 --- a/api-examples/class.HH.Map/removeKey.md +++ /dev/null @@ -1,18 +0,0 @@ -Since `Map::removeKey()` returns a [shallow copy](https://en.wikipedia.org/wiki/Object_copying#Shallow_copy) of `$m` itself, you can chain a bunch of `removeKey()` calls together. - -```basic-usage.hack -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', -}; - -// Remove key 'red' -$m->removeKey('red'); -\var_dump($m); - -// Remove keys 'green' and 'blue' -$m->removeKey('green')->removeKey('blue'); -\var_dump($m); -``` diff --git a/api-examples/class.HH.Map/reserve.md b/api-examples/class.HH.Map/reserve.md deleted file mode 100644 index 72d1845bd..000000000 --- a/api-examples/class.HH.Map/reserve.md +++ /dev/null @@ -1,17 +0,0 @@ -This example reserves space for 1000 elements and then fills the `Map` with 1000 integer keys and values: - -```basic-usage.hack no-auto-output -const int MAP_SIZE = 1000; - -<<__EntryPoint>> -function basic_usage_main(): void { - $m = Map {}; - $m->reserve(MAP_SIZE); - - for ($i = 0; $i < MAP_SIZE; $i++) { - $m[$i] = $i * 10; - } - - \var_dump($m); -} -``` diff --git a/api-examples/class.HH.Map/set.md b/api-examples/class.HH.Map/set.md deleted file mode 100644 index 53fb41671..000000000 --- a/api-examples/class.HH.Map/set.md +++ /dev/null @@ -1,19 +0,0 @@ -Since `Map::set()` returns a [shallow copy](https://en.wikipedia.org/wiki/Object_copying#Shallow_copy) of `$m` itself, you can chain a bunch of `set()` calls together. - -```basic-usage.hack -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', -}; - -// Set the value at key 'red' -$m->set('red', 'rgb(255, 0, 0)'); - -// Set the values at keys 'green' and 'blue' -$m->set('green', 'rgb(0, 255, 0)') - ->set('blue', 'rgb(0, 0, 255)'); - -\var_dump($m); -``` diff --git a/api-examples/class.HH.Map/setAll.md b/api-examples/class.HH.Map/setAll.md deleted file mode 100644 index df40b721b..000000000 --- a/api-examples/class.HH.Map/setAll.md +++ /dev/null @@ -1,24 +0,0 @@ -This example shows how `setAll()` can be used with any `KeyedTraversable`: - -```basic-usage.hack -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', -}; - -// Set the values at keys 'red' and 'green' -$m->setAll(Map { - 'red' => 'rgb(255, 0, 0)', - 'green' => 'rgb(0, 255, 0)', -}); - -// Set the values at keys 'blue' and 'yellow' with an associative array -$m->setAll(darray[ - 'blue' => 'rgb(0, 0, 255)', - 'yellow' => 'rgb(255, 255, 0)', -]); - -\var_dump($m); -``` diff --git a/api-examples/class.HH.Map/skip.md b/api-examples/class.HH.Map/skip.md deleted file mode 100644 index 19393eec3..000000000 --- a/api-examples/class.HH.Map/skip.md +++ /dev/null @@ -1,13 +0,0 @@ -```basic-usage.hack -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', -}; - -// Create a new Map after skipping the first two elements ('red' and 'green') -$skip2 = $m->skip(2); - -\var_dump($skip2); -``` diff --git a/api-examples/class.HH.Map/slice.md b/api-examples/class.HH.Map/slice.md deleted file mode 100644 index a61d32ee6..000000000 --- a/api-examples/class.HH.Map/slice.md +++ /dev/null @@ -1,14 +0,0 @@ -```basic-usage.hack -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', - 'purple' => '#663399', -}; - -// Start at key index 1 ('green') and include 3 elements -$m2 = $m->slice(1, 3); - -\var_dump($m2); -``` diff --git a/api-examples/class.HH.Map/take.md b/api-examples/class.HH.Map/take.md deleted file mode 100644 index 234aa4c79..000000000 --- a/api-examples/class.HH.Map/take.md +++ /dev/null @@ -1,14 +0,0 @@ -```basic-usage.hack -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', - 'purple' => '#663399', -}; - -// Take the first two elements -$take2 = $m->take(2); - -\var_dump($take2); -``` diff --git a/api-examples/class.HH.Map/toDArray.md b/api-examples/class.HH.Map/toDArray.md deleted file mode 100644 index 72b7e9f80..000000000 --- a/api-examples/class.HH.Map/toDArray.md +++ /dev/null @@ -1,14 +0,0 @@ -```basic-usage.hack -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', - 'purple' => '#663399', -}; - -$array = $m->toDArray(); - -\var_dump(\HH\is_any_array($array)); -\var_dump($array); -``` diff --git a/api-examples/class.HH.Map/toImmMap.md b/api-examples/class.HH.Map/toImmMap.md deleted file mode 100644 index 7f644d7dc..000000000 --- a/api-examples/class.HH.Map/toImmMap.md +++ /dev/null @@ -1,20 +0,0 @@ -```basic-usage.hack -function expects_immutable(ImmMap $iv): void { - \var_dump($iv); -} - -<<__EntryPoint>> -function basic_usage_main(): void { - $m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', - }; - - // Get a deep, immutable copy of $m - $immutable_map = $m->toImmMap(); - - expects_immutable($immutable_map); -} -``` diff --git a/api-examples/class.HH.Map/toImmSet.md b/api-examples/class.HH.Map/toImmSet.md deleted file mode 100644 index 527344f9c..000000000 --- a/api-examples/class.HH.Map/toImmSet.md +++ /dev/null @@ -1,19 +0,0 @@ -This example shows that converting a `Map` to an `ImmSet` also removes duplicate values: - -```basic-usage.hack -// This Map contains repetitions of the hex codes for 'red' and 'blue' -$m = Map { - 'red' => '#ff0000', - 'also red' => '#ff0000', - 'green' => '#00ff00', - 'another red' => '#ff0000', - 'blue' => '#0000ff', - 'another blue' => '#0000ff', - 'yellow' => '#ffff00', -}; - -$imm_set = $m->toImmSet(); - -\var_dump($imm_set is \HH\ImmSet<_>); -\var_dump($imm_set); -``` diff --git a/api-examples/class.HH.Map/toImmVector.md b/api-examples/class.HH.Map/toImmVector.md deleted file mode 100644 index 15b374d56..000000000 --- a/api-examples/class.HH.Map/toImmVector.md +++ /dev/null @@ -1,25 +0,0 @@ -This example shows that `toImmVector` returns an immutable copy of the `Map`'s values. Mutating the `Vector` of values doesn't affect the original `Map` and vice-versa. - -```basic-usage.hack -function expects_immutable(ImmVector $iv): void { - \var_dump($iv); -} - -<<__EntryPoint>> -function basic_usage_main(): void { - $m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', - }; - - // Get an immutable Vector of $m's values - $immutable_v = $m->toImmVector(); - - // Add a color to the original Map $m - $m->add(Pair {'purple', '#663399'}); - - expects_immutable($immutable_v); -} -``` diff --git a/api-examples/class.HH.Map/toKeysArray.md b/api-examples/class.HH.Map/toKeysArray.md deleted file mode 100644 index 71438d138..000000000 --- a/api-examples/class.HH.Map/toKeysArray.md +++ /dev/null @@ -1,13 +0,0 @@ -```basic-usage.hack -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', -}; - -$keys_array = $m->toKeysArray(); - -\var_dump(\HH\is_any_array($keys_array)); -\var_dump($keys_array); -``` diff --git a/api-examples/class.HH.Map/toMap.md b/api-examples/class.HH.Map/toMap.md deleted file mode 100644 index 8f208e900..000000000 --- a/api-examples/class.HH.Map/toMap.md +++ /dev/null @@ -1,16 +0,0 @@ -This example shows that `toMap` returns a deep copy of the `Map` `$m`. Mutating the new `Map` `$m2` doesn't affect the original `Map`. - -```basic-usage.hack -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', -}; - -$m2 = $m->toMap(); -$m2->add(Pair {'purple', '#663399'}); - -\var_dump($m); -\var_dump($m2); -``` diff --git a/api-examples/class.HH.Map/toSet.md b/api-examples/class.HH.Map/toSet.md deleted file mode 100644 index 2cc21b8fb..000000000 --- a/api-examples/class.HH.Map/toSet.md +++ /dev/null @@ -1,19 +0,0 @@ -This example shows that converting a `Map` to a `Set` also removes duplicate values: - -```basic-usage.hack -// This Map contains repetitions of the hex codes for 'red' and 'blue' -$m = Map { - 'red' => '#ff0000', - 'also red' => '#ff0000', - 'green' => '#00ff00', - 'another red' => '#ff0000', - 'blue' => '#0000ff', - 'another blue' => '#0000ff', - 'yellow' => '#ffff00', -}; - -$set = $m->toSet(); - -\var_dump($set is \HH\Set<_>); -\var_dump($set); -``` diff --git a/api-examples/class.HH.Map/toValuesArray.md b/api-examples/class.HH.Map/toValuesArray.md deleted file mode 100644 index 6137520bd..000000000 --- a/api-examples/class.HH.Map/toValuesArray.md +++ /dev/null @@ -1,13 +0,0 @@ -```basic-usage.hack -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', -}; - -$array = $m->toValuesArray(); - -\var_dump(\HH\is_any_array($array)); -\var_dump($array); -``` diff --git a/api-examples/class.HH.Map/toVector.md b/api-examples/class.HH.Map/toVector.md deleted file mode 100644 index d0b4733cb..000000000 --- a/api-examples/class.HH.Map/toVector.md +++ /dev/null @@ -1,20 +0,0 @@ -This example shows how `toVector()` returns a `Vector` of `$m`'s values, so mutating this new `Vector` doesn't affect the original `Map`. - -```basic-usage.hack -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', -}; - -// Make a deep Vector copy of the values of $m -$v = $m->toVector(); - -// Modify $v by adding an element -$v->add('#663399'); -\var_dump($v); - -// The original Map $m doesn't include the value '#663399' -\var_dump($m); -``` diff --git a/api-examples/class.HH.Map/values.md b/api-examples/class.HH.Map/values.md deleted file mode 100644 index 95a9d364c..000000000 --- a/api-examples/class.HH.Map/values.md +++ /dev/null @@ -1,20 +0,0 @@ -This example shows how `values()` is identical to `toVector()`. It returns a new `Vector` of `$m`'s values, so mutating this new `Vector` doesn't affect the original `Map`. - -```basic-usage.hack -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', -}; - -// Get a Vector of $m's values -$v = $m->values(); - -// Modify $v by adding an element -$v->add('#663399'); -\var_dump($v); - -// The original Map $m doesn't include the value '#663399' -\var_dump($m); -``` diff --git a/api-examples/class.HH.Map/zip.md b/api-examples/class.HH.Map/zip.md deleted file mode 100644 index 4a871b6e3..000000000 --- a/api-examples/class.HH.Map/zip.md +++ /dev/null @@ -1,22 +0,0 @@ -This example shows how `zip` combines the values of the `Map` and another `Traversable`. The resulting `Map` `$labeled_colors` has three elements because `$labels` doesn't have a fourth element to pair with `$m`. - -```basic-usage.hack -$m = Map { - 'red' => '#ff0000', - 'green' => '#00ff00', - 'blue' => '#0000ff', - 'yellow' => '#ffff00', - 'purple' => '#663399', -}; - -$labels = Vector {'My Favorite', 'My 2nd Favorite', 'My 3rd Favorite'}; -$labeled_colors = $m->zip($labels); - -\var_dump($labeled_colors->count()); // 3 - -foreach ($labeled_colors as $color => $pair) { - $hex_code = $pair[0]; - $label = $pair[1]; - echo "{$label}: {$color} ($hex_code)\n"; -} -``` diff --git a/api-examples/class.HH.Pair/__toString.md b/api-examples/class.HH.Pair/__toString.md deleted file mode 100644 index 6ec9a0a2f..000000000 --- a/api-examples/class.HH.Pair/__toString.md +++ /dev/null @@ -1,9 +0,0 @@ -The string version of a `Pair` is always `"Pair"`: - -```basic-usage.hack -$p = Pair {-1, 5}; -echo $p->__toString()."\n"; - -$p2 = Pair {'foo', 'bar'}; -echo $p2->__toString()."\n"; -``` diff --git a/api-examples/class.HH.Pair/at.md b/api-examples/class.HH.Pair/at.md deleted file mode 100644 index 0c5cca376..000000000 --- a/api-examples/class.HH.Pair/at.md +++ /dev/null @@ -1,20 +0,0 @@ -This example prints the first and second values of the `Pair`: - -```existing-key.hack -$p = Pair {'foo', -1.5}; - -// Print the first element -\var_dump($p->at(0)); - -// Print the second element -\var_dump($p->at(1)); -``` - -This example throws an `OutOfBoundsException` because a `Pair` only has the indexes `0` and `1`: - -```missing-key.hack -$p = Pair {'foo', -1.5}; - -// Index 2 doesn't exist because pairs always have exactly two elements -\var_dump($p->at(2)); -``` diff --git a/api-examples/class.HH.Pair/concat.md b/api-examples/class.HH.Pair/concat.md deleted file mode 100644 index ac0aeea0f..000000000 --- a/api-examples/class.HH.Pair/concat.md +++ /dev/null @@ -1,8 +0,0 @@ -This example creates a new `ImmVector` by concatenating a `Traversable` with the values in the `Pair`. - -```basic-usage.hack -$p = Pair {'foo', -1.5}; - -$v = $p->concat(vec[100, 'bar']); -\var_dump($v); -``` diff --git a/api-examples/class.HH.Pair/containsKey.md b/api-examples/class.HH.Pair/containsKey.md deleted file mode 100644 index e6aa6a5b8..000000000 --- a/api-examples/class.HH.Pair/containsKey.md +++ /dev/null @@ -1,12 +0,0 @@ -```basic-usage.hack -$p = Pair {'foo', -1.5}; - -// Prints "true", since index 0 is the first value -\var_dump($p->containsKey(0)); - -// Prints "true", since index 1 is the second value -\var_dump($p->containsKey(1)); - -// Prints "false", since a Pair only has index 0 and index 1 -\var_dump($p->containsKey(2)); -``` diff --git a/api-examples/class.HH.Pair/count.md b/api-examples/class.HH.Pair/count.md deleted file mode 100644 index 7f5977c78..000000000 --- a/api-examples/class.HH.Pair/count.md +++ /dev/null @@ -1,9 +0,0 @@ -This shows that a `Pair` always has a count of `2`: - -```basic-usage.hack -$p = Pair {'foo', -1.5}; -\var_dump($p->count()); - -$p = Pair {null, null}; -\var_dump($p->count()); -``` diff --git a/api-examples/class.HH.Pair/filter.md b/api-examples/class.HH.Pair/filter.md deleted file mode 100644 index 0bb1cc75b..000000000 --- a/api-examples/class.HH.Pair/filter.md +++ /dev/null @@ -1,6 +0,0 @@ -```basic-usage.hack -$p = Pair {-1.5, null}; - -$v = $p->filter($value ==> $value !== null); -\var_dump($v); -``` diff --git a/api-examples/class.HH.Pair/firstKey.md b/api-examples/class.HH.Pair/firstKey.md deleted file mode 100644 index 93d2f2aec..000000000 --- a/api-examples/class.HH.Pair/firstKey.md +++ /dev/null @@ -1,4 +0,0 @@ -```basic-usage.hack -$p = Pair {'foo', -1.5}; -\var_dump($p->firstKey()); -``` diff --git a/api-examples/class.HH.Pair/firstValue.md b/api-examples/class.HH.Pair/firstValue.md deleted file mode 100644 index 6009d341e..000000000 --- a/api-examples/class.HH.Pair/firstValue.md +++ /dev/null @@ -1,4 +0,0 @@ -```basic-usage.hack -$p = Pair {'foo', -1.5}; -\var_dump($p->firstValue()); -``` diff --git a/api-examples/class.HH.Pair/get.md b/api-examples/class.HH.Pair/get.md deleted file mode 100644 index 9fb11793e..000000000 --- a/api-examples/class.HH.Pair/get.md +++ /dev/null @@ -1,12 +0,0 @@ -```basic-usage.hack -$p = Pair {'foo', -1.5}; - -// Print the first value -\var_dump($p->get(0)); - -// Print the second value -\var_dump($p->get(1)); - -// Print NULL since index 2 doesn't exist in a Pair -\var_dump($p->get(2)); -``` diff --git a/api-examples/class.HH.Pair/getIterator.md b/api-examples/class.HH.Pair/getIterator.md deleted file mode 100644 index 7069520ba..000000000 --- a/api-examples/class.HH.Pair/getIterator.md +++ /dev/null @@ -1,14 +0,0 @@ -This example shows how to get an iterator from a `Pair` and how to consume it: - -```basic-usage.hack -$p = Pair {'foo', -1.5}; - -// Get a KeyedIterator for the Pair -$iterator = $p->getIterator(); - -// Print both keys and values -while ($iterator->valid()) { - echo $iterator->key().' => '.(string)$iterator->current()."\n"; - $iterator->next(); -} -``` diff --git a/api-examples/class.HH.Pair/isEmpty.md b/api-examples/class.HH.Pair/isEmpty.md deleted file mode 100644 index aa1b878e0..000000000 --- a/api-examples/class.HH.Pair/isEmpty.md +++ /dev/null @@ -1,9 +0,0 @@ -This example shows that a `Pair` can never be empty: - -```basic-usage.hack -$p = Pair {'foo', -1.5}; -\var_dump($p->isEmpty()); - -$p = Pair {null, -1.5}; -\var_dump($p->isEmpty()); -``` diff --git a/api-examples/class.HH.Pair/items.md b/api-examples/class.HH.Pair/items.md deleted file mode 100644 index 6d63939c7..000000000 --- a/api-examples/class.HH.Pair/items.md +++ /dev/null @@ -1,11 +0,0 @@ -```basic-usage.hack -$p = Pair {'foo', -1.5}; - -// Get an Iterable view of the Pair -$iterable = $p->items(); - -// Print both values in the Iterable -foreach ($iterable as $value) { - echo (string)$value."\n"; -} -``` diff --git a/api-examples/class.HH.Pair/keys.md b/api-examples/class.HH.Pair/keys.md deleted file mode 100644 index 95a4a65b0..000000000 --- a/api-examples/class.HH.Pair/keys.md +++ /dev/null @@ -1,4 +0,0 @@ -```basic-usage.hack -$p = Pair {'foo', -1.5}; -\var_dump($p->keys()); -``` diff --git a/api-examples/class.HH.Pair/lastKey.md b/api-examples/class.HH.Pair/lastKey.md deleted file mode 100644 index a668f77ec..000000000 --- a/api-examples/class.HH.Pair/lastKey.md +++ /dev/null @@ -1,4 +0,0 @@ -```basic-usage.hack -$p = Pair {'foo', -1.5}; -\var_dump($p->lastKey()); -``` diff --git a/api-examples/class.HH.Pair/lastValue.md b/api-examples/class.HH.Pair/lastValue.md deleted file mode 100644 index 0d8289c96..000000000 --- a/api-examples/class.HH.Pair/lastValue.md +++ /dev/null @@ -1,4 +0,0 @@ -```basic-usage.hack -$p = Pair {'foo', -1.5}; -\var_dump($p->lastValue()); -``` diff --git a/api-examples/class.HH.Pair/linearSearch.md b/api-examples/class.HH.Pair/linearSearch.md deleted file mode 100644 index 65ce7bdfc..000000000 --- a/api-examples/class.HH.Pair/linearSearch.md +++ /dev/null @@ -1,12 +0,0 @@ -```basic-usage.hack -$p = Pair {'foo', -1.5}; - -// Prints 0 (the index of the first value) -\var_dump($p->linearSearch('foo')); - -// Prints 1 (the index of the second value) -\var_dump($p->linearSearch(-1.5)); - -// Prints -1 (the value doesn't exist in the Pair) -\var_dump($p->linearSearch('bar')); -``` diff --git a/api-examples/class.HH.Pair/map.md b/api-examples/class.HH.Pair/map.md deleted file mode 100644 index 368bb983e..000000000 --- a/api-examples/class.HH.Pair/map.md +++ /dev/null @@ -1,13 +0,0 @@ -In this example the `Pair`'s values are mapped to `0` if they're `NULL`: - -```basic-usage.hack -$p = Pair {null, -1.5}; - -$immutable_v = $p->map($value ==> { - if ($value === null) { - return 0; - } - return $value; -}); -\var_dump($immutable_v); -``` diff --git a/api-examples/class.HH.Pair/skip.md b/api-examples/class.HH.Pair/skip.md deleted file mode 100644 index 5a7378a6d..000000000 --- a/api-examples/class.HH.Pair/skip.md +++ /dev/null @@ -1,12 +0,0 @@ -```basic-usage.hack -$p = Pair {'foo', -1.5}; - -// Skipping 0 returns an ImmVector of both values -\var_dump($p->skip(0)); - -// Skipping 1 returns an ImmVector of the second value -\var_dump($p->skip(1)); - -// Skipping more than 1 returns an empty ImmVector -\var_dump($p->skip(2)); -``` diff --git a/api-examples/class.HH.Pair/slice.md b/api-examples/class.HH.Pair/slice.md deleted file mode 100644 index e7f4a6296..000000000 --- a/api-examples/class.HH.Pair/slice.md +++ /dev/null @@ -1,12 +0,0 @@ -```basic-usage.hack -$p = Pair {'foo', -1.5}; - -// Get an ImmVector of both values -\var_dump($p->slice(0, 2)); - -// Get an ImmVector of the first value -\var_dump($p->slice(0, 1)); - -// Get an ImmVector of the second value -\var_dump($p->slice(1, 1)); -``` diff --git a/api-examples/class.HH.Pair/take.md b/api-examples/class.HH.Pair/take.md deleted file mode 100644 index df3f570ae..000000000 --- a/api-examples/class.HH.Pair/take.md +++ /dev/null @@ -1,12 +0,0 @@ -```basic-usage.hack -$p = Pair {'foo', -1.5}; - -// Taking 0 returns an empty ImmVector -\var_dump($p->take(0)); - -// Taking 1 returns an ImmVector of the first value -\var_dump($p->take(1)); - -// Taking 2 (or more) returns an ImmVector containing both values -\var_dump($p->take(2)); -``` diff --git a/api-examples/class.HH.Pair/toImmMap.md b/api-examples/class.HH.Pair/toImmMap.md deleted file mode 100644 index 184afa0e7..000000000 --- a/api-examples/class.HH.Pair/toImmMap.md +++ /dev/null @@ -1,8 +0,0 @@ -```basic-usage.hack -$p = Pair {'foo', -1.5}; - -$imm_map = $p->toImmMap(); - -\var_dump($imm_map is \HH\ImmMap<_, _>); -\var_dump($imm_map); -``` diff --git a/api-examples/class.HH.Pair/toImmSet.md b/api-examples/class.HH.Pair/toImmSet.md deleted file mode 100644 index 746f10a54..000000000 --- a/api-examples/class.HH.Pair/toImmSet.md +++ /dev/null @@ -1,20 +0,0 @@ -This example shows that converting a `Pair` to an `ImmSet` also removes duplicate values: - -```basic-usage.hack -// This Pair contains 'foo' twice -$p = Pair {'foo', 'foo'}; - -$imm_set = $p->toImmSet(); -\var_dump($imm_set); -``` - -This example shows that converting a `Pair` to an `ImmSet` will throw a fatal error if the `Pair` contains a value that's not a `string` or an `int`: - -```runtime-fatal.hack -$p = Pair {'foo', -1.5}; - -/* HH_FIXME[4323] Fatal error will be thrown here */ -$imm_set = $p->toImmSet(); - -\var_dump($imm_set); -``` diff --git a/api-examples/class.HH.Pair/toImmVector.md b/api-examples/class.HH.Pair/toImmVector.md deleted file mode 100644 index 0e2df9448..000000000 --- a/api-examples/class.HH.Pair/toImmVector.md +++ /dev/null @@ -1,7 +0,0 @@ -```basic-usage.hack -$p = Pair {'foo', -1.5}; - -$immutable_v = $p->toImmVector(); - -\var_dump($immutable_v); -``` diff --git a/api-examples/class.HH.Pair/toKeysArray.md b/api-examples/class.HH.Pair/toKeysArray.md deleted file mode 100644 index f43e22914..000000000 --- a/api-examples/class.HH.Pair/toKeysArray.md +++ /dev/null @@ -1,5 +0,0 @@ -```basic-usage.hack -$p = Pair {'foo', -1.5}; - -\var_dump($p->toKeysArray()); -``` diff --git a/api-examples/class.HH.Pair/toMap.md b/api-examples/class.HH.Pair/toMap.md deleted file mode 100644 index 5c29d55e5..000000000 --- a/api-examples/class.HH.Pair/toMap.md +++ /dev/null @@ -1,8 +0,0 @@ -```basic-usage.hack -$p = Pair {'foo', -1.5}; - -$map = $p->toMap(); - -\var_dump($map is \HH\Map<_, _>); -\var_dump($map); -``` diff --git a/api-examples/class.HH.Pair/toSet.md b/api-examples/class.HH.Pair/toSet.md deleted file mode 100644 index ea75d47b6..000000000 --- a/api-examples/class.HH.Pair/toSet.md +++ /dev/null @@ -1,20 +0,0 @@ -This example shows that converting a `Pair` to a `Set` also removes duplicate values: - -```basic-usage.hack -// This Pair contains 'foo' twice -$p = Pair {'foo', 'foo'}; - -$s = $p->toSet(); -\var_dump($s); -``` - -This example shows that converting a `Pair` to a `Set` will throw a fatal error if the `Pair` contains a value that's not a `string` or an `int`: - -```runtime-fatal.hack -$p = Pair {'foo', -1.5}; - -/* HH_FIXME[4323] Fatal error will be thrown here */ -$s = $p->toSet(); - -\var_dump($s); -``` diff --git a/api-examples/class.HH.Pair/toVArray.md b/api-examples/class.HH.Pair/toVArray.md deleted file mode 100644 index ed66ae67e..000000000 --- a/api-examples/class.HH.Pair/toVArray.md +++ /dev/null @@ -1,8 +0,0 @@ -```basic-usage.hack -$p = Pair {'foo', -1.5}; - -$array = $p->toVArray(); - -\var_dump(\HH\is_any_array($array)); -\var_dump($array); -``` diff --git a/api-examples/class.HH.Pair/toValuesArray.md b/api-examples/class.HH.Pair/toValuesArray.md deleted file mode 100644 index fb630dc08..000000000 --- a/api-examples/class.HH.Pair/toValuesArray.md +++ /dev/null @@ -1,8 +0,0 @@ -```basic-usage.hack -$p = Pair {'foo', -1.5}; - -$array = $p->toValuesArray(); - -\var_dump(\HH\is_any_array($array)); -\var_dump($array); -``` diff --git a/api-examples/class.HH.Pair/toVector.md b/api-examples/class.HH.Pair/toVector.md deleted file mode 100644 index 9ffd5fedb..000000000 --- a/api-examples/class.HH.Pair/toVector.md +++ /dev/null @@ -1,6 +0,0 @@ -```basic-usage.hack -$p = Pair {'foo', -1.5}; - -$v = $p->toVector(); -\var_dump($v); -``` diff --git a/api-examples/class.HH.Pair/values.md b/api-examples/class.HH.Pair/values.md deleted file mode 100644 index ba26f5a03..000000000 --- a/api-examples/class.HH.Pair/values.md +++ /dev/null @@ -1,7 +0,0 @@ -```basic-usage.hack -$p = Pair {'foo', -1.5}; - -$immutable_v = $p->values(); - -\var_dump($immutable_v); -``` diff --git a/api-examples/class.HH.Pair/zip.md b/api-examples/class.HH.Pair/zip.md deleted file mode 100644 index 4d078c6d2..000000000 --- a/api-examples/class.HH.Pair/zip.md +++ /dev/null @@ -1,10 +0,0 @@ -```basic-usage.hack -$p = Pair {'foo', -1.5}; - -$labels = Vector {'First Value', 'Second Value'}; -$labeled = $p->zip($labels); - -foreach ($labeled as list($value, $label)) { - echo $label.': '.(string)$value."\n"; -} -``` diff --git a/api-examples/class.HH.Set.md b/api-examples/class.HH.Set.md deleted file mode 100644 index 9c1bdfae3..000000000 --- a/api-examples/class.HH.Set.md +++ /dev/null @@ -1,3 +0,0 @@ -More documentation and examples are in the -[`Set` and `ImmSet`](/hack/arrays-and-collections/collections#set-and-immset) -guide. diff --git a/api-examples/class.HH.Set/__construct.md b/api-examples/class.HH.Set/__construct.md deleted file mode 100644 index 0cbf9cdf2..000000000 --- a/api-examples/class.HH.Set/__construct.md +++ /dev/null @@ -1,30 +0,0 @@ -This example shows how to create a `Set` from various `Traversable`s. Notice that duplicate values in the input `Traversable`s only appear once in the output `Set`. - -```basic-usage.hack -// Create a new Set from an array -$s = new Set(varray['red', 'green', 'red', 'blue', 'blue', 'yellow']); -\var_dump($s); - -// Create a new Set from a Vector -$s = new Set(Vector {'red', 'green', 'red', 'blue', 'blue', 'yellow'}); -\var_dump($s); - -// Create a new Set from the values of a Map -$s = new Set(Map { - 'red1' => 'red', - 'green' => 'green', - 'red2' => 'red', - 'blue1' => 'blue', - 'blue2' => 'blue', - 'yellow' => 'yellow', -}); -\var_dump($s); -``` - -This example shows how passing `null` to the constructor creates an empty `Set`: - -```null-empty.hack -// An empty Set is created if null is provided -$s = new Set(null); -\var_dump($s); -``` diff --git a/api-examples/class.HH.Set/__toString.md b/api-examples/class.HH.Set/__toString.md deleted file mode 100644 index 77854de42..000000000 --- a/api-examples/class.HH.Set/__toString.md +++ /dev/null @@ -1,12 +0,0 @@ -The string version of a `Set` is always `"Set"`: - -```basic-usage.hack -$s = Set {1, 2, 3}; -echo $s->__toString()."\n"; - -$s2 = Set {'a', 'b', 'c'}; -echo $s2->__toString()."\n"; - -$s3 = Set {}; -echo $s3->__toString()."\n"; -``` diff --git a/api-examples/class.HH.Set/add.md b/api-examples/class.HH.Set/add.md deleted file mode 100644 index 4bb3f7751..000000000 --- a/api-examples/class.HH.Set/add.md +++ /dev/null @@ -1,20 +0,0 @@ -The following example adds a single value to the `Set` `$s` and also adds multiple values to `$s` through chaining. Since `Set::add()` returns a [shallow copy](https://en.wikipedia.org/wiki/Object_copying#Shallow_copy) of `$s` itself, you can chain a bunch of `add()` calls together, and that will add all those values to `$s`. Notice that adding a value that already exists in the `Set` has no effect. - -```basic-usage.hack -$s = Set {}; - -$s->add('red'); -\var_dump($s); - -// Set::add returns the Set so it can be chained -$s->add('green') - ->add('blue') - ->add('yellow'); -\var_dump($s); - -// Adding an element that already exists in the Set has no effect -$s->add('green') - ->add('blue') - ->add('yellow'); -\var_dump($s); -``` diff --git a/api-examples/class.HH.Set/addAll.md b/api-examples/class.HH.Set/addAll.md deleted file mode 100644 index 1b315ff49..000000000 --- a/api-examples/class.HH.Set/addAll.md +++ /dev/null @@ -1,23 +0,0 @@ -The following example adds a collection of values to the `Set` `$s` and also adds multiple collections of values to `$s` through chaining. Since `Set::addAll()` returns a [shallow copy](https://en.wikipedia.org/wiki/Object_copying#Shallow_copy) of `$s` itself, you can chain a bunch of `addAll()` calls together, and that will add all those collection of values to `$s`. - -```basic-usage.hack -$s = Set {}; - -// Add all the values in a Vector -$s->addAll(Vector {'a', 'b'}); - -// Add all the values in a Set -$s->addAll(Set {'c', 'd'}); - -// Add all the values in a Map -$s->addAll(Map {'foo' => 'e', 'bar' => 'f'}); - -// Add all the values in an array -$s->addAll(varray['g', 'h']); - -// Set::addAll returns the Set so it can be chained -$s->addAll(ImmSet {'i', 'j'}) - ->addAll(ImmVector {'k', 'l'}); - -\var_dump($s); -``` diff --git a/api-examples/class.HH.Set/addAllKeysOf.md b/api-examples/class.HH.Set/addAllKeysOf.md deleted file mode 100644 index d920ae08f..000000000 --- a/api-examples/class.HH.Set/addAllKeysOf.md +++ /dev/null @@ -1,48 +0,0 @@ -This example adds `string` keys from a `Map` to a `Set` as its values: - -```string-keys.hack -$fruit_calories = Map { - 'apple' => 95, - 'orange' => 45, -}; - -$vegetable_calories = darray[ - 'cabbage' => 176, - 'potato' => 163, -]; - -$food_names = Set {}; - -// Add the keys from a Map -$food_names->addAllKeysOf($fruit_calories); - -// Add the keys from an associative array -$food_names->addAllKeysOf($vegetable_calories); - -\var_dump($food_names); -``` - -This example adds `int` keys from a `Map` to a `Set` as its values: - -```int-keys.hack -$uploaders_by_id = Map { - 4993063 => 'Amy Smith', - 9361760 => 'John Doe', -}; - -$commenters_by_id = darray[ - 4993063 => 'Amy Smith', - 7424854 => 'Jane Roe', - 5740542 => 'Joe Bloggs', -]; - -$all_ids = Set {}; - -// Add the keys from a Map -$all_ids->addAllKeysOf($uploaders_by_id); - -// Add the keys from an associative array -$all_ids->addAllKeysOf($commenters_by_id); - -\var_dump($all_ids); -``` diff --git a/api-examples/class.HH.Set/clear.md b/api-examples/class.HH.Set/clear.md deleted file mode 100644 index 91910594d..000000000 --- a/api-examples/class.HH.Set/clear.md +++ /dev/null @@ -1,7 +0,0 @@ -```basic-usage.hack -$s = Set {'red', 'green', 'blue', 'yellow'}; -\var_dump($s); - -$s->clear(); -\var_dump($s); -``` diff --git a/api-examples/class.HH.Set/concat.md b/api-examples/class.HH.Set/concat.md deleted file mode 100644 index ccf12cfe9..000000000 --- a/api-examples/class.HH.Set/concat.md +++ /dev/null @@ -1,15 +0,0 @@ -This example creates new `Set`s by concatenating other `Traversable`s. Unlike `Set::addAll()` this method returns a new `Set` (not a [shallow copy](https://en.wikipedia.org/wiki/Object_copying#Shallow_copy)). - -```basic-usage.hack -$s = Set {'red'}; - -// Add all the values in a Vector -$s1 = $s->concat(Vector {'green', 'blue'}); - -// Add all the values in an array -$s2 = $s1->concat(varray['yellow', 'purple']); - -\var_dump($s); // $s contains 'red' -\var_dump($s1); // $s1 contains 'red', 'green', 'blue' -\var_dump($s2); // $s2 contains 'red', 'green', 'blue', 'yellow', 'purple' -``` diff --git a/api-examples/class.HH.Set/contains.md b/api-examples/class.HH.Set/contains.md deleted file mode 100644 index 9cb282b2c..000000000 --- a/api-examples/class.HH.Set/contains.md +++ /dev/null @@ -1,9 +0,0 @@ -```basic-usage.hack -$s = Set {'red', 'green', 'blue', 'yellow'}; - -// Prints "true", since $s contains "red" -\var_dump($s->contains('red')); - -// Prints "false", since $s doesn't contain "blurple" -\var_dump($s->contains('blurple')); -``` diff --git a/api-examples/class.HH.Set/count.md b/api-examples/class.HH.Set/count.md deleted file mode 100644 index 0ea390f39..000000000 --- a/api-examples/class.HH.Set/count.md +++ /dev/null @@ -1,7 +0,0 @@ -```basic-usage.hack -$s = Set {}; -\var_dump($s->count()); - -$s = Set {'red', 'green', 'blue', 'yellow'}; -\var_dump($s->count()); -``` diff --git a/api-examples/class.HH.Set/filter.md b/api-examples/class.HH.Set/filter.md deleted file mode 100644 index fb4dbcd9c..000000000 --- a/api-examples/class.HH.Set/filter.md +++ /dev/null @@ -1,7 +0,0 @@ -```basic-usage.hack -$colors = Set {'red', 'green', 'blue', 'yellow'}; - -// Create a Set of colors that contain the letter 'l' -$l_colors = $colors->filter($color ==> \strpos($color, 'l') !== false); -\var_dump($l_colors); -``` diff --git a/api-examples/class.HH.Set/firstKey.md b/api-examples/class.HH.Set/firstKey.md deleted file mode 100644 index 3de9d46b3..000000000 --- a/api-examples/class.HH.Set/firstKey.md +++ /dev/null @@ -1,9 +0,0 @@ -This example shows that `firstKey` returns the first value in the `Set`. An empty `Set` will return `null` as its first key. - -```basic-usage.hack -$s = Set {'red', 'green', 'blue', 'yellow'}; -\var_dump($s->firstKey()); - -$s = Set {}; -\var_dump($s->firstKey()); -``` diff --git a/api-examples/class.HH.Set/firstValue.md b/api-examples/class.HH.Set/firstValue.md deleted file mode 100644 index 2a9f15b4d..000000000 --- a/api-examples/class.HH.Set/firstValue.md +++ /dev/null @@ -1,9 +0,0 @@ -The following example gets the first value from a `Set`. An empty `Set` will return `null` as its first value. - -```basic-usage.hack -$s = Set {'red', 'green', 'blue', 'yellow'}; -\var_dump($s->firstValue()); - -$s = Set {}; -\var_dump($s->firstValue()); -``` diff --git a/api-examples/class.HH.Set/fromArrays.md b/api-examples/class.HH.Set/fromArrays.md deleted file mode 100644 index 46a882ed3..000000000 --- a/api-examples/class.HH.Set/fromArrays.md +++ /dev/null @@ -1,11 +0,0 @@ -This example shows that duplicate values in the input arrays only appear once in the final `Set`: - -```basic-usage.hack -$s = Set::fromArrays( - varray['red'], - varray['green', 'blue'], - varray['yellow', 'red'], // Duplicate 'red' will be ignored -); - -\var_dump($s); -``` diff --git a/api-examples/class.HH.Set/fromItems.md b/api-examples/class.HH.Set/fromItems.md deleted file mode 100644 index c39b04065..000000000 --- a/api-examples/class.HH.Set/fromItems.md +++ /dev/null @@ -1,20 +0,0 @@ -```basic-usage.hack -// Create a new Set from an array -$s = Set::fromItems(varray['red', 'green', 'red', 'blue', 'blue', 'yellow']); -\var_dump($s); - -// Create a new Set from a Vector -$s = Set::fromItems(Vector {'red', 'green', 'red', 'blue', 'blue', 'yellow'}); -\var_dump($s); - -// Create a new Set from the values of a Map -$s = Set::fromItems(Map { - 'red1' => 'red', - 'green' => 'green', - 'red2' => 'red', - 'blue1' => 'blue', - 'blue2' => 'blue', - 'yellow' => 'yellow', -}); -\var_dump($s); -``` diff --git a/api-examples/class.HH.Set/fromKeysOf.md b/api-examples/class.HH.Set/fromKeysOf.md deleted file mode 100644 index 2fea0fa07..000000000 --- a/api-examples/class.HH.Set/fromKeysOf.md +++ /dev/null @@ -1,43 +0,0 @@ -This example creates new `Set`s from a string-keyed `Map` and associative array: - -```string-keys.hack -$fruit_calories = Map { - 'apple' => 95, - 'orange' => 45, -}; - -$vegetable_calories = darray[ - 'cabbage' => 176, - 'potato' => 163, -]; - -// Create a Set from the keys of a Map -$fruit_names = Set::fromKeysOf($fruit_calories); -\var_dump($fruit_names); - -// Create a Set from the keys of an associative array -$vegetable_names = Set::fromKeysOf($vegetable_calories); -\var_dump($vegetable_names); -``` - -This example creates new `Set`s from an int-keyed `Map` and associative array: - -```int-keys.hack -$uploaders_by_id = Map { - 4993063 => 'Amy Smith', - 9361760 => 'John Doe', -}; - -$commenters_by_id = darray[ - 7424854 => 'Jane Roe', - 5740542 => 'Joe Bloggs', -]; - -// Create a Set from the integer keys of a Map -$uploader_ids = Set::fromKeysOf($uploaders_by_id); -\var_dump($uploader_ids); // $uploader_ids contains 4993063, 9361760 - -// Create a Set from the integer keys of an associative array -$commenter_ids = Set::fromKeysOf($commenters_by_id); -\var_dump($commenter_ids); // $commenter_ids contains 7424854, 5740542 -``` diff --git a/api-examples/class.HH.Set/getIterator.md b/api-examples/class.HH.Set/getIterator.md deleted file mode 100644 index d198b8210..000000000 --- a/api-examples/class.HH.Set/getIterator.md +++ /dev/null @@ -1,14 +0,0 @@ -This example shows how to get an iterator from a `Set` and how to consume it: - -```basic-usage.hack -$s = Set {'red', 'green', 'blue', 'yellow'}; - -// Get an iterator for the Set of colors -$iterator = $s->getIterator(); - -// Print each color using the iterator -while ($iterator->valid()) { - echo $iterator->current()."\n"; - $iterator->next(); -} -``` diff --git a/api-examples/class.HH.Set/immutable.md b/api-examples/class.HH.Set/immutable.md deleted file mode 100644 index 4eaab3ab4..000000000 --- a/api-examples/class.HH.Set/immutable.md +++ /dev/null @@ -1,15 +0,0 @@ -```basic-usage.hack -function expects_immutable(ImmSet $is): void { - \var_dump($is); -} - -<<__EntryPoint>> -function basic_usage_main(): void { - $s = Set {'red', 'green', 'blue', 'yellow'}; - - // Get a deep, immutable copy of $s - $immutable_s = $s->immutable(); - - expects_immutable($immutable_s); -} -``` diff --git a/api-examples/class.HH.Set/isEmpty.md b/api-examples/class.HH.Set/isEmpty.md deleted file mode 100644 index e546f2403..000000000 --- a/api-examples/class.HH.Set/isEmpty.md +++ /dev/null @@ -1,7 +0,0 @@ -```basic-usage.hack -$s = Set {}; -\var_dump($s->isEmpty()); - -$s = Set {'red', 'green', 'blue', 'yellow'}; -\var_dump($s->isEmpty()); -``` diff --git a/api-examples/class.HH.Set/items.md b/api-examples/class.HH.Set/items.md deleted file mode 100644 index ddd506420..000000000 --- a/api-examples/class.HH.Set/items.md +++ /dev/null @@ -1,22 +0,0 @@ -This example shows that `items()` returns an `Iterable` view of the `Set`. The `Iterable` will produce the values of the `Set` at the time it's iterated. - -```basic-usage.hack -<<__EntryPoint>> -function basic_usage_main(): void { - $s = Set {'red', 'green', 'blue', 'yellow'}; - - // Get an Iterable view of the Set - $iterable = $s->items(); - - // Add another color to the original Set $s - $s->add('purple'); - - // Print each color using $iterable - foreach ($iterable as $color) { - echo $color."\n"; - } -} - -// This wouldn't work because the Iterable interface is read-only: -// $iterable->add('orange'); -``` diff --git a/api-examples/class.HH.Set/keys.md b/api-examples/class.HH.Set/keys.md deleted file mode 100644 index 8e627463c..000000000 --- a/api-examples/class.HH.Set/keys.md +++ /dev/null @@ -1,6 +0,0 @@ -This example shows that `keys()` returns a `Vector` of the `Set`'s values because `Set`s don't have keys: - -```basic-usage.hack -$s = Set {'red', 'green', 'blue', 'yellow'}; -\var_dump($s->keys()); -``` diff --git a/api-examples/class.HH.Set/lastKey.md b/api-examples/class.HH.Set/lastKey.md deleted file mode 100644 index 1d0e10c80..000000000 --- a/api-examples/class.HH.Set/lastKey.md +++ /dev/null @@ -1,9 +0,0 @@ -This example shows that `lastKey` returns the last value in the `Set`. An empty `Set` will return `null` as its last key/value. - -```basic-usage.hack -$s = Set {'red', 'green', 'blue', 'yellow'}; -\var_dump($s->lastKey()); - -$s = Set {}; -\var_dump($s->lastKey()); -``` diff --git a/api-examples/class.HH.Set/lastValue.md b/api-examples/class.HH.Set/lastValue.md deleted file mode 100644 index 1663e3f43..000000000 --- a/api-examples/class.HH.Set/lastValue.md +++ /dev/null @@ -1,9 +0,0 @@ -This example shows how `lastValue()` can be used even when a `Set` may be empty: - -```basic-usage.hack -$s = Set {'red', 'green', 'blue', 'yellow'}; -\var_dump($s->lastValue()); - -$s = Set {}; -\var_dump($s->lastValue()); -``` diff --git a/api-examples/class.HH.Set/lazy.md b/api-examples/class.HH.Set/lazy.md deleted file mode 100644 index bfe194d7d..000000000 --- a/api-examples/class.HH.Set/lazy.md +++ /dev/null @@ -1,55 +0,0 @@ -This example shows you how to use `lazy()` on a rather large `Set` and the time for both a *strict* and *non-strict* version. Since we only need 5 of the elements in the end, the lazy view actually allows us to stop after we meet our required 5 without having to actually filter and allocate all 1000000 elements up front. - -```basic-usage.hack -$set = new Set(\range(0, 1000000)); - -$s = \microtime(true); -$non_lazy = $set->filter($x ==> $x % 2 === 0)->take(5); -$e = \microtime(true); - -\var_dump($non_lazy); -echo "Time non-lazy: ".\strval($e - $s).\PHP_EOL; - -// Using a lazy view of the Set can save us a bunch of time, possibly even -// cutting this call time by 90%. -$s = \microtime(true); -$lazy = $set->lazy()->filter($x ==> $x % 2 === 0)->take(5); -$e = \microtime(true); - -\var_dump(new Set($lazy)); -echo "Time lazy: ".\strval($e - $s).\PHP_EOL; -```.hhvm.expectf -object(HH\Set) (5) { - int(0) - int(2) - int(4) - int(6) - int(8) -} -Time non-lazy: %f -object(HH\Set) (5) { - int(0) - int(2) - int(4) - int(6) - int(8) -} -Time lazy: %f -```.example.hhvm.out -object(HH\Set) (5) { - int(0) - int(2) - int(4) - int(6) - int(8) -} -Time non-lazy: 0.11553406715393 -object(HH\Set) (5) { - int(0) - int(2) - int(4) - int(6) - int(8) -} -Time lazy: 0.0063431262969971 -``` diff --git a/api-examples/class.HH.Set/map.md b/api-examples/class.HH.Set/map.md deleted file mode 100644 index d9b9c0e4c..000000000 --- a/api-examples/class.HH.Set/map.md +++ /dev/null @@ -1,20 +0,0 @@ -In this example the `Set`'s elements are mapped to the same type (`string`s): - -```map-to-strings.hack -$s = Set {'red', 'green', 'blue', 'yellow'}; - -$capitalized = $s->map(fun('strtoupper')); -\var_dump($capitalized); - -$shortened = $s->map($color ==> \substr($color, 0, 3)); -\var_dump($shortened); -``` - -In this example the `Set`'s elements are mapped to a different type (`int`s): - -```map-to-ints.hack -$s = Set {'red', 'green', 'blue', 'yellow'}; - -$lengths = $s->map(fun('strlen')); -\var_dump($lengths); -``` diff --git a/api-examples/class.HH.Set/remove.md b/api-examples/class.HH.Set/remove.md deleted file mode 100644 index 366fe23d4..000000000 --- a/api-examples/class.HH.Set/remove.md +++ /dev/null @@ -1,13 +0,0 @@ -This example shows that removing a value that doesn't exist in the `Set` has no effect: - -```basic-usage.hack -$s = Set {'red', 'green'}; - -// Remove 'red' from the Set -$s->remove('red'); -\var_dump($s); - -// Remove 'red' again (has no effect) -$s->remove('red'); -\var_dump($s); -``` diff --git a/api-examples/class.HH.Set/removeAll.md b/api-examples/class.HH.Set/removeAll.md deleted file mode 100644 index b4546dea8..000000000 --- a/api-examples/class.HH.Set/removeAll.md +++ /dev/null @@ -1,13 +0,0 @@ -This example removes multiple values from a `Set` and shows that the list of values to be removed can contain duplicates: - -```basic-usage.hack -$s = Set {'red', 'green', 'blue', 'yellow'}; - -$s->removeAll(Vector { - 'red', - 'blue', - 'red', -}); - -\var_dump($s); -``` diff --git a/api-examples/class.HH.Set/reserve.md b/api-examples/class.HH.Set/reserve.md deleted file mode 100644 index 294585945..000000000 --- a/api-examples/class.HH.Set/reserve.md +++ /dev/null @@ -1,17 +0,0 @@ -This example reserves space for 1000 elements and then fills the `Set` with 1000 integers: - -```basic-usage.hack no-auto-output -const int SET_SIZE = 1000; - -<<__EntryPoint>> -function basic_usage_main(): void { - $s = Set {}; - $s->reserve(SET_SIZE); - - for ($i = 0; $i < SET_SIZE; $i++) { - $s[] = $i * 10; - } - - \var_dump($s); -} -``` diff --git a/api-examples/class.HH.Set/retain.md b/api-examples/class.HH.Set/retain.md deleted file mode 100644 index 2b7bd92da..000000000 --- a/api-examples/class.HH.Set/retain.md +++ /dev/null @@ -1,7 +0,0 @@ -```basic-usage.hack -$s = Set {'red', 'green', 'blue', 'yellow'}; - -// Only keep values beginning with 'r' or 'b' -$s->retain($color ==> $color[0] === 'r' || $color[0] === 'b'); -\var_dump($s); -``` diff --git a/api-examples/class.HH.Set/skip.md b/api-examples/class.HH.Set/skip.md deleted file mode 100644 index 00e66a097..000000000 --- a/api-examples/class.HH.Set/skip.md +++ /dev/null @@ -1,8 +0,0 @@ -```basic-usage.hack -$s = Set {'red', 'green', 'blue', 'yellow'}; - -// Create a new Set after skipping the first two elements ('red' and 'green') -$skip2 = $s->skip(2); - -\var_dump($skip2); -``` diff --git a/api-examples/class.HH.Set/skipWhile.md b/api-examples/class.HH.Set/skipWhile.md deleted file mode 100644 index 23b534806..000000000 --- a/api-examples/class.HH.Set/skipWhile.md +++ /dev/null @@ -1,9 +0,0 @@ -This example shows how `skipWhile` can be used to create a new `Set` by skipping elements at the beginning of an existing `Set`: - -```basic-usage.hack -$s = Set {0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144}; - -// Skip values until we reach one over 10 -$s2 = $s->skipWhile($x ==> $x <= 10); -\var_dump($s2); -``` diff --git a/api-examples/class.HH.Set/slice.md b/api-examples/class.HH.Set/slice.md deleted file mode 100644 index 5dbee91e8..000000000 --- a/api-examples/class.HH.Set/slice.md +++ /dev/null @@ -1,8 +0,0 @@ -```basic-usage.hack -$s = Set {'red', 'green', 'blue', 'yellow'}; - -// Start at index 1 ('green') and include 3 elements -$s2 = $s->slice(1, 3); - -\var_dump($s2); -``` diff --git a/api-examples/class.HH.Set/take.md b/api-examples/class.HH.Set/take.md deleted file mode 100644 index d12d4a8e3..000000000 --- a/api-examples/class.HH.Set/take.md +++ /dev/null @@ -1,8 +0,0 @@ -```basic-usage.hack -$s = Set {'red', 'green', 'blue', 'yellow'}; - -// Take the first two elements -$take2 = $s->take(2); - -\var_dump($take2); -``` diff --git a/api-examples/class.HH.Set/takeWhile.md b/api-examples/class.HH.Set/takeWhile.md deleted file mode 100644 index 632d26922..000000000 --- a/api-examples/class.HH.Set/takeWhile.md +++ /dev/null @@ -1,9 +0,0 @@ -This example shows how `takeWhile` can be used to create a new `Set` by taking elements from the beginning of an existing `Set`: - -```basic-usage.hack -$s = Set {0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144}; - -// Include values until we reach one over 10 -$s2 = $s->takeWhile($x ==> $x <= 10); -\var_dump($s2); -``` diff --git a/api-examples/class.HH.Set/toDArray.md b/api-examples/class.HH.Set/toDArray.md deleted file mode 100644 index 29bdfb861..000000000 --- a/api-examples/class.HH.Set/toDArray.md +++ /dev/null @@ -1,8 +0,0 @@ -```basic-usage.hack -$s = Set {'red', 'green', 'blue', 'yellow'}; - -$array = $s->toDArray(); - -\var_dump(\HH\is_any_array($array)); -\var_dump($array); -``` diff --git a/api-examples/class.HH.Set/toImmMap.md b/api-examples/class.HH.Set/toImmMap.md deleted file mode 100644 index 4235ae5b1..000000000 --- a/api-examples/class.HH.Set/toImmMap.md +++ /dev/null @@ -1,8 +0,0 @@ -```basic-usage.hack -$s = Set {'red', 'green', 'blue', 'yellow'}; - -$imm_map = $s->toImmMap(); - -\var_dump($imm_map is \HH\ImmMap<_, _>); -\var_dump($imm_map); -``` diff --git a/api-examples/class.HH.Set/toImmSet.md b/api-examples/class.HH.Set/toImmSet.md deleted file mode 100644 index bc7fecc50..000000000 --- a/api-examples/class.HH.Set/toImmSet.md +++ /dev/null @@ -1,15 +0,0 @@ -```basic-usage.hack -function expects_immutable(ImmSet $is): void { - \var_dump($is); -} - -<<__EntryPoint>> -function basic_usage_main(): void { - $s = Set {'red', 'green', 'blue', 'yellow'}; - - // Get a deep, immutable copy of $s - $immutable_s = $s->toImmSet(); - - expects_immutable($immutable_s); -} -``` diff --git a/api-examples/class.HH.Set/toImmVector.md b/api-examples/class.HH.Set/toImmVector.md deleted file mode 100644 index 5bde184d8..000000000 --- a/api-examples/class.HH.Set/toImmVector.md +++ /dev/null @@ -1,20 +0,0 @@ -This example shows that `toImmVector` returns an `ImmVector` containing the `Set`'s values. Mutating the original `Set` doesn't affect the `ImmVector`. - -```basic-usage.hack -function expects_immutable(ImmVector $iv): void { - \var_dump($iv); -} - -<<__EntryPoint>> -function basic_usage_main(): void { - $s = Set {'red', 'green', 'blue', 'yellow'}; - - // Get an immutable Vector $v of the values in Set $s - $immutable_v = $s->toImmVector(); - - // Add a color to the original Set $s - $s->add('purple'); - - expects_immutable($immutable_v); -} -``` diff --git a/api-examples/class.HH.Set/toKeysArray.md b/api-examples/class.HH.Set/toKeysArray.md deleted file mode 100644 index 75afeaff3..000000000 --- a/api-examples/class.HH.Set/toKeysArray.md +++ /dev/null @@ -1,10 +0,0 @@ -This example shows that `toKeysArray` is the same as `toValuesArray` because `Set`s don't have keys: - -```basic-usage.hack -$s = Set {'red', 'green', 'blue', 'yellow'}; - -$keys_array = $s->toKeysArray(); - -\var_dump($keys_array === $s->toValuesArray()); -\var_dump($keys_array); -``` diff --git a/api-examples/class.HH.Set/toMap.md b/api-examples/class.HH.Set/toMap.md deleted file mode 100644 index ddc269393..000000000 --- a/api-examples/class.HH.Set/toMap.md +++ /dev/null @@ -1,8 +0,0 @@ -```basic-usage.hack -$s = Set {'red', 'green', 'blue', 'yellow'}; - -$map = $s->toMap(); - -\var_dump($map is \HH\Map<_, _>); -\var_dump($map); -``` diff --git a/api-examples/class.HH.Set/toSet.md b/api-examples/class.HH.Set/toSet.md deleted file mode 100644 index 7fd75607b..000000000 --- a/api-examples/class.HH.Set/toSet.md +++ /dev/null @@ -1,15 +0,0 @@ -This example shows that `toSet` returns a deep copy of the `Set`: - -```basic-usage.hack -$s = Set {'red', 'green', 'blue', 'yellow'}; - -// Make a deep copy of Set $s -$s2 = $s->toSet(); - -// Modify $s2 by adding an element -$s2->add('purple'); -\var_dump($s2); - -// The original Set $s doesn't include 'purple' -\var_dump($s); -``` diff --git a/api-examples/class.HH.Set/toVArray.md b/api-examples/class.HH.Set/toVArray.md deleted file mode 100644 index ddb1360b0..000000000 --- a/api-examples/class.HH.Set/toVArray.md +++ /dev/null @@ -1,8 +0,0 @@ -```basic-usage.hack -$s = Set {'red', 'green', 'blue', 'yellow'}; - -$array = $s->toVArray(); - -\var_dump(\HH\is_any_array($array)); -\var_dump($array); -``` diff --git a/api-examples/class.HH.Set/toValuesArray.md b/api-examples/class.HH.Set/toValuesArray.md deleted file mode 100644 index d238f4724..000000000 --- a/api-examples/class.HH.Set/toValuesArray.md +++ /dev/null @@ -1,8 +0,0 @@ -```basic-usage.hack -$s = Set {'red', 'green', 'blue', 'yellow'}; - -$array = $s->toValuesArray(); - -\var_dump(\HH\is_any_array($array)); -\var_dump($array); -``` diff --git a/api-examples/class.HH.Set/toVector.md b/api-examples/class.HH.Set/toVector.md deleted file mode 100644 index 77c4be820..000000000 --- a/api-examples/class.HH.Set/toVector.md +++ /dev/null @@ -1,7 +0,0 @@ -```basic-usage.hack -$s = Set {'red', 'green', 'blue', 'yellow'}; - -$v = $s->toVector(); - -\var_dump($v); -``` diff --git a/api-examples/class.HH.Set/values.md b/api-examples/class.HH.Set/values.md deleted file mode 100644 index 1da4fe7a4..000000000 --- a/api-examples/class.HH.Set/values.md +++ /dev/null @@ -1,7 +0,0 @@ -```basic-usage.hack -$s = Set {'red', 'green', 'blue', 'yellow'}; - -$v = $s->values(); - -\var_dump($v); -``` diff --git a/api-examples/class.HH.Set/zip.md b/api-examples/class.HH.Set/zip.md deleted file mode 100644 index 1aab0f0f2..000000000 --- a/api-examples/class.HH.Set/zip.md +++ /dev/null @@ -1,21 +0,0 @@ -This example shows that `zip` won't thrown an `Exception` if at least one of the current `Set` or the `$traversable` is empty: - -```empty-usage.hack -// The $traversable is empty so the result will be empty -$s = Set {'red', 'green', 'blue', 'yellow'}; -$zipped = $s->zip(Vector {}); -\var_dump($zipped); - -// The Set $s is empty so the result will be empty -$s = Set {}; -$zipped = $s->zip(Vector {'My Favorite', 'My Second Favorite'}); -\var_dump($zipped); -``` - -This example shows that `zip` will throw an `Exception` if the result is non-empty: - -```nonempty-exception.hack -$s = Set {'red', 'green', 'blue', 'yellow'}; -$zipped = $s->zip(Vector {'My Favorite', 'My Second Favorite'}); -\var_dump($zipped); -``` diff --git a/api-examples/class.HH.Shapes/idx.md b/api-examples/class.HH.Shapes/idx.md deleted file mode 100644 index 97a7d17e1..000000000 --- a/api-examples/class.HH.Shapes/idx.md +++ /dev/null @@ -1,36 +0,0 @@ -This example shows how to use `Shapes::idx` for keys that may or may not exist in a `Shape`: - -```basic-usage.hack -function run(shape('x' => int, 'y' => int, ?'z' => int) $point): void { - // The key 'x' exists in the Shape $point so it's returned - \var_dump(Shapes::idx($point, 'x')); - - // The key 'z' doesn't exist in $point so the default NULL is returned - \var_dump(Shapes::idx($point, 'z')); - - // The key 'z' doesn't exist in $point so our explicit default 0 is returned - \var_dump(Shapes::idx($point, 'z', 0)); -} - -<<__EntryPoint>> -function basic_usage_main(): void { - run(shape('x' => 3, 'y' => -1)); -} -``` - -This example shows that `Shapes::idx` will only return the default value if the key doesn't exist in the `Shape`. If the key exists but is `NULL` then `NULL` will be returned. - -```nullable-values.hack -function runNullable(shape('x' => ?int, 'y' => ?int, ...) $point): void { - // The key 'x' exists, so its value (3) is returned, not our explicit default 0 - \var_dump(Shapes::idx($point, 'x', 0)); - - // The key 'y' exists, so its value (NULL) is returned, not our explicit default 0 - \var_dump(Shapes::idx($point, 'y', 0)); -} - -<<__EntryPoint>> -function runNullableMain(): void { - runNullable(shape('x' => 3, 'y' => null)); -} -``` diff --git a/api-examples/class.HH.Shapes/keyExists.md b/api-examples/class.HH.Shapes/keyExists.md deleted file mode 100644 index fb0663334..000000000 --- a/api-examples/class.HH.Shapes/keyExists.md +++ /dev/null @@ -1,19 +0,0 @@ -This example shows that `keyExists` returns true if a key exists in the `Shape` (even if the corresponding value is `NULL`): - -```basic-usage.hack -function run(shape(?'x' => ?int, ?'y' => ?int, ?'z' => ?int) $point): void { - // The key 'x' exists in Shape $point - \var_dump(Shapes::keyExists($point, 'x')); - - // The key 'z' doesn't exist in $point - \var_dump(Shapes::keyExists($point, 'z')); - - // The key 'y' exists in $point, even though its value is NULL - \var_dump(Shapes::keyExists($point, 'y')); -} - -<<__EntryPoint>> -function basic_usage_main(): void { - run(shape('x' => 3, 'y' => null)); -} -``` diff --git a/api-examples/class.HH.Shapes/removeKey.md b/api-examples/class.HH.Shapes/removeKey.md deleted file mode 100644 index df1a4de8e..000000000 --- a/api-examples/class.HH.Shapes/removeKey.md +++ /dev/null @@ -1,19 +0,0 @@ -This example shows that `removeKey` directly removes a key from a `Shape`: - -```basic-usage.hack -function run(shape('x' => int, 'y' => int) $point): void { - // Prints the value at key 'y' - \var_dump($point['y']); - - Shapes::removeKey(inout $point, 'y'); - - // Prints NULL because the key 'y' doesn't exist any more - /* HH_IGNORE_ERROR[4251] typechecker knows the key doesn't exist */ - \var_dump(Shapes::idx($point, 'y')); -} - -<<__EntryPoint>> -function basic_usage_main(): void { - run(shape('x' => 3, 'y' => -1)); -} -``` diff --git a/api-examples/class.HH.Shapes/toArray.md b/api-examples/class.HH.Shapes/toArray.md deleted file mode 100644 index 27a0941dd..000000000 --- a/api-examples/class.HH.Shapes/toArray.md +++ /dev/null @@ -1,6 +0,0 @@ -This example shows that `toArray` will return the underlying array of a `Shape`. The result will be loosely typed because a single `Shape` can contain arbitrary different types (e.g. `string`, `int`, `float`). - -```basic-usage.hack -$point = shape('name' => 'Jane Doe', 'age' => 55, 'points' => 25.30); -\var_dump(Shapes::toArray($point)); -``` diff --git a/api-examples/class.HH.Vector/__construct.md b/api-examples/class.HH.Vector/__construct.md deleted file mode 100644 index bc9c25a0b..000000000 --- a/api-examples/class.HH.Vector/__construct.md +++ /dev/null @@ -1,28 +0,0 @@ -This example shows how to create a `Vector` from various `Traversable`s: - -```basic-usage.hack -// Create a new Vector from an array -$v = new Vector(varray['red', 'green', 'blue', 'yellow']); -\var_dump($v); - -// Create a new Vector from a Set -$v = new Vector(Set {'red', 'green', 'blue', 'yellow'}); -\var_dump($v); - -// Create a new Vector from the values of a Map -$v = new Vector(Map { - 'red' => 'red', - 'green' => 'green', - 'blue' => 'blue', - 'yellow' => 'yellow', -}); -\var_dump($v); -``` - -This example shows how passing `null` to the constructor creates an empty `Vector`: - -```null-empty.hack -// An empty Vector is created if null is provided -$v = new Vector(null); -\var_dump($v); -``` diff --git a/api-examples/class.HH.Vector/__toString.md b/api-examples/class.HH.Vector/__toString.md deleted file mode 100644 index 17efe72e8..000000000 --- a/api-examples/class.HH.Vector/__toString.md +++ /dev/null @@ -1,12 +0,0 @@ -The string version of an `ImmVector` is always `"ImmVector"`: - -```basic-usage.hack -$iv = ImmVector {1, 2, 3}; -echo $iv->__toString()."\n"; - -$iv2 = ImmVector {'a', 'b', 'c'}; -echo $iv2->__toString()."\n"; - -$iv3 = ImmVector {}; -echo $iv3->__toString()."\n"; -``` diff --git a/api-examples/class.HH.Vector/add.md b/api-examples/class.HH.Vector/add.md deleted file mode 100644 index 9479894e0..000000000 --- a/api-examples/class.HH.Vector/add.md +++ /dev/null @@ -1,14 +0,0 @@ -The following example adds a single value to the `Vector` `$v` and also adds multiple values to `$v` through chaining. Since `Vector::add()` returns a [shallow copy](https://en.wikipedia.org/wiki/Object_copying#Shallow_copy) of `$v` itself, you can chain a bunch of `add()` calls together, and that will add all those values to `$v`. - -```basic-usage.hack -$v = Vector {}; - -$v->add('red'); -\var_dump($v); - -// Vector::add returns the Vector so it can be chained -$v->add('green') - ->add('blue') - ->add('yellow'); -\var_dump($v); -``` diff --git a/api-examples/class.HH.Vector/addAll.md b/api-examples/class.HH.Vector/addAll.md deleted file mode 100644 index dba4f8f73..000000000 --- a/api-examples/class.HH.Vector/addAll.md +++ /dev/null @@ -1,23 +0,0 @@ -The following example adds a collection of values to the `Vector` `$v` and also adds multiple collections of values to `$v` through chaining. Since `Vector::addAll()` returns a [shallow copy](https://en.wikipedia.org/wiki/Object_copying#Shallow_copy) of `$v` itself, you can chain a bunch of `addAll()` calls together, and that will add all those collection of values to `$v`. - -```basic-usage.hack -$v = Vector {}; - -// Add all the values in a Set -$v->addAll(Set {'a', 'b'}); - -// Add all the values in a Vector -$v->addAll(Vector {'c', 'd'}); - -// Add all the values in a Map -$v->addAll(Map {'foo' => 'e', 'bar' => 'f'}); - -// Add all the values in an array -$v->addAll(varray['g', 'h']); - -// Vector::addAll returns the Vector so it can be chained -$v->addAll(ImmSet {'i', 'j'}) - ->addAll(ImmVector {'k', 'l'}); - -\var_dump($v); -``` diff --git a/api-examples/class.HH.Vector/addAllKeysOf.md b/api-examples/class.HH.Vector/addAllKeysOf.md deleted file mode 100644 index 7babd784f..000000000 --- a/api-examples/class.HH.Vector/addAllKeysOf.md +++ /dev/null @@ -1,47 +0,0 @@ -This example adds `string` keys from a `Map` to a `Vector` as its values: - -```string-keys.hack -$fruit_calories = Map { - 'apple' => 95, - 'orange' => 45, -}; - -$vegetable_calories = darray[ - 'cabbage' => 176, - 'potato' => 163, -]; - -$food_names = Vector {}; - -// Add the keys from a Map -$food_names->addAllKeysOf($fruit_calories); - -// Add the keys from an associative array -$food_names->addAllKeysOf($vegetable_calories); - -\var_dump($food_names); -``` - -This example adds `int` keys from a `Map` to a `Vector` as its values: - -```int-keys.hack -$uploaders_by_id = Map { - 4993063 => 'Amy Smith', - 9361760 => 'John Doe', -}; - -$commenters_by_id = darray[ - 7424854 => 'Jane Roe', - 5740542 => 'Joe Bloggs', -]; - -$all_ids = Vector {}; - -// Add the keys from a Map -$all_ids->addAllKeysOf($uploaders_by_id); - -// Add the keys from an associative array -$all_ids->addAllKeysOf($commenters_by_id); - -\var_dump($all_ids); -``` diff --git a/api-examples/class.HH.Vector/at.md b/api-examples/class.HH.Vector/at.md deleted file mode 100644 index 3a9649ed2..000000000 --- a/api-examples/class.HH.Vector/at.md +++ /dev/null @@ -1,20 +0,0 @@ -This example prints the first and last values of the `Vector`: - -```existing-key.hack -$v = Vector {'red', 'green', 'blue', 'yellow'}; - -// Print the first element -\var_dump($v->at(0)); - -// Print the last element -\var_dump($v->at(3)); -``` - -This example throws an `OutOfBoundsException` because the `Vector` has no index 10: - -```missing-key.hack -$v = Vector {'red', 'green', 'blue', 'yellow'}; - -// Index 10 doesn't exist (this will throw an exception) -\var_dump($v->at(10)); -``` diff --git a/api-examples/class.HH.Vector/clear.md b/api-examples/class.HH.Vector/clear.md deleted file mode 100644 index 99c2f7033..000000000 --- a/api-examples/class.HH.Vector/clear.md +++ /dev/null @@ -1,7 +0,0 @@ -```basic-usage.hack -$v = Vector {'red', 'green', 'blue', 'yellow'}; -\var_dump($v); - -$v->clear(); -\var_dump($v); -``` diff --git a/api-examples/class.HH.Vector/concat.md b/api-examples/class.HH.Vector/concat.md deleted file mode 100644 index efadc2064..000000000 --- a/api-examples/class.HH.Vector/concat.md +++ /dev/null @@ -1,15 +0,0 @@ -This example creates new `Vector`s by concatenating other `Traversable`s. Unlike `Vector::addAll()` this method returns a new `Vector` (not a [shallow copy](https://en.wikipedia.org/wiki/Object_copying#Shallow_copy)). - -```basic-usage.hack -$v = Vector {'red'}; - -// Add all the values in a Set -$v1 = $v->concat(Set {'green', 'blue'}); - -// Add all the values in an array -$v2 = $v1->concat(varray['yellow', 'purple']); - -\var_dump($v); // $v contains 'red' -\var_dump($v1); // $v1 contains 'red', 'green', 'blue' -\var_dump($v2); // $v2 contains 'red', 'green', 'blue', 'yellow', 'purple' -``` diff --git a/api-examples/class.HH.Vector/containsKey.md b/api-examples/class.HH.Vector/containsKey.md deleted file mode 100644 index 048236780..000000000 --- a/api-examples/class.HH.Vector/containsKey.md +++ /dev/null @@ -1,12 +0,0 @@ -```basic-usage.hack -$v = Vector {'red', 'green', 'blue', 'yellow'}; - -// Prints "true", since index 0 is the first element -\var_dump($v->containsKey(0)); - -// Prints "true", since index 3 is the last element -\var_dump($v->containsKey(3)); - -// Prints "false", since index 10 doesn't exist -\var_dump($v->containsKey(10)); -``` diff --git a/api-examples/class.HH.Vector/count.md b/api-examples/class.HH.Vector/count.md deleted file mode 100644 index 9d189e8cb..000000000 --- a/api-examples/class.HH.Vector/count.md +++ /dev/null @@ -1,7 +0,0 @@ -```basic-usage.hack -$v = Vector {}; -\var_dump($v->count()); - -$v = Vector {'red', 'green', 'blue', 'yellow'}; -\var_dump($v->count()); -``` diff --git a/api-examples/class.HH.Vector/filter.md b/api-examples/class.HH.Vector/filter.md deleted file mode 100644 index 310a29826..000000000 --- a/api-examples/class.HH.Vector/filter.md +++ /dev/null @@ -1,14 +0,0 @@ -```basic-usage.hack -$colors = Vector {'red', 'green', 'blue', 'yellow'}; -$primary_colors = Set {'red', 'green', 'blue'}; - -// Create a Vector of colors that contain the letter 'l' -$l_colors = $colors->filter($color ==> \strpos($color, 'l') !== false); -\var_dump($l_colors); - -// Create a Vector of colors that aren't listed in $primary_colors -$non_primary_colors = $colors->filter( - $color ==> !$primary_colors->contains($color), -); -\var_dump($non_primary_colors); -``` diff --git a/api-examples/class.HH.Vector/filterWithKey.md b/api-examples/class.HH.Vector/filterWithKey.md deleted file mode 100644 index 7e3d894bf..000000000 --- a/api-examples/class.HH.Vector/filterWithKey.md +++ /dev/null @@ -1,8 +0,0 @@ -```basic-usage.hack -$v = Vector {'red', 'green', 'blue', 'yellow', 'purple'}; - -// Only include elements with an odd index -$odd_elements = $v->filterWithKey(($index, $color) ==> ($index % 2) !== 0); - -\var_dump($odd_elements); -``` diff --git a/api-examples/class.HH.Vector/firstKey.md b/api-examples/class.HH.Vector/firstKey.md deleted file mode 100644 index 508c002c7..000000000 --- a/api-examples/class.HH.Vector/firstKey.md +++ /dev/null @@ -1,9 +0,0 @@ -The following example gets the first key from `Vector`. An empty `Vector` will return `null` as its first key. - -```basic-usage.hack -$v = Vector {'red', 'green', 'blue', 'yellow'}; -\var_dump($v->firstKey()); - -$v = Vector {}; -\var_dump($v->firstKey()); -``` diff --git a/api-examples/class.HH.Vector/firstValue.md b/api-examples/class.HH.Vector/firstValue.md deleted file mode 100644 index 40f371d6d..000000000 --- a/api-examples/class.HH.Vector/firstValue.md +++ /dev/null @@ -1,9 +0,0 @@ -The following example gets the first value from `Vector`. An empty `Vector` will return `null` as its first value. - -```basic-usage.hack -$v = Vector {'red', 'green', 'blue', 'yellow'}; -\var_dump($v->firstValue()); - -$v = Vector {}; -\var_dump($v->firstValue()); -``` diff --git a/api-examples/class.HH.Vector/fromItems.md b/api-examples/class.HH.Vector/fromItems.md deleted file mode 100644 index df4599869..000000000 --- a/api-examples/class.HH.Vector/fromItems.md +++ /dev/null @@ -1,22 +0,0 @@ -```basic-usage.hack -// Create a new Vector from an array -$v = Vector::fromItems(varray['red', 'green', 'blue', 'yellow']); -\var_dump($v); - -// Create a new Vector from a Set -$v = Vector::fromItems(Set {'red', 'green', 'blue', 'yellow'}); -\var_dump($v); - -// Create a new Vector from the values of a Map -$v = Vector::fromItems(Map { - 'red' => 'red', - 'green' => 'green', - 'blue' => 'blue', - 'yellow' => 'yellow', -}); -\var_dump($v); - -// An empty Vector is created if null is provided -$v = Vector::fromItems(null); -\var_dump($v); -``` diff --git a/api-examples/class.HH.Vector/fromKeysOf.md b/api-examples/class.HH.Vector/fromKeysOf.md deleted file mode 100644 index 2fe44cae2..000000000 --- a/api-examples/class.HH.Vector/fromKeysOf.md +++ /dev/null @@ -1,43 +0,0 @@ -This example adds `string` keys from a `Map` to a `Vector` as its values: - -```string-keys.hack -$fruit_calories = Map { - 'apple' => 95, - 'orange' => 45, -}; - -$vegetable_calories = darray[ - 'cabbage' => 176, - 'potato' => 163, -]; - -// Create a Vector from the keys of a Map -$fruit_names = Vector::fromKeysOf($fruit_calories); -\var_dump($fruit_names); - -// Create a Vector from the keys of an associative array -$vegetable_names = Vector::fromKeysOf($vegetable_calories); -\var_dump($vegetable_names); -``` - -This example creates new `Vector`s from an int-keyed `Map` and an associative array: - -```int-keys.hack -$uploaders_by_id = Map { - 4993063 => 'Amy Smith', - 9361760 => 'John Doe', -}; - -$commenters_by_id = darray[ - 7424854 => 'Jane Roe', - 5740542 => 'Joe Bloggs', -]; - -// Create a Vector from the integer keys of a Map -$uploader_ids = Vector::fromKeysOf($uploaders_by_id); -\var_dump($uploader_ids); // $uploader_ids contains 4993063, 9361760 - -// Create a Vector from the integer keys of an associative array -$commenter_ids = Vector::fromKeysOf($commenters_by_id); -\var_dump($commenter_ids); // $commenter_ids contains 7424854, 5740542 -``` diff --git a/api-examples/class.HH.Vector/get.md b/api-examples/class.HH.Vector/get.md deleted file mode 100644 index 82f735d63..000000000 --- a/api-examples/class.HH.Vector/get.md +++ /dev/null @@ -1,11 +0,0 @@ -This example shows how `get` can be used to access an index that may not exist: - -```basic-usage.hack -$v = Vector {'red', 'green', 'blue', 'yellow'}; - -// Index 0 is the element 'red' -\var_dump($v->get(0)); - -// Index 10 doesn't exist -\var_dump($v->get(10)); -``` diff --git a/api-examples/class.HH.Vector/getIterator.md b/api-examples/class.HH.Vector/getIterator.md deleted file mode 100644 index 9b0e51133..000000000 --- a/api-examples/class.HH.Vector/getIterator.md +++ /dev/null @@ -1,14 +0,0 @@ -This example shows how to get an iterator from a `Vector` and how to consume it: - -```basic-usage.hack -$v = Vector {'red', 'green', 'blue', 'yellow'}; - -// Get an iterator for the Vector of colors -$iterator = $v->getIterator(); - -// Print each color using the iterator -while ($iterator->valid()) { - echo $iterator->current()."\n"; - $iterator->next(); -} -``` diff --git a/api-examples/class.HH.Vector/immutable.md b/api-examples/class.HH.Vector/immutable.md deleted file mode 100644 index c544d4ffc..000000000 --- a/api-examples/class.HH.Vector/immutable.md +++ /dev/null @@ -1,15 +0,0 @@ -```basic-usage.hack -function expects_immutable(ImmVector $iv): void { - \var_dump($iv); -} - -<<__EntryPoint>> -function basic_usage_main(): void { - $v = Vector {'red', 'green', 'blue', 'yellow'}; - - // Get a deep, immutable copy of $v - $immutable_v = $v->immutable(); - - expects_immutable($immutable_v); -} -``` diff --git a/api-examples/class.HH.Vector/isEmpty.md b/api-examples/class.HH.Vector/isEmpty.md deleted file mode 100644 index ab474f6eb..000000000 --- a/api-examples/class.HH.Vector/isEmpty.md +++ /dev/null @@ -1,7 +0,0 @@ -```basic-usage.hack -$v = Vector {}; -\var_dump($v->isEmpty()); - -$v = Vector {'red', 'green', 'blue', 'yellow'}; -\var_dump($v->isEmpty()); -``` diff --git a/api-examples/class.HH.Vector/items.md b/api-examples/class.HH.Vector/items.md deleted file mode 100644 index 90dc080c9..000000000 --- a/api-examples/class.HH.Vector/items.md +++ /dev/null @@ -1,22 +0,0 @@ -This example shows that `items()` returns an `Iterable` view of the `Vector`. The `Iterable` will produce the values of the `Vector` at the time it's iterated. - -```basic-usage.hack -<<__EntryPoint>> -function basic_usage_main(): void { - $v = Vector {'red', 'green', 'blue', 'yellow'}; - - // Get an Iterable view of the Vector - $iterable = $v->items(); - - // Add another color to the original Vector $v - $v->add('purple'); - - // Print each color using $iterable - foreach ($iterable as $color) { - echo $color."\n"; - } -} - -// This wouldn't work because the Iterable interface is read-only: -// $iterable->add('orange'); -``` diff --git a/api-examples/class.HH.Vector/keys.md b/api-examples/class.HH.Vector/keys.md deleted file mode 100644 index cb1907870..000000000 --- a/api-examples/class.HH.Vector/keys.md +++ /dev/null @@ -1,4 +0,0 @@ -```basic-usage.hack -$v = Vector {'red', 'green', 'blue', 'yellow'}; -\var_dump($v->keys()); -``` diff --git a/api-examples/class.HH.Vector/lastKey.md b/api-examples/class.HH.Vector/lastKey.md deleted file mode 100644 index 09545747a..000000000 --- a/api-examples/class.HH.Vector/lastKey.md +++ /dev/null @@ -1,21 +0,0 @@ -This example shows how `lastKey()` can be used even when a `Vector` may be empty: - -```basic-usage.hack -function echoLastKey(Vector $v): void { - $last_key = $v->lastKey(); - if ($last_key !== null) { - echo 'Last key: '.$last_key."\n"; - } else { - echo 'No last key (Vector is empty)'."\n"; - } -} - -<<__EntryPoint>> -function basic_usage_main(): void { - // Will print "Last key: 3" - echoLastKey(Vector {'red', 'green', 'blue', 'yellow'}); - - // Will print "No last key (Vector is empty)" - echoLastKey(Vector {}); -} -``` diff --git a/api-examples/class.HH.Vector/lastValue.md b/api-examples/class.HH.Vector/lastValue.md deleted file mode 100644 index c36b5baba..000000000 --- a/api-examples/class.HH.Vector/lastValue.md +++ /dev/null @@ -1,21 +0,0 @@ -This example shows how `lastValue()` can be used even when a `Vector` may be empty: - -```basic-usage.hack -function echoLastValue(Vector $v): void { - $last_value = $v->lastValue(); - if ($last_value !== null) { - echo 'Last value: '.$last_value."\n"; - } else { - echo 'No last value (Vector is empty)'."\n"; - } -} - -<<__EntryPoint>> -function basic_usage_main(): void { - // Will print "Last value: yellow" - echoLastValue(Vector {'red', 'green', 'blue', 'yellow'}); - - // Will print "No last value (Vector is empty)" - echoLastValue(Vector {}); -} -``` diff --git a/api-examples/class.HH.Vector/lazy.md b/api-examples/class.HH.Vector/lazy.md deleted file mode 100644 index 041489ef4..000000000 --- a/api-examples/class.HH.Vector/lazy.md +++ /dev/null @@ -1,75 +0,0 @@ -This example shows you how to use `lazy()` on a rather large `Vector` and the time for both a *strict* and *non-strict* version. Since we only need 5 of the elements in the end, the lazy view actually allows us to stop after we meet our required 5 without having to actually filter and allocate all 1000000 elements up front. - -```basic-usage.hack -$vector = new Vector(\range(0, 1000000)); - -$s = \microtime(true); -$non_lazy = $vector->filter($x ==> $x % 2 === 0)->take(5); -$e = \microtime(true); - -\var_dump($non_lazy); -echo "Time non-lazy: ".\strval($e - $s).\PHP_EOL; - -// Using a lazy view of the vector can save us a bunch of time, possibly even -// cutting this call time by 90%. -$s = \microtime(true); -$lazy = $vector->lazy()->filter($x ==> $x % 2 === 0)->take(5); -$e = \microtime(true); - -\var_dump(new Vector($lazy)); -echo "Time lazy: ".\strval($e - $s).\PHP_EOL; -```.hhvm.expectf -object(HH\Vector) (5) { - [0]=> - int(0) - [1]=> - int(2) - [2]=> - int(4) - [3]=> - int(6) - [4]=> - int(8) -} -Time non-lazy: %f -object(HH\Vector) (5) { - [0]=> - int(0) - [1]=> - int(2) - [2]=> - int(4) - [3]=> - int(6) - [4]=> - int(8) -} -Time lazy: %f -```.example.hhvm.out -object(HH\Vector) (5) { - [0]=> - int(0) - [1]=> - int(2) - [2]=> - int(4) - [3]=> - int(6) - [4]=> - int(8) -} -Time non-lazy: 0.053816556930542 -object(HH\Vector) (5) { - [0]=> - int(0) - [1]=> - int(2) - [2]=> - int(4) - [3]=> - int(6) - [4]=> - int(8) -} -Time lazy: 0.0069270133972168 -``` diff --git a/api-examples/class.HH.Vector/linearSearch.md b/api-examples/class.HH.Vector/linearSearch.md deleted file mode 100644 index 5ee9e443b..000000000 --- a/api-examples/class.HH.Vector/linearSearch.md +++ /dev/null @@ -1,9 +0,0 @@ -```basic-usage.hack -$v = Vector {'red', 'green', 'blue', 'yellow'}; - -// Prints 2 -\var_dump($v->linearSearch('blue')); - -// Prints -1 (since 'purple' is not in the Vector) -\var_dump($v->linearSearch('purple')); -``` diff --git a/api-examples/class.HH.Vector/map.md b/api-examples/class.HH.Vector/map.md deleted file mode 100644 index a8f874e4b..000000000 --- a/api-examples/class.HH.Vector/map.md +++ /dev/null @@ -1,20 +0,0 @@ -In this example the `Vector`'s elements are mapped to the same type (`string`s): - -```map-to-strings.hack -$v = Vector {'red', 'green', 'blue', 'yellow'}; - -$capitalized = $v->map(fun('strtoupper')); -\var_dump($capitalized); - -$shortened = $v->map($color ==> \substr($color, 0, 3)); -\var_dump($shortened); -``` - -In this example the `Vector`'s elements are mapped to a different type (`int`s): - -```map-to-ints.hack -$v = Vector {'red', 'green', 'blue', 'yellow'}; - -$lengths = $v->map(fun('strlen')); -\var_dump($lengths); -``` diff --git a/api-examples/class.HH.Vector/mapWithKey.md b/api-examples/class.HH.Vector/mapWithKey.md deleted file mode 100644 index 57bb590b6..000000000 --- a/api-examples/class.HH.Vector/mapWithKey.md +++ /dev/null @@ -1,9 +0,0 @@ -This example shows how `mapWithKey` can be used to create a new `Vector` based on `$v`'s keys and values: - -```basic-usage.hack -$v = Vector {'red', 'green', 'blue', 'yellow'}; - -$sentences = $v->mapWithKey(($index, $color) ==> "Color at {$index}: {$color}"); - -echo \implode("\n", $sentences)."\n"; -``` diff --git a/api-examples/class.HH.Vector/pop.md b/api-examples/class.HH.Vector/pop.md deleted file mode 100644 index 93a41b7c5..000000000 --- a/api-examples/class.HH.Vector/pop.md +++ /dev/null @@ -1,18 +0,0 @@ -This example shows that `pop()` returns the last element and removes it from the `Vector`: - -```basic-usage.hack -$v = Vector {'red', 'green', 'blue', 'yellow'}; - -$last_color = $v->pop(); - -\var_dump($last_color); -\var_dump($v); -``` - -This example shows that trying to `pop` from an empty `Vector` will throw an exception: - -```throw-exception.hack -$v = Vector {}; - -$last_element = $v->pop(); // Throws InvalidOperationException -``` diff --git a/api-examples/class.HH.Vector/removeKey.md b/api-examples/class.HH.Vector/removeKey.md deleted file mode 100644 index 20b000292..000000000 --- a/api-examples/class.HH.Vector/removeKey.md +++ /dev/null @@ -1,13 +0,0 @@ -Since `Vector::removeKey()` returns a [shallow copy](https://en.wikipedia.org/wiki/Object_copying#Shallow_copy) of `$v` itself, you can chain a bunch of `removeKey()` calls together. - -```basic-usage.hack -$v = Vector {'red', 'green', 'blue', 'yellow'}; - -// Remove 'blue' at index 2 -$v->removeKey(2); -\var_dump($v); - -// Remove 'red' and then remove 'green' -$v->removeKey(0)->removeKey(0); -\var_dump($v); -``` diff --git a/api-examples/class.HH.Vector/reserve.md b/api-examples/class.HH.Vector/reserve.md deleted file mode 100644 index db05f0230..000000000 --- a/api-examples/class.HH.Vector/reserve.md +++ /dev/null @@ -1,17 +0,0 @@ -This example reserves space for 1000 elements and then fills the `Vector` with 1000 integers: - -```basic-usage.hack no-auto-output -const int VECTOR_SIZE = 1000; - -<<__EntryPoint>> -function basic_usage_main(): void { - $v = Vector {}; - $v->reserve(VECTOR_SIZE); - - for ($i = 0; $i < VECTOR_SIZE; $i++) { - $v[] = $i * 10; - } - - \var_dump($v); -} -``` diff --git a/api-examples/class.HH.Vector/resize.md b/api-examples/class.HH.Vector/resize.md deleted file mode 100644 index e1c466343..000000000 --- a/api-examples/class.HH.Vector/resize.md +++ /dev/null @@ -1,13 +0,0 @@ -This example shows how `resize` can be used to decrease and increase the size of a `Vector`: - -```basic-usage.hack -$v = Vector {'red', 'green', 'blue', 'yellow'}; - -// Resize the Vector to 2 (removing 'blue' and 'yellow') -$v->resize(2, null); -\var_dump($v); - -// Resize the Vector back to 4 (filling in 'unknown' for new elements) -$v->resize(4, 'unknown'); -\var_dump($v); -``` diff --git a/api-examples/class.HH.Vector/reverse.md b/api-examples/class.HH.Vector/reverse.md deleted file mode 100644 index c475e3a42..000000000 --- a/api-examples/class.HH.Vector/reverse.md +++ /dev/null @@ -1,7 +0,0 @@ -```basic-usage.hack -$v = Vector {'red', 'green', 'blue', 'yellow'}; - -$v->reverse(); - -\var_dump($v); -``` diff --git a/api-examples/class.HH.Vector/set.md b/api-examples/class.HH.Vector/set.md deleted file mode 100644 index 82aa0a105..000000000 --- a/api-examples/class.HH.Vector/set.md +++ /dev/null @@ -1,16 +0,0 @@ -Since `Vector::set()` returns a [shallow copy](https://en.wikipedia.org/wiki/Object_copying#Shallow_copy) of `$v` itself, you can chain a bunch of `set()` calls together. - -```basic-usage.hack -$v = Vector {'red', 'green', 'blue', 'yellow'}; - -// Set the first element to 'RED' -$v->set(0, 'RED'); - -\var_dump($v); - -// Set the second and third elements using chaining -$v->set(1, 'GREEN') - ->set(2, 'BLUE'); - -\var_dump($v); -``` diff --git a/api-examples/class.HH.Vector/setAll.md b/api-examples/class.HH.Vector/setAll.md deleted file mode 100644 index 52698080b..000000000 --- a/api-examples/class.HH.Vector/setAll.md +++ /dev/null @@ -1,16 +0,0 @@ -This example shows how `setAll()` can be used with any `KeyedTraversable`: - -```basic-usage.hack -$v = Vector {'red', 'green', 'blue', 'yellow'}; - -// Set the elements at 0 and 1 -$v->setAll(Vector {'foo', 'bar'}); -\var_dump($v); - -// Set the elements at 2 and 3 -$v->setAll(Map { - 2 => 'baz', - 3 => 'qux', -}); -\var_dump($v); -``` diff --git a/api-examples/class.HH.Vector/shuffle.md b/api-examples/class.HH.Vector/shuffle.md deleted file mode 100644 index 2f23ea46c..000000000 --- a/api-examples/class.HH.Vector/shuffle.md +++ /dev/null @@ -1,30 +0,0 @@ -```basic-usage.hack -$v = Vector {'red', 'green', 'blue', 'yellow'}; - -// Randomize the Vector elements in place -$v->shuffle(); - -\var_dump($v); -```.hhvm.expectf -object(HH\Vector) (4) { - [0]=> - string(%d) "%s" - [1]=> - string(%d) "%s" - [2]=> - string(%d) "%s" - [3]=> - string(%d) "%s" -} -```.example.hhvm.out -object(HH\Vector) (4) { - [0]=> - string(4) "blue" - [1]=> - string(5) "green" - [2]=> - string(6) "yellow" - [3]=> - string(3) "red" -} -``` diff --git a/api-examples/class.HH.Vector/skip.md b/api-examples/class.HH.Vector/skip.md deleted file mode 100644 index 4436e4477..000000000 --- a/api-examples/class.HH.Vector/skip.md +++ /dev/null @@ -1,8 +0,0 @@ -```basic-usage.hack -$v = Vector {'red', 'green', 'blue', 'yellow'}; - -// Create a new Vector after skipping the first two elements ('red' and 'green') -$skip2 = $v->skip(2); - -\var_dump($skip2); -``` diff --git a/api-examples/class.HH.Vector/skipWhile.md b/api-examples/class.HH.Vector/skipWhile.md deleted file mode 100644 index cb9cfbb9b..000000000 --- a/api-examples/class.HH.Vector/skipWhile.md +++ /dev/null @@ -1,9 +0,0 @@ -This example shows how `skipWhile` can be used to create a new `Vector` by skipping elements at the beginning of an existing `Vector`: - -```basic-usage.hack -$v = Vector {0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144}; - -// Skip values until we reach one over 10 -$v2 = $v->skipWhile($x ==> $x <= 10); -\var_dump($v2); -``` diff --git a/api-examples/class.HH.Vector/slice.md b/api-examples/class.HH.Vector/slice.md deleted file mode 100644 index ed5d60813..000000000 --- a/api-examples/class.HH.Vector/slice.md +++ /dev/null @@ -1,8 +0,0 @@ -```basic-usage.hack -$v = Vector {'red', 'green', 'blue', 'yellow'}; - -// Start at index 1 ('green') and include 3 elements -$v2 = $v->slice(1, 3); - -\var_dump($v2); -``` diff --git a/api-examples/class.HH.Vector/splice.md b/api-examples/class.HH.Vector/splice.md deleted file mode 100644 index e6a40c5a9..000000000 --- a/api-examples/class.HH.Vector/splice.md +++ /dev/null @@ -1,28 +0,0 @@ -The following example shows how to use `$offset` and `$len` together: - -```basic-usage.hack -// Remove the element at index 2: -$v = Vector {'red', 'green', 'blue', 'yellow'}; -$v->splice(2, 1); -\var_dump($v); // $v contains 'red', 'green', 'yellow' - -// Remove elements starting at index 2: -$v = Vector {'red', 'green', 'blue', 'yellow'}; -$v->splice(2); -\var_dump($v); // $v contains 'red', 'green' - -// Remove three elements starting at index 0: -$v = Vector {'red', 'green', 'blue', 'yellow'}; -$v->splice(0, 3); -\var_dump($v); // $v contains 'yellow' - -// Remove elements starting two positions from the end: -$v = Vector {'red', 'green', 'blue', 'yellow'}; -$v->splice(-2); -\var_dump($v); // $v contains 'red', 'green - -// Remove elements starting at index 0 and stopping one position from the end: -$v = Vector {'red', 'green', 'blue', 'yellow'}; -$v->splice(0, -1); -\var_dump($v); // $v contains 'yellow' -``` diff --git a/api-examples/class.HH.Vector/take.md b/api-examples/class.HH.Vector/take.md deleted file mode 100644 index 89f981c8d..000000000 --- a/api-examples/class.HH.Vector/take.md +++ /dev/null @@ -1,8 +0,0 @@ -```basic-usage.hack -$v = Vector {'red', 'green', 'blue', 'yellow'}; - -// Take the first two elements -$take2 = $v->take(2); - -\var_dump($take2); -``` diff --git a/api-examples/class.HH.Vector/takeWhile.md b/api-examples/class.HH.Vector/takeWhile.md deleted file mode 100644 index 287297e6f..000000000 --- a/api-examples/class.HH.Vector/takeWhile.md +++ /dev/null @@ -1,9 +0,0 @@ -This example shows how `takeWhile` can be used to create a new `Vector` by taking elements from the beginning of an existing `Vector`: - -```basic-usage.hack -$v = Vector {0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144}; - -// Include values until we reach one over 10 -$v2 = $v->takeWhile($x ==> $x <= 10); -\var_dump($v2); -``` diff --git a/api-examples/class.HH.Vector/toImmMap.md b/api-examples/class.HH.Vector/toImmMap.md deleted file mode 100644 index 35fd3de73..000000000 --- a/api-examples/class.HH.Vector/toImmMap.md +++ /dev/null @@ -1,9 +0,0 @@ -```basic-usage.hack -$v = Vector {'red', 'green', 'blue', 'yellow'}; - -$imm_map = $v->toImmMap(); - -\var_dump($imm_map is \HH\ImmMap<_, _>); -\var_dump($imm_map->keys()); -\var_dump($imm_map); -``` diff --git a/api-examples/class.HH.Vector/toImmSet.md b/api-examples/class.HH.Vector/toImmSet.md deleted file mode 100644 index c41896d1f..000000000 --- a/api-examples/class.HH.Vector/toImmSet.md +++ /dev/null @@ -1,11 +0,0 @@ -This example shows that converting a `Vector` to an `ImmSet` also removes duplicate values: - -```basic-usage.hack -// This Vector contains repetitions of 'red' and 'blue' -$v = Vector {'red', 'green', 'red', 'blue', 'red', 'yellow', 'blue'}; - -$imm_set = $v->toImmSet(); - -\var_dump($imm_set is \HH\ImmSet<_>); -\var_dump($imm_set); -``` diff --git a/api-examples/class.HH.Vector/toImmVector.md b/api-examples/class.HH.Vector/toImmVector.md deleted file mode 100644 index ccb89a44c..000000000 --- a/api-examples/class.HH.Vector/toImmVector.md +++ /dev/null @@ -1,20 +0,0 @@ -This example shows that `toImmVector` returns an immutable copy of the `Vector`. Mutating the original `Vector` doesn't affect the immutable copy. - -```basic-usage.hack -function expects_immutable(ImmVector $iv): void { - \var_dump($iv); -} - -<<__EntryPoint>> -function basic_usage_main(): void { - $v = Vector {'red', 'green', 'blue', 'yellow'}; - - // Get a deep, immutable copy of $v - $immutable_v = $v->immutable(); - - // Add a color to the original Vector $v - $v->add('purple'); - - expects_immutable($immutable_v); -} -``` diff --git a/api-examples/class.HH.Vector/toKeysArray.md b/api-examples/class.HH.Vector/toKeysArray.md deleted file mode 100644 index 91205b168..000000000 --- a/api-examples/class.HH.Vector/toKeysArray.md +++ /dev/null @@ -1,8 +0,0 @@ -```basic-usage.hack -$v = Vector {'red', 'green', 'blue', 'yellow'}; - -$keys_array = $v->toKeysArray(); - -\var_dump(\HH\is_any_array($keys_array)); -\var_dump($keys_array); -``` diff --git a/api-examples/class.HH.Vector/toMap.md b/api-examples/class.HH.Vector/toMap.md deleted file mode 100644 index c9559d2b8..000000000 --- a/api-examples/class.HH.Vector/toMap.md +++ /dev/null @@ -1,9 +0,0 @@ -```basic-usage.hack -$v = Vector {'red', 'green', 'blue', 'yellow'}; - -$map = $v->toMap(); - -\var_dump($map is \HH\Map<_, _>); -\var_dump($map->keys()); -\var_dump($map); -``` diff --git a/api-examples/class.HH.Vector/toSet.md b/api-examples/class.HH.Vector/toSet.md deleted file mode 100644 index 4f525566c..000000000 --- a/api-examples/class.HH.Vector/toSet.md +++ /dev/null @@ -1,11 +0,0 @@ -This example shows that converting a `Vector` to a `Set` also removes duplicate values: - -```basic-usage.hack -// This Vector contains repetitions of 'red' and 'blue' -$v = Vector {'red', 'green', 'red', 'blue', 'red', 'yellow', 'blue'}; - -$set = $v->toSet(); - -\var_dump($set is \HH\Set<_>); -\var_dump($set); -``` diff --git a/api-examples/class.HH.Vector/toVArray.md b/api-examples/class.HH.Vector/toVArray.md deleted file mode 100644 index 980aa5a72..000000000 --- a/api-examples/class.HH.Vector/toVArray.md +++ /dev/null @@ -1,8 +0,0 @@ -```basic-usage.hack -$v = Vector {'red', 'green', 'blue', 'yellow'}; - -$array = $v->toVArray(); - -\var_dump(\HH\is_any_array($array)); -\var_dump($array); -``` diff --git a/api-examples/class.HH.Vector/toValuesArray.md b/api-examples/class.HH.Vector/toValuesArray.md deleted file mode 100644 index 7b8ddaa19..000000000 --- a/api-examples/class.HH.Vector/toValuesArray.md +++ /dev/null @@ -1,8 +0,0 @@ -```basic-usage.hack -$v = Vector {'red', 'green', 'blue', 'yellow'}; - -$array = $v->toValuesArray(); - -\var_dump(\HH\is_any_array($array)); -\var_dump($array); -``` diff --git a/api-examples/class.HH.Vector/toVector.md b/api-examples/class.HH.Vector/toVector.md deleted file mode 100644 index 1d571574f..000000000 --- a/api-examples/class.HH.Vector/toVector.md +++ /dev/null @@ -1,38 +0,0 @@ -This example shows how `toVector()` returns a copy of `$v` (a new `Vector` object), so mutating this new `Vector` doesn't affect the original. - -```basic-usage.hack -$v = Vector {'red', 'green', 'blue', 'yellow'}; - -// Make a new Vector that is a copy of $v (i.e. contains the same elements) -$v2 = $v->toVector(); - -// Modify $v2 by adding an element -$v2->add('purple'); -\var_dump($v2); - -// The original Vector $v doesn't include 'purple' -\var_dump($v); -``` - -This example shows how `toVector()` returns a shallow copy of `$v` (a new `Vector` object containing the same elements) -rather than a deep copy (a new `Vector` object containing copies of the elements of `$v` that are themselves objects). - -Thus, mutating an element of `$v` that is itself an object also mutates the corresponding element of `$v2`, since the element in `$v` -is the same object as the element in `$v2`. - -```shallow-copy.hack -$inner = Vector {1, 2, 3}; -$v = Vector {Vector {'a'}, $inner, Vector {'c'}}; - -// Make a Vector copy of $v -$v2 = $v->toVector(); - -// Modify the original Vector $v's inner Vector by adding an element -$v[1]->add(4); - -// The original Vector $v's inner Vector includes 4. -\var_dump($v); - -// The new Vector $v2's inner Vector also includes 4. toVector() only does a shallow copy. -\var_dump($v2); -``` diff --git a/api-examples/class.HH.Vector/values.md b/api-examples/class.HH.Vector/values.md deleted file mode 100644 index 4e2b57e10..000000000 --- a/api-examples/class.HH.Vector/values.md +++ /dev/null @@ -1,15 +0,0 @@ -This example shows how `values()` is identical to `toVector()`. It returns a deep copy of `$v`, so mutating this new `Vector` doesn't affect the original. - -```basic-usage.hack -$v = Vector {'red', 'green', 'blue', 'yellow'}; - -// Make a deep Vector copy of $v -$v2 = $v->values(); - -// Modify $v2 by adding an element -$v2->add('purple'); -\var_dump($v2); - -// The original Vector $v doesn't include 'purple' -\var_dump($v); -``` diff --git a/api-examples/class.HH.Vector/zip.md b/api-examples/class.HH.Vector/zip.md deleted file mode 100644 index eb7e21cd5..000000000 --- a/api-examples/class.HH.Vector/zip.md +++ /dev/null @@ -1,14 +0,0 @@ -This example shows how `zip` combines the values of the `Vector` and another `Traversable`. The resulting `Vector` `$labeled_colors` has three elements because `$labels` doesn't have a fourth element to pair with `$v`. - -```basic-usage.hack -$v = Vector {'red', 'green', 'blue', 'yellow'}; - -$labels = Vector {'My Favorite', 'My 2nd Favorite', 'My 3rd Favorite'}; -$labeled_colors = $v->zip($labels); - -\var_dump($labeled_colors->count()); // 3 - -foreach ($labeled_colors as list($color, $label)) { - echo $label.': '.$color."\n"; -} -``` diff --git a/api-examples/class.MCRouter/__construct.md b/api-examples/class.MCRouter/__construct.md deleted file mode 100644 index bc8fe7114..000000000 --- a/api-examples/class.MCRouter/__construct.md +++ /dev/null @@ -1,28 +0,0 @@ -The following example shows you how to explicitly create an instance of `MCRouter` using `new`, by definition, its constructor. You must create a configuration string (or provide a configuration file that contains appropriate configuration information), and, optionally, a persistence identifier can bet passed as the second parameter to the constructor. - -```basic-usage.hack -$servers = Vector {\getenv('HHVM_TEST_MCROUTER')}; -// For many use cases, calling MCRouter::createSimple($servers) would -// suffice here. But this shows you how to explicitly create the configuration -// options for creating an instance of MCRouter -$options = darray[ - 'config_str' => \json_encode( - darray[ - 'pools' => darray[ - 'P' => darray[ - 'servers' => $servers, - ], - ], - 'route' => 'PoolRoute|P', - ], - ), -]; -$mc = new \MCRouter($options); // could also pass a persistence id string here -\var_dump($mc is \MCRouter); -```.hhvm.expectf -bool(true) -```.example.hhvm.out -bool(true) -```.skipif -\Hack\UserDocumentation\API\Examples\MCRouter\skipif(); -``` diff --git a/api-examples/class.MCRouter/add.md b/api-examples/class.MCRouter/add.md deleted file mode 100644 index df2048d2a..000000000 --- a/api-examples/class.MCRouter/add.md +++ /dev/null @@ -1,61 +0,0 @@ -The following example shows how to use `MCRouter::add` to add a unique key/value pair to the memcached server. You cannot `add` the same key twice; if you need to update a key, use `MCRouter::set` - -If you pass an expiration time for the key, that is in seconds. - -And these are the bitwise or style flags that can be passed to `add`: - -``` -MC_MSG_FLAG_PHP_SERIALIZED = 0x1, -MC_MSG_FLAG_COMPRESSED = 0x2, -MC_MSG_FLAG_FB_SERIALIZED = 0x4, -MC_MSG_FLAG_FB_COMPACT_SERIALIZED = 0x8, -MC_MSG_FLAG_ASCII_INT_SERIALIZED = 0x10, -MC_MSG_FLAG_NZLIB_COMPRESSED = 0x800, -MC_MSG_FLAG_QUICKLZ_COMPRESSED = 0x2000, -MC_MSG_FLAG_SNAPPY_COMPRESSED = 0x4000, -MC_MSG_FLAG_BIG_VALUE = 0X8000, -MC_MSG_FLAG_NEGATIVE_CACHE = 0x10000, -MC_MSG_FLAG_HOT_KEY = 0x20000, -``` - -See the [header file with the flags](https://github.com/facebook/mcrouter/blob/5f259ed47b52f86cad750d2343edf324e80cb397/mcrouter/lib/mc/msg.h) - -```basic-usage.hack -function get_simple_mcrouter(): \MCRouter { - $servers = Vector {\getenv('HHVM_TEST_MCROUTER')}; - $mc = \MCRouter::createSimple($servers); - return $mc; -} - -async function add_value( - \MCRouter $mc, - string $key, - string $value, -): Awaitable { - // can also pass optional int flags and int expiration time (in seconds) - await $mc->add($key, $value); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $mc = get_simple_mcrouter(); - $unique_key = \str_shuffle('ABCDEFGHIJKLMN'); - await add_value($mc, $unique_key, "Hi"); - $val = await $mc->get($unique_key); - \var_dump($val); - try { - // Shouldn't be able to add the same key twice - await add_value($mc, $unique_key, "Bye"); - } catch (\MCRouterException $ex) { - \var_dump($ex->getMessage()); - } -} -```.hhvm.expectf -string(2) "Hi" -string(39) "add failed with result mc_res_notstored" -```.example.hhvm.out -string(2) "Hi" -string(39) "add failed with result mc_res_notstored" -```.skipif -\Hack\UserDocumentation\API\Examples\MCRouter\skipif(); -``` diff --git a/api-examples/class.MCRouter/append.md b/api-examples/class.MCRouter/append.md deleted file mode 100644 index 4aea2e850..000000000 --- a/api-examples/class.MCRouter/append.md +++ /dev/null @@ -1,47 +0,0 @@ -The following example shows how to use the `MCRouter::append` function. - -```basic-usage.hack -function get_simple_mcrouter(): \MCRouter { - $servers = Vector {\getenv('HHVM_TEST_MCROUTER')}; - $mc = \MCRouter::createSimple($servers); - return $mc; -} - -async function set_value( - \MCRouter $mc, - string $key, - string $value, -): Awaitable { - // can also pass optional int flags and int expiration time (in seconds) - await $mc->set($key, $value); -} - -async function append_to_value( - \MCRouter $mc, - string $key, - string $append_str, -): Awaitable { - await $mc->append($key, $append_str); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $mc = get_simple_mcrouter(); - $unique_key = \str_shuffle('ABCDEFGHIJKLMN'); - await set_value($mc, $unique_key, 'Hi'); - $val = await $mc->get($unique_key); - \var_dump($val); - try { - await append_to_value($mc, $unique_key, 'Oh'); - $val = await $mc->get($unique_key); - \var_dump($val); - } catch (\MCRouterException $ex) { - \var_dump($ex->getMessage()); - } -} -```.hhvm.expect -string(2) "Hi" -string(4) "HiOh" -```.skipif -\Hack\UserDocumentation\API\Examples\MCRouter\skipif(); -``` diff --git a/api-examples/class.MCRouter/createSimple.md b/api-examples/class.MCRouter/createSimple.md deleted file mode 100644 index 9eb9078fb..000000000 --- a/api-examples/class.MCRouter/createSimple.md +++ /dev/null @@ -1,13 +0,0 @@ -The following example shows you how use `MCRouter::createSimple` to create an instance of `MCRouter`. You only need to pass it a `Vector` containing one or more locations of Memcached servers; default configurations are used after that (e.g, `route = 'PoolRoute|P'`). - -```basic-usage.hack -$servers = Vector {\getenv('HHVM_TEST_MCROUTER')}; -$mc = \MCRouter::createSimple($servers); -\var_dump($mc is \MCRouter); -```.hhvm.expectf -bool(true) -```.example.hhvm.out -bool(true) -```.skipif -\Hack\UserDocumentation\API\Examples\MCRouter\skipif(); -``` diff --git a/api-examples/class.MCRouter/decr.md b/api-examples/class.MCRouter/decr.md deleted file mode 100644 index 8ca296adc..000000000 --- a/api-examples/class.MCRouter/decr.md +++ /dev/null @@ -1,62 +0,0 @@ -The following example shows how to decrement a value of a key by a specified integer using `MCRouter::incr`. The value **must** be numeric. - -Note that you can't decrement below 0. So if your value is 1 and you try to decrement 3, the value you get back will be 0. - -```basic-usage.hack -function get_simple_mcrouter(): \MCRouter { - $servers = Vector {\getenv('HHVM_TEST_MCROUTER')}; - $mc = \MCRouter::createSimple($servers); - return $mc; -} - -async function set_value( - \MCRouter $mc, - string $key, - string $value, -): Awaitable { - // can also pass optional int flags and int expiration time (in seconds) - await $mc->set($key, $value); -} - -async function dec_value( - \MCRouter $mc, - string $key, - int $amount, -): Awaitable { - await $mc->decr($key, $amount); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $mc = get_simple_mcrouter(); - $unique_key = \str_shuffle('ABCDEFGHIJKLMN'); - await set_value($mc, $unique_key, "4"); - $val = await $mc->get($unique_key); - \var_dump($val); - await dec_value($mc, $unique_key, 3); - $val = await $mc->get($unique_key); - \var_dump($val); - - // Try on a value not numeric - $unique_key = \str_shuffle('ABCDEFGHIJKLMN'); - await set_value($mc, $unique_key, "E"); - $val = await $mc->get($unique_key); - \var_dump($val); - try { - await dec_value($mc, $unique_key, 3); // won't be "B" :) - $val = await $mc->get($unique_key); - \var_dump($val); - } catch (\MCRouterException $ex) { - \var_dump($ex->getMessage()); // can't decrement on a string - \var_dump($val); - } -} -```.hhvm.expect -string(1) "4" -string(1) "1" -string(1) "E" -string(39) "decr failed with result mc_res_notfound" -string(1) "E" -```.skipif -\Hack\UserDocumentation\API\Examples\MCRouter\skipif(); -``` diff --git a/api-examples/class.MCRouter/del.md b/api-examples/class.MCRouter/del.md deleted file mode 100644 index 0a5c2bf4e..000000000 --- a/api-examples/class.MCRouter/del.md +++ /dev/null @@ -1,48 +0,0 @@ -The following example uses `MCRouter::del` to delete a key from the memcached server. Once the key is deleted, it is no longer accessible. Nor can you delete a non-existing key. - -```basic-usage.hack -function get_simple_mcrouter(): \MCRouter { - $servers = Vector {\getenv('HHVM_TEST_MCROUTER')}; - $mc = \MCRouter::createSimple($servers); - return $mc; -} - -async function set_value( - \MCRouter $mc, - string $key, - string $value, -): Awaitable { - // can also pass optional int flags and int expiration time (in seconds) - await $mc->set($key, $value); -} - -async function del_key(\MCRouter $mc, string $key): Awaitable { - // can also pass optional int flags and int expiration time (in seconds) - await $mc->del($key); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $mc = get_simple_mcrouter(); - $unique_key = \str_shuffle('ABCDEFGHIJKLMN'); - await set_value($mc, $unique_key, "Hi"); - $val = await $mc->get($unique_key); - \var_dump($val); - await del_key($mc, $unique_key); - try { - // Try getting the key after it has been deleted - $val = await $mc->get($unique_key); - \var_dump($val); // Not going to get here. - } catch (\MCRouterException $ex) { - \var_dump($ex->getMessage()); // We should get here because key was deleted - } -} -```.hhvm.expectf -string(2) "Hi" -string(38) "get failed with result mc_res_notfound" -```.example.hhvm.out -string(2) "Hi" -string(38) "get failed with result mc_res_notfound" -```.skipif -\Hack\UserDocumentation\API\Examples\MCRouter\skipif(); -``` diff --git a/api-examples/class.MCRouter/flushAll.md b/api-examples/class.MCRouter/flushAll.md deleted file mode 100644 index 7d1fefb1d..000000000 --- a/api-examples/class.MCRouter/flushAll.md +++ /dev/null @@ -1,75 +0,0 @@ -The following example shows how to use `MCRouter::flushAll` to basically flush out the memcached server of all keys and values. - -It is **imperative** to note that you must manually construct the `MCRouter` instance passing `'enable_flush_cmd' => true` as one of your options; otherwise a command disabled exception will be thrown. In other words, you cannot use `MCRouter::createSimple()` when using `flushAll`. - -You can add an optional delay time in seconds to your call to `flushAll` as well. - -```basic-usage.hack -function construct_mcrouter(): \MCRouter { - $servers = Vector {\getenv('HHVM_TEST_MCROUTER')}; - // For many use cases, calling MCRouter::createSimple($servers) would - // suffice here. But this shows you how to explicitly create the configuration - // options for creating an instance of MCRouter - $options = darray[ - 'config_str' => \json_encode( - darray[ - 'pools' => darray[ - 'P' => darray[ - 'servers' => $servers, - ], - ], - 'route' => 'PoolRoute|P', - ], - ), - 'enable_flush_cmd' => true, // Need this in order to use flushAll - ]; - $mc = new \MCRouter($options); // could also pass a persistence id string here - \var_dump($mc is \MCRouter); - return $mc; -} - -async function set_value( - \MCRouter $mc, - string $key, - string $value, -): Awaitable { - // can also pass optional int flags and int expiration time (in seconds) - await $mc->set($key, $value); -} - -async function del_key(\MCRouter $mc, string $key): Awaitable { - // can also pass optional int flags and int expiration time (in seconds) - await $mc->del($key); -} - -async function flush(\MCRouter $mc): Awaitable { - await $mc->flushAll(); // can add an optional delay time in seconds -} - -<<__EntryPoint>> -async function run(): Awaitable { - $mc = construct_mcrouter(); - $unique_key = \str_shuffle('ABCDEFGHIJKLMN'); - await set_value($mc, $unique_key, "Hi"); - $val = await $mc->get($unique_key); - \var_dump($val); - await del_key($mc, $unique_key); - await flush($mc); - try { - $val = await $mc->get($unique_key); - \var_dump($val); // Won't get here because exception will be thrown - } catch (\MCRouterException $ex) { - \var_dump($ex->getMessage()); // There are no more keys/values since flush - } -} -```.hhvm.expectf -bool(true) -string(2) "Hi" -string(38) "get failed with result mc_res_notfound" -```.example.hhvm.out -bool(true) -string(2) "Hi" -string(38) "get failed with result mc_res_notfound" -```.skipif -\Hack\UserDocumentation\API\Examples\MCRouter\skipif(); -``` diff --git a/api-examples/class.MCRouter/get.md b/api-examples/class.MCRouter/get.md deleted file mode 100644 index 2011787eb..000000000 --- a/api-examples/class.MCRouter/get.md +++ /dev/null @@ -1,52 +0,0 @@ -Most of the `MCRouter` examples use `MCRouter::get` in order to demonstrate other functions of the API. This example calls out `get` explicitly in its own function to show you how it works. If you try to `get` on a key that does not exist, an exception will be thrown. - -```basic-usage.hack -function get_simple_mcrouter(): \MCRouter { - $servers = Vector {\getenv('HHVM_TEST_MCROUTER')}; - $mc = \MCRouter::createSimple($servers); - return $mc; -} - -async function set_value( - \MCRouter $mc, - string $key, - string $value, -): Awaitable { - // can also pass optional int flags and int expiration time (in seconds) - await $mc->set($key, $value); -} - -async function get_value(\MCRouter $mc, string $key): Awaitable { - $ret = null; - try { - $ret = await $mc->get($key); - } catch (\MCRouterException $ex) { // e.g., exception if key doesn't exist - \var_dump($ex->getMessage()); - } - return $ret; -} - -<<__EntryPoint>> -async function run(): Awaitable { - $mc = get_simple_mcrouter(); - $unique_key = \str_shuffle('ABCDEFGHIJKLMN'); - await set_value($mc, $unique_key, "Hi"); - $val = await get_value($mc, $unique_key); - \var_dump($val); - // Getting a non-existent key is no good - $val = await get_value($mc, "THISKEYDOESNOTEXISTIHOPE"); - if (!$val) { - echo "Key must not have existed\n"; - } -} -```.hhvm.expectf -string(2) "Hi" -string(38) "get failed with result mc_res_notfound" -Key must not have existed -```.example.hhvm.out -string(2) "Hi" -string(38) "get failed with result mc_res_notfound" -Key must not have existed -```.skipif -\Hack\UserDocumentation\API\Examples\MCRouter\skipif(); -``` diff --git a/api-examples/class.MCRouter/getOpName.md b/api-examples/class.MCRouter/getOpName.md deleted file mode 100644 index 7210e8ff9..000000000 --- a/api-examples/class.MCRouter/getOpName.md +++ /dev/null @@ -1,95 +0,0 @@ -The following example shows how to use `MCRouter::getOpName` to get the English readable name for an MCRouter operation given as an integer. - -Here is the list of the current mappings: - -Integer | Constant | Returned String ---------|----------|---------------- -0 | MCRouter::mc_op_unknown | unknown -1 | MCRouter::mc_op_echo | echo -2 | MCRouter::mc_op_quit | quit -3 | MCRouter::mc_op_version | version -4 | MCRouter::mc_op_servererr | servererr -5 | MCRouter::mc_op_get | get -6 | MCRouter::mc_op_set | set -7 | MCRouter::mc_op_add| add -8 | MCRouter::mc_op_replace | replace -9 | MCRouter::mc_op_append | append -10 | MCRouter::mc_op_prepend | prepend -11 | MCRouter::mc_op_cas | cas -12 | MCRouter::mc_op_delete | delete -13 | MCRouter::mc_op_nops | nops -14 | MCRouter::mc_op_incr | incr -15 | MCRouter::mc_op_decr | decr -16 | MCRouter::mc_op_flushall | flushall -17 | MCRouter::mc_op_flushre | flushre -18 | MCRouter::mc_op_stats | stats -19 | MCRouter::mc_op_verbosity | verbosity -20 | MCRouter::mc_op_lease_get | lease-get -21 | MCRouter::mc_op_lease_set | lease-set -22 | MCRouter::mc_op_shutdown | shutdown -23 | MCRouter::mc_op_end | end -24 | MCRouter::mc_op_metaget | metaget -25 | MCRouter::mc_op_exec | exec -26 | MCRouter::mc_op_gets | gets -27 | MCRouter::mc_op_get_service_info | get-service-info - -```basic-usage.hack -function get_simple_mcrouter(): \MCRouter { - $servers = Vector {\getenv('HHVM_TEST_MCROUTER')}; - $mc = \MCRouter::createSimple($servers); - return $mc; -} - -function get_op_name(int $op_num): string { - return \MCRouter::getOpName($op_num); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $mc = get_simple_mcrouter(); - - // You can pass raw integers - \var_dump(get_op_name(3)); - \var_dump(get_op_name(9)); - \var_dump(get_op_name(-1)); - \var_dump(get_op_name(0)); - \var_dump(get_op_name(100)); - - // You can pass MCRouter constants - \var_dump(get_op_name(\MCRouter::mc_op_servererr)); - \var_dump(get_op_name(\MCRouter::mc_op_exec)); - \var_dump(get_op_name(\MCRouter::mc_op_unknown)); - - // You can pass something from an exception too - try { - $val = await $mc->get('KEYDOESNOTEXISTIHOPEREALLY'); - } catch (\MCRouterException $ex) { - \var_dump($ex->getOp()); - \var_dump(get_op_name($ex->getOp())); - } -} -```.hhvm.expectf -string(7) "version" -string(6) "append" -string(7) "unknown" -string(7) "unknown" -string(7) "unknown" -string(9) "servererr" -string(4) "exec" -string(7) "unknown" -int(5) -string(3) "get" -```.example.hhvm.out -string(7) "version" -string(6) "append" -string(7) "unknown" -string(7) "unknown" -string(7) "unknown" -string(9) "servererr" -string(4) "exec" -string(7) "unknown" -int(5) -string(3) "get" -```.skipif -\Hack\UserDocumentation\API\Examples\MCRouter\skipif(); -``` diff --git a/api-examples/class.MCRouter/getResultName.md b/api-examples/class.MCRouter/getResultName.md deleted file mode 100644 index 6f99bb20e..000000000 --- a/api-examples/class.MCRouter/getResultName.md +++ /dev/null @@ -1,99 +0,0 @@ -The following example shows how to use `MCRouter::getResultName` to get the English readable name for an MCRouter result given as an integer. - -Here is the list of the current mappings: - -Integer | Constant | String ---------|----------|------- -0 | MCRouter::mc_res_unknown | mc_res_unknown -1 | MCRouter::mc_res_deleted | mc_res_deleted -2 | MCRouter::mc_res_found | mc_res_found -3 | MCRouter::mc_res_foundstale | mc_res_foundstale -4 | MCRouter::mc_res_notfound | mc_res_notfound -5 | MCRouter::mc_res_notfoundhot | mc_res_notfoundhot -6 | MCRouter::mc_res_notstored | mc_res_notstored -7 | MCRouter::mc_res_stalestored | mc_res_stalestored -8 | MCRouter::mc_res_ok | mc_res_ok -9 | MCRouter::mc_res_stored | mc_res_stored -10 | MCRouter::mc_res_exists | mc_res_exists -11 | MCRouter::mc_res_ooo | mc_res_ooo -12 | MCRouter::mc_res_timeout | mc_res_timeout -13 | MCRouter::mc_res_connect_timeout | mc_res_connect_timeout -14 | MCRouter::mc_res_connect_error | mc_res_connect_error -15 | MCRouter::mc_res_busy | mc_res_busy -16 | MCRouter::mc_res_try_again | mc_res_try_again -17 | MCRouter::mc_res_shutdown | mc_res_shutdown -18 | MCRouter::mc_res_tko | mc_res_tko -19 | MCRouter::mc_res_bad_command | mc_res_bad_command -20 | MCRouter::mc_res_bad_key | mc_res_bad_key -21 | MCRouter::mc_res_bad_flags | mc_res_bad_flags -22 | MCRouter::mc_res_bad_exptime | mc_res_bad_exptime -23 | MCRouter::mc_res_bad_lease_id | mc_res_bad_lease_id -24 | MCRouter::mc_res_bad_cas_id | mc_res_bad_cas_id -25 | MCRouter::mc_res_bad_value | mc_res_bad_value -26 | MCRouter::mc_res_aborted | mc_res_aborted -27 | MCRouter::mc_res_client_error | mc_res_client_error -28 | MCRouter::mc_res_local_error | mc_res_local_error -29 | MCRouter::mc_res_remote_error | mc_res_remote_error -30 | MCRouter::mc_res_waiting | mc_res_waiting -31 | MCRouter::mc_nres | mc_nres - -```basic-usage.hack -function get_simple_mcrouter(): \MCRouter { - $servers = Vector {\getenv('HHVM_TEST_MCROUTER')}; - $mc = \MCRouter::createSimple($servers); - return $mc; -} - -function get_res_name(int $res_num): string { - return \MCRouter::getResultName($res_num); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $mc = get_simple_mcrouter(); - - // You can pass raw integers - \var_dump(get_res_name(3)); - \var_dump(get_res_name(9)); - \var_dump(get_res_name(-1)); - \var_dump(get_res_name(0)); - \var_dump(get_res_name(100)); - - // You can pass MCRouter constants - \var_dump(get_res_name(\MCRouter::mc_res_timeout)); - \var_dump(get_res_name(\MCRouter::mc_res_bad_flags)); - \var_dump(get_res_name(\MCRouter::mc_res_local_error)); - - // You can pass something from an exception too - try { - $val = await $mc->get('KEYDOESNOTEXISTIHOPEREALLY'); - } catch (\MCRouterException $ex) { - \var_dump($ex->getCode()); - \var_dump(get_res_name($ex->getCode())); - } -} -```.hhvm.expectf -string(17) "mc_res_foundstale" -string(13) "mc_res_stored" -string(14) "mc_res_unknown" -string(14) "mc_res_unknown" -string(14) "mc_res_unknown" -string(14) "mc_res_timeout" -string(16) "mc_res_bad_flags" -string(18) "mc_res_local_error" -int(4) -string(15) "mc_res_notfound" -```.example.hhvm.out -string(17) "mc_res_foundstale" -string(13) "mc_res_stored" -string(14) "mc_res_unknown" -string(14) "mc_res_unknown" -string(14) "mc_res_unknown" -string(14) "mc_res_timeout" -string(16) "mc_res_bad_flags" -string(18) "mc_res_local_error" -int(4) -string(15) "mc_res_notfound" -```.skipif -\Hack\UserDocumentation\API\Examples\MCRouter\skipif(); -``` diff --git a/api-examples/class.MCRouter/incr.md b/api-examples/class.MCRouter/incr.md deleted file mode 100644 index 1770e8781..000000000 --- a/api-examples/class.MCRouter/incr.md +++ /dev/null @@ -1,66 +0,0 @@ -The following example shows how to increment a value of a key by a specified integer using `MCRouter::incr`. The value **must** be numeric. - -```basic-usage.hack -function get_simple_mcrouter(): \MCRouter { - $servers = Vector {\getenv('HHVM_TEST_MCROUTER')}; - $mc = \MCRouter::createSimple($servers); - return $mc; -} - -async function set_value( - \MCRouter $mc, - string $key, - string $value, -): Awaitable { - // can also pass optional int flags and int expiration time (in seconds) - await $mc->set($key, $value); -} - -async function inc_value( - \MCRouter $mc, - string $key, - int $amount, -): Awaitable { - await $mc->incr($key, $amount); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $mc = get_simple_mcrouter(); - $unique_key = \str_shuffle('ABCDEFGHIJKLMN'); - await set_value($mc, $unique_key, "1"); - $val = await $mc->get($unique_key); - \var_dump($val); - await inc_value($mc, $unique_key, 3); - $val = await $mc->get($unique_key); - \var_dump($val); - - // Try on a value not numeric - $unique_key = \str_shuffle('ABCDEFGHIJKLMN'); - await set_value($mc, $unique_key, "B"); - $val = await $mc->get($unique_key); - \var_dump($val); - try { - await inc_value($mc, $unique_key, 3); // won't be "E" :) - $val = await $mc->get($unique_key); - \var_dump($val); - } catch (\MCRouterException $ex) { - \var_dump($ex->getMessage()); // can't increment on a string - \var_dump($val); - } -} -```.hhvm.expectf -string(1) "1" -string(1) "4" -string(1) "B" -string(39) "incr failed with result mc_res_notfound" -string(1) "B" -```.example.hhvm.out -string(1) "1" -string(1) "4" -string(1) "B" -string(39) "incr failed with result mc_res_notfound" -string(1) "B" -```.skipif -\Hack\UserDocumentation\API\Examples\MCRouter\skipif(); -``` diff --git a/api-examples/class.MCRouter/prepend.md b/api-examples/class.MCRouter/prepend.md deleted file mode 100644 index 7885092b2..000000000 --- a/api-examples/class.MCRouter/prepend.md +++ /dev/null @@ -1,47 +0,0 @@ -The following example shows how to use the `MCRouter::prepend` function. - -```basic-usage.hack -function get_simple_mcrouter(): \MCRouter { - $servers = Vector {\getenv('HHVM_TEST_MCROUTER')}; - $mc = \MCRouter::createSimple($servers); - return $mc; -} - -async function set_value( - \MCRouter $mc, - string $key, - string $value, -): Awaitable { - // can also pass optional int flags and int expiration time (in seconds) - await $mc->set($key, $value); -} - -async function prepend_to_value( - \MCRouter $mc, - string $key, - string $prepend_str, -): Awaitable { - await $mc->prepend($key, $prepend_str); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $mc = get_simple_mcrouter(); - $unique_key = \str_shuffle('ABCDEFGHIJKLMN'); - await set_value($mc, $unique_key, 'Hi'); - $val = await $mc->get($unique_key); - \var_dump($val); - try { - await prepend_to_value($mc, $unique_key, 'Oh'); - $val = await $mc->get($unique_key); - \var_dump($val); - } catch (\MCRouterException $ex) { - \var_dump($ex->getMessage()); - } -} -```.hhvm.expect -string(2) "Hi" -string(4) "OhHi" -```.skipif -\Hack\UserDocumentation\API\Examples\MCRouter\skipif(); -``` diff --git a/api-examples/class.MCRouter/replace.md b/api-examples/class.MCRouter/replace.md deleted file mode 100644 index a6c2109aa..000000000 --- a/api-examples/class.MCRouter/replace.md +++ /dev/null @@ -1,76 +0,0 @@ -The following example shows how to use `MCRouter::replace` to replace a key/value pair in the memcached server. You can only call `replace` on a currently existing key (e.g., one that has been added via `MCRouter::add` or `MCRouter::set`). In many cases a call to `set/set` is the same as a call to `add/replace`, accomplishing the same thing. - -If you pass an expiration time for the key, that is in seconds. - -And these are the bitwise or style flags that can be passed to `replace`: - -``` -MC_MSG_FLAG_PHP_SERIALIZED = 0x1, -MC_MSG_FLAG_COMPRESSED = 0x2, -MC_MSG_FLAG_FB_SERIALIZED = 0x4, -MC_MSG_FLAG_FB_COMPACT_SERIALIZED = 0x8, -MC_MSG_FLAG_ASCII_INT_SERIALIZED = 0x10, -MC_MSG_FLAG_NZLIB_COMPRESSED = 0x800, -MC_MSG_FLAG_QUICKLZ_COMPRESSED = 0x2000, -MC_MSG_FLAG_SNAPPY_COMPRESSED = 0x4000, -MC_MSG_FLAG_BIG_VALUE = 0X8000, -MC_MSG_FLAG_NEGATIVE_CACHE = 0x10000, -MC_MSG_FLAG_HOT_KEY = 0x20000, -``` - -See the [header file with the flags](https://github.com/facebook/mcrouter/blob/5f259ed47b52f86cad750d2343edf324e80cb397/mcrouter/lib/mc/msg.h) - -```basic-usage.hack -function get_simple_mcrouter(): \MCRouter { - $servers = Vector {\getenv('HHVM_TEST_MCROUTER')}; - $mc = \MCRouter::createSimple($servers); - return $mc; -} - -async function add_value( - \MCRouter $mc, - string $key, - string $value, -): Awaitable { - await $mc->add($key, $value); -} - -async function replace_value( - \MCRouter $mc, - string $key, - string $value, -): Awaitable { - // can also pass optional int flags and int expiration time (in seconds) - await $mc->replace($key, $value); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $mc = get_simple_mcrouter(); - $unique_key = \str_shuffle('ABCDEFGHIJKLMN'); - try { - // We never added or set this key, so it can't be replaced. - await replace_value($mc, $unique_key, "Bye"); - $val = await $mc->get($unique_key); - \var_dump($val); - } catch (\MCRouterException $ex) { - \var_dump($ex->getMessage()); // We will get here - } - await add_value($mc, $unique_key, "Hi"); - $val = await $mc->get($unique_key); - \var_dump($val); - await replace_value($mc, $unique_key, "Bye"); - $val = await $mc->get($unique_key); - \var_dump($val); -} -```.hhvm.expectf -string(43) "replace failed with result mc_res_notstored" -string(2) "Hi" -string(3) "Bye" -```.example.hhvm.out -string(43) "replace failed with result mc_res_notstored" -string(2) "Hi" -string(3) "Bye" -```.skipif -\Hack\UserDocumentation\API\Examples\MCRouter\skipif(); -``` diff --git a/api-examples/class.MCRouter/set.md b/api-examples/class.MCRouter/set.md deleted file mode 100644 index 576e6a910..000000000 --- a/api-examples/class.MCRouter/set.md +++ /dev/null @@ -1,63 +0,0 @@ -The following example shows how to use `MCRouter::set` to set key/value pair to the memcached server. While you cannot `MCRouter::add` the same key twice, you can reset a value for a given key via `set`. It is quite possible to always use `set` instead of `add` since it is generally superset of functionality, but `add` can be good if you explicitly want to catch someone trying to set a key to a different value. - -If you pass an expiration time for the key, that is in seconds. - -And these are the bitwise or style flags that can be passed to `set`: - -``` -MC_MSG_FLAG_PHP_SERIALIZED = 0x1, -MC_MSG_FLAG_COMPRESSED = 0x2, -MC_MSG_FLAG_FB_SERIALIZED = 0x4, -MC_MSG_FLAG_FB_COMPACT_SERIALIZED = 0x8, -MC_MSG_FLAG_ASCII_INT_SERIALIZED = 0x10, -MC_MSG_FLAG_NZLIB_COMPRESSED = 0x800, -MC_MSG_FLAG_QUICKLZ_COMPRESSED = 0x2000, -MC_MSG_FLAG_SNAPPY_COMPRESSED = 0x4000, -MC_MSG_FLAG_BIG_VALUE = 0X8000, -MC_MSG_FLAG_NEGATIVE_CACHE = 0x10000, -MC_MSG_FLAG_HOT_KEY = 0x20000, -``` - -See the [header file with the flags](https://github.com/facebook/mcrouter/blob/5f259ed47b52f86cad750d2343edf324e80cb397/mcrouter/lib/mc/msg.h) - -```basic-usage.hack -function get_simple_mcrouter(): \MCRouter { - $servers = Vector {\getenv('HHVM_TEST_MCROUTER')}; - $mc = \MCRouter::createSimple($servers); - return $mc; -} - -async function set_value( - \MCRouter $mc, - string $key, - string $value, -): Awaitable { - // can also pass optional int flags and int expiration time (in seconds) - await $mc->set($key, $value); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $mc = get_simple_mcrouter(); - $unique_key = \str_shuffle('ABCDEFGHIJKLMN'); - await set_value($mc, $unique_key, "Hi"); - $val = await $mc->get($unique_key); - \var_dump($val); - try { - // Setting the same key again is fine - await set_value($mc, $unique_key, "Bye"); - $val = await $mc->get($unique_key); - \var_dump($val); - } catch (\MCRouterException $ex) { - \var_dump($ex->getMessage()); // We should not get here - } -} -```.hhvm.expectf -string(2) "Hi" -string(3) "Bye" -```.example.hhvm.out -string(2) "Hi" -string(3) "Bye" -```.skipif -\Hack\UserDocumentation\API\Examples\MCRouter\skipif(); -``` diff --git a/api-examples/class.MCRouter/version.md b/api-examples/class.MCRouter/version.md deleted file mode 100644 index e3be80015..000000000 --- a/api-examples/class.MCRouter/version.md +++ /dev/null @@ -1,33 +0,0 @@ -The following example allows you to use `MCRouter::version` to get the version information of the memcached server you are connected to. - -```basic-usage.hack -function get_simple_mcrouter(): \MCRouter { - $servers = Vector {\getenv('HHVM_TEST_MCROUTER')}; - $mc = \MCRouter::createSimple($servers); - return $mc; -} - -async function get_version(\MCRouter $mc): Awaitable { - $ret = null; - try { - $ret = await $mc->version(); - } catch (\MCRouterException $ex) { - \var_dump($ex->getMessage()); - } - return $ret; - -} - -<<__EntryPoint>> -async function run(): Awaitable { - $mc = get_simple_mcrouter(); - $ver = await get_version($mc); - \var_dump($ver); -} -```.hhvm.expectf -string(%d) "%s" -```.example.hhvm.out -string(5) "1.4.4" -```.skipif -\Hack\UserDocumentation\API\Examples\MCRouter\skipif(); -``` diff --git a/api-examples/class.MCRouterException/__construct.md b/api-examples/class.MCRouterException/__construct.md deleted file mode 100644 index 445da9009..000000000 --- a/api-examples/class.MCRouterException/__construct.md +++ /dev/null @@ -1,32 +0,0 @@ -You normally will catch a `MCRouterException` over constructing one explicitly, but it can be done. Here is an example where you can check the version of the memcached server and throw if you don't have the right one. - -```basic-usage.hack -async function simple_mcrouter(): Awaitable { - $servers = Vector {\getenv('HHVM_TEST_MCROUTER')}; - $mc = \MCRouter::createSimple($servers); - $ver = await $mc->version(); - if (\strpos($ver, "100.100") === false) { - throw new \MCRouterException( - "The version of memcached is not right", - \MCRouter::mc_res_connect_error, - \MCRouter::mc_op_servererr, - ); - } -} - - -<<__EntryPoint>> -async function run(): Awaitable { - try { - await simple_mcrouter(); - } catch (\MCRouterException $ex) { - \var_dump($ex->getMessage()); - \var_dump($ex->getOp()); - } -} -```.hhvm.expect -string(37) "The version of memcached is not right" -int(14) -```.skipif -\Hack\UserDocumentation\API\Examples\MCRouter\skipif(); -``` diff --git a/api-examples/class.MCRouterException/getKey.md b/api-examples/class.MCRouterException/getKey.md deleted file mode 100644 index 764ee4851..000000000 --- a/api-examples/class.MCRouterException/getKey.md +++ /dev/null @@ -1,38 +0,0 @@ -The following example shows how to retrieve the key from an `MCRouterException` using its `getKey` method. If there is no key associated with the exception, then `""` will be returned. - -```basic-usage.hack -function get_simple_mcrouter(): \MCRouter { - $servers = Vector {\getenv('HHVM_TEST_MCROUTER')}; - $mc = \MCRouter::createSimple($servers); - return $mc; -} - -async function add_value( - \MCRouter $mc, - string $key, - string $value, -): Awaitable { - // can also pass optional int flags and int expiration time (in seconds) - await $mc->add($key, $value); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $mc = get_simple_mcrouter(); - $unique_key = \str_shuffle('ABCDEFGHIJKLMN'); - await add_value($mc, $unique_key, "Hi"); - $val = await $mc->get($unique_key); - try { - // Shouldn't be able to add the same key twice - await add_value($mc, $unique_key, "Bye"); - } catch (\MCRouterException $ex) { - \var_dump($ex->getKey()); // will output $unique_key - } -} -```.hhvm.expectf -string(%d) "%s" -```.example.hhvm.out -string(14) "LGMEBIKHADCFJN" -```.skipif -\Hack\UserDocumentation\API\Examples\MCRouter\skipif(); -``` diff --git a/api-examples/class.MCRouterException/getOp.md b/api-examples/class.MCRouterException/getOp.md deleted file mode 100644 index e9fd3ab10..000000000 --- a/api-examples/class.MCRouterException/getOp.md +++ /dev/null @@ -1,44 +0,0 @@ -The following example shows how to retrieve the memcached operation from an `MCRouterException` using its `getOp` method. Then we get its friendly name via `MCRouter::getOpName()`. - -```basic-usage.hack -function get_simple_mcrouter(): \MCRouter { - $servers = Vector {\getenv('HHVM_TEST_MCROUTER')}; - $mc = \MCRouter::createSimple($servers); - return $mc; -} - -async function add_value( - \MCRouter $mc, - string $key, - string $value, -): Awaitable { - // can also pass optional int flags and int expiration time (in seconds) - await $mc->add($key, $value); -} - -<<__EntryPoint>> -async function run(): Awaitable { - $mc = get_simple_mcrouter(); - $unique_key = \str_shuffle('ABCDEFGHIJKLMN'); - await add_value($mc, $unique_key, "Hi"); - $val = await $mc->get($unique_key); - try { - // Shouldn't be able to add the same key twice - await add_value($mc, $unique_key, "Bye"); - } catch (\MCRouterException $ex) { - \var_dump($ex->getMessage()); - \var_dump($ex->getOp()); // will output an integer - \var_dump(\MCRouter::getOpName($ex->getOp())); // will output friendlyt name - } -} -```.hhvm.expectf -string(39) "add failed with result mc_res_notstored" -int(7) -string(3) "add" -```.example.hhvm.out -string(39) "add failed with result mc_res_notstored" -int(7) -string(3) "add" -```.skipif -\Hack\UserDocumentation\API\Examples\MCRouter\skipif(); -``` diff --git a/api-examples/class.MCRouterOptionException/__construct.md b/api-examples/class.MCRouterOptionException/__construct.md deleted file mode 100644 index 7b435a3ba..000000000 --- a/api-examples/class.MCRouterOptionException/__construct.md +++ /dev/null @@ -1,57 +0,0 @@ -You normally will catch a `MCRouterOptionException` over constructing one explicitly, but it can be done. Here is an example where you can check the options and throw the exception with a custom error if you don't have good options. - -```basic-usage.hack -function construct_mcrouter(darray $options): void { - if (!\array_key_exists('config_str', $options)) { - // You can have multiple string => string errors in the array - $errors = varray[darray['format' => 'Need config string']]; - throw new \MCRouterOptionException($errors); - } - $mc = new \MCRouter($options); - -} - -<<__EntryPoint>> -function run(): void { - $servers = Vector {\getenv('HHVM_TEST_MCROUTER')}; - // For many use cases, calling MCRouter::createSimple($servers) would - // suffice here. But this shows you how to explicitly create the configuration - // options for creating an instance of MCRouter - $options = darray[ - 'config_sentence' => \json_encode( - darray[ - 'pools' => darray[ - 'P' => darray[ - 'servers' => $servers, - ], - ], - 'route' => 'PoolRoute|P', - ], - ), - ]; - try { - construct_mcrouter($options); - } catch (\MCRouterOptionException $ex) { - \var_dump($ex->getMessage()); - \var_dump($ex->getErrors()); // An array of 'format' => 'Need config string' - } -} -```.hhvm.expectf -string(23) "Failure parsing options" -varray(1) { - darray(1) { - ["format"]=> - string(18) "Need config string" - } -} -```.example.hhvm.out -string(23) "Failure parsing options" -varray(1) { - darray(1) { - ["format"]=> - string(18) "Need config string" - } -} -```.skipif -\Hack\UserDocumentation\API\Examples\MCRouter\skipif(); -``` diff --git a/api-examples/class.MCRouterOptionException/getErrors.md b/api-examples/class.MCRouterOptionException/getErrors.md deleted file mode 100644 index 65f05bdb1..000000000 --- a/api-examples/class.MCRouterOptionException/getErrors.md +++ /dev/null @@ -1,43 +0,0 @@ -The following example shows you how to get the errors that are available when bad options are passed to the `MCRouter` constructor using `MCRouterOptionException::getErrors` - -```basic-usage.hack -$servers = Vector {\getenv('HHVM_TEST_MCROUTER')}; -// For many use cases, calling MCRouter::createSimple($servers) would -// suffice here. But this shows you how to explicitly create the configuration -// options for creating an instance of MCRouter - -// This has a bad option setup -$options = darray['asynclog_disable' => 'purple']; - -$mc = null; - -try { - $mc = new \MCRouter($options); -} catch (\MCRouterOptionException $ex) { - \var_dump($ex->getErrors()); -} -```.hhvm.expectf -varray(1) { - darray(3) { - ["option"]=> - string(16) "asynclog_disable" - ["value"]=> - string(6) "purple" - ["error"]=> - string(%d) "couldn't convert value to integer. Exception: %s - } -} -```.example.hhvm.out -varray(1) { - darray(3) { - ["option"]=> - string(16) "asynclog_disable" - ["value"]=> - string(6) "purple" - ["error"]=> - string(78) "couldn't convert value to integer. Exception: Invalid value for bool: "purple"" - } -} -```.skipif -\Hack\UserDocumentation\API\Examples\MCRouter\skipif(); -``` diff --git a/api-examples/function.HH.Asio.curl_exec.md b/api-examples/function.HH.Asio.curl_exec.md deleted file mode 100644 index e043ef577..000000000 --- a/api-examples/function.HH.Asio.curl_exec.md +++ /dev/null @@ -1,22 +0,0 @@ -The following shows a scenario where you are going to wait for and return the result of cURL activity on URLs, using the convenient wrapper that is `curl_exec`. - -```basic-usage.hack -async function get_curl_content(Set $urls): Awaitable> { - $content = Vector {}; - foreach ($urls as $url) { - $str = await \HH\Asio\curl_exec($url); - $content[] = \substr($str, 0, 10); - } - return $content; -} - -<<__EntryPoint>> -async function run(): Awaitable { - $urls = Set { - 'https://hhvm.com/blog/2020/05/04/hhvm-4.56.html', - 'https://hhvm.com/blog/2020/10/21/hhvm-4.80.html', - }; - $content = await get_curl_content($urls); - \var_dump($content); -} -``` diff --git a/api-examples/function.HH.Asio.m.md b/api-examples/function.HH.Asio.m.md deleted file mode 100644 index 278a938eb..000000000 --- a/api-examples/function.HH.Asio.m.md +++ /dev/null @@ -1,35 +0,0 @@ -```basic-usage.hack -/** - * Query an arbitrary number of URLs in parallel - * returning them as a Map of string responses. - */ -async function get_urls( - \ConstMap $urls, -): Awaitable> { - // Wrap each URL string into a curl_exec awaitable - $handles = $urls->map($url ==> \HH\Asio\curl_exec($url)); - - // Wait on each handle in parallel and return the results - return await \HH\Asio\m($handles); -} - -<<__EntryPoint>> -async function basic_usage_main(): Awaitable { - $urls = ImmMap { - 'com' => "http://example.com", - 'net' => "http://example.net", - 'org' => "http://example.org", - }; - - $pages = await get_urls($urls); - foreach ($pages as $name => $page) { - echo $name.': '; - echo \substr($page, 0, 15).' ... '.\substr($page, -8); - } -} -```.skipif -// Skip if we don't have an internet connection -if (!\get_headers("www.example.com")) { - print "skip"; -} -``` diff --git a/api-examples/function.HH.Asio.mf.md b/api-examples/function.HH.Asio.mf.md deleted file mode 100644 index d186bd72c..000000000 --- a/api-examples/function.HH.Asio.mf.md +++ /dev/null @@ -1,33 +0,0 @@ -```basic-usage.hack -enum COLOR: int { - RED = 1; - ORANGE = 2; - YELLOW = 3; - GREEN = 4; - BLUE = 5; - INDIGO = 6; - VIOLET = 7; -} - -<<__EntryPoint>> -async function basic_usage_main(): Awaitable { - $fruits = ImmMap { - 'Apple' => COLOR::RED, - 'Banana' => COLOR::YELLOW, - 'Grape' => COLOR::GREEN, - 'Orange' => COLOR::ORANGE, - 'Pineapple' => COLOR::YELLOW, - 'Tangerine' => COLOR::ORANGE, - }; - - // Similar to $times->filter(...) - // But awaits the awaitable result of the callback - // rather than using it directly - $orange_fruits = - await \HH\Asio\mf($fruits, async ($color) ==> ($color == COLOR::ORANGE)); - - foreach ($orange_fruits as $fruit => $color) { - echo $fruit, 's are ', COLOR::getNames()[$color], "\n"; - } -} -``` diff --git a/api-examples/function.HH.Asio.mfk.md b/api-examples/function.HH.Asio.mfk.md deleted file mode 100644 index 1c38975fc..000000000 --- a/api-examples/function.HH.Asio.mfk.md +++ /dev/null @@ -1,37 +0,0 @@ -```basic-usage.hack -enum COLOR: int { - RED = 1; - ORANGE = 2; - YELLOW = 3; - GREEN = 4; - BLUE = 5; - INDIGO = 6; - VIOLET = 7; -} - -<<__EntryPoint>> -async function basic_usage_main(): Awaitable { - $fruits = ImmMap { - 'Apple' => COLOR::RED, - 'Banana' => COLOR::YELLOW, - 'Grape' => COLOR::GREEN, - 'Orange' => COLOR::ORANGE, - 'Pineapple' => COLOR::YELLOW, - 'Tangerine' => COLOR::ORANGE, - }; - - // Similar to $times->filter(...) - // But awaits the awaitable result of the callback - // rather than using it directly - $not_self_named = await \HH\Asio\mfk( - $fruits, - - // Exclude fruits who's name is the same as their color - async ($name, $color) ==> \strcasecmp($name, COLOR::getNames()[$color]), - ); - - foreach ($not_self_named as $fruit => $color) { - echo $fruit, 's are ', COLOR::getNames()[$color], "\n"; - } -} -``` diff --git a/api-examples/function.HH.Asio.mfkw.md b/api-examples/function.HH.Asio.mfkw.md deleted file mode 100644 index 65b4ae0b9..000000000 --- a/api-examples/function.HH.Asio.mfkw.md +++ /dev/null @@ -1,36 +0,0 @@ -```basic-usage.hack -<<__EntryPoint>> -async function basic_usage_main(): Awaitable { - // Return all non-negative odd numbers - // Positive evens filtered out, - // Negatives and zero cause exception - $odds = await \HH\Asio\mfkw( - Map { - '-one' => -1, - 'zero' => 0, - 'one' => 1, - 'two' => 2, - 'three' => 3, - 'four' => 4, - }, - - async ($num, $val) ==> { - if ($val <= 0) { - throw new \Exception("$num is non-positive"); - } else { - return ($val % 2) == 1; - } - }, - ); - - foreach ($odds as $num => $result) { - if ($result->isSucceeded()) { - echo "$num Success: "; - \var_dump($result->getResult()); - } else { - echo "$num Failed: "; - \var_dump($result->getException()->getMessage()); - } - } -} -``` diff --git a/api-examples/function.HH.Asio.mfw.md b/api-examples/function.HH.Asio.mfw.md deleted file mode 100644 index f47c42f74..000000000 --- a/api-examples/function.HH.Asio.mfw.md +++ /dev/null @@ -1,36 +0,0 @@ -```basic-usage.hack -<<__EntryPoint>> -async function basic_usage_main(): Awaitable { - // Return all non-negative odd numbers - // Positive evens filtered out, - // Negatives and zero cause exception - $odds = await \HH\Asio\mfw( - Map { - '-one' => -1, - 'zero' => 0, - 'one' => 1, - 'two' => 2, - 'three' => 3, - 'four' => 4, - }, - - async ($val) ==> { - if ($val <= 0) { - throw new \Exception("$val is non-positive"); - } else { - return ($val % 2) == 1; - } - }, - ); - - foreach ($odds as $num => $result) { - if ($result->isSucceeded()) { - echo "$num Success: "; - \var_dump($result->getResult()); - } else { - echo "$num Failed: "; - \var_dump($result->getException()->getMessage()); - } - } -} -``` diff --git a/api-examples/function.HH.Asio.mm.md b/api-examples/function.HH.Asio.mm.md deleted file mode 100644 index 7b12050bd..000000000 --- a/api-examples/function.HH.Asio.mm.md +++ /dev/null @@ -1,36 +0,0 @@ -```basic-usage.hack -/** - * Query an arbitrary number of URLs in parallel - * returning them as a Map of string responses. - * - * Refer to \HH\Asio\m() for a more verbose version of this. - */ -async function get_urls( - \ConstMap $urls, -): Awaitable> { - - // Invoke \HH\Asio\curl_exec for each URL, - // then await on each in parallel - return await \HH\Asio\mm($urls, fun("\HH\Asio\curl_exec")); -} - -<<__EntryPoint>> -async function basic_usage_main(): Awaitable { - $urls = ImmMap { - 'com' => "http://example.com", - 'net' => "http://example.net", - 'org' => "http://example.org", - }; - - $pages = await get_urls($urls); - foreach ($pages as $name => $page) { - echo $name, ': '; - echo \substr($page, 0, 15).' ... '.\substr($page, -8); - } -} -```.skipif -// Skip if we don't have an internet connection -if (!\get_headers("www.example.com")) { - print "skip"; -} -``` diff --git a/api-examples/function.HH.Asio.mmk.md b/api-examples/function.HH.Asio.mmk.md deleted file mode 100644 index 57dad0486..000000000 --- a/api-examples/function.HH.Asio.mmk.md +++ /dev/null @@ -1,39 +0,0 @@ -```basic-usage.hack -/** - * Query an arbitrary number of URLs in parallel - * returning them as a Map of string responses. - */ -async function get_urls( - \ConstMap $urls, -): Awaitable> { - - // Await on curl requests in parallel and - // prepend the request ID index - return await \HH\Asio\mmk( - $urls, - async ($name, $url) ==> { - $content = await \HH\Asio\curl_exec($url); - return $name." => ".$content; - }, - ); -} - -<<__EntryPoint>> -async function basic_usage_main(): Awaitable { - $urls = ImmMap { - 'com' => "http://example.com", - 'net' => "http://example.net", - 'org' => "http://example.org", - }; - - $pages = await get_urls($urls); - foreach ($pages as $page) { - echo \substr($page, 0, 22).' ... '.\substr($page, -8); - } -} -```.skipif -// Skip if we don't have an internet connection -if (!\get_headers("www.example.com")) { - print "skip"; -} -``` diff --git a/api-examples/function.HH.Asio.mmkw.md b/api-examples/function.HH.Asio.mmkw.md deleted file mode 100644 index 3a3cfd287..000000000 --- a/api-examples/function.HH.Asio.mmkw.md +++ /dev/null @@ -1,35 +0,0 @@ -```basic-usage.hack -<<__EntryPoint>> -async function basic_usage_main(): Awaitable { - // Map a vector of numbers to their value divided by their index - // throwing on division by zero. - $quotients = await \HH\Asio\mmkw( - Map { - 1 => 1, - 0 => 2, - 2 => 6, - 3 => 12, - }, - - async ($div, $val) ==> { - if ($div != 0) { - return $val / $div; - } else { - throw new \Exception( - "Division by zero: ".\print_r($val, true).'/'.\print_r($div, true), - ); - } - }, - ); - - foreach ($quotients as $result) { - if ($result->isSucceeded()) { - echo " Success: "; - \var_dump($result->getResult()); - } else { - echo "Failed: "; - \var_dump($result->getException()->getMessage()); - } - } -} -``` diff --git a/api-examples/function.HH.Asio.mmw.md b/api-examples/function.HH.Asio.mmw.md deleted file mode 100644 index 9cfecb13b..000000000 --- a/api-examples/function.HH.Asio.mmw.md +++ /dev/null @@ -1,33 +0,0 @@ -```basic-usage.hack -<<__EntryPoint>> -async function basic_usage_main(): Awaitable { - // Map a map of numbers to their integer half - // throwing if they can't be divided evenly - $halves = await \HH\Asio\mmw( - Map { - 'one' => 1, - 'two' => 2, - 'three' => 3, - 'four' => 4, - }, - - async ($val) ==> { - if ($val % 2) { - throw new \Exception("$val is an odd number"); - } else { - return $val / 2; - } - }, - ); - - foreach ($halves as $num => $result) { - if ($result->isSucceeded()) { - echo "$num / two Success: "; - \var_dump($result->getResult()); - } else { - echo "$num / two Failed: "; - \var_dump($result->getException()->getMessage()); - } - } -} -``` diff --git a/api-examples/function.HH.Asio.mw.md b/api-examples/function.HH.Asio.mw.md deleted file mode 100644 index 76d327e0d..000000000 --- a/api-examples/function.HH.Asio.mw.md +++ /dev/null @@ -1,31 +0,0 @@ -```basic-usage.hack -async function one(): Awaitable { - return 1; -} - -<<__EntryPoint>> -async function basic_usage_main(): Awaitable { - $mcr = \MCRouter::createSimple(ImmVector {}); - - $handles = \HH\Asio\mw(Map { - // This will throw an exception, since there's no servers to speak to - 'cache' => $mcr->get("no-such-key"), - - // While this will obviously succeed - 'one' => one(), - }); - - $results = await $handles; - foreach ($results as $key => $result) { - if ($result->isSucceeded()) { - echo "$key Success: "; - \var_dump($result->getResult()); - } else { - echo "$key Failed: "; - \var_dump($result->getException()->getMessage()); - } - } -} -```.skipif -\Hack\UserDocumentation\API\Examples\MCRouter\skipif(); -``` diff --git a/api-examples/function.HH.Asio.v.md b/api-examples/function.HH.Asio.v.md deleted file mode 100644 index 0dc61bd1a..000000000 --- a/api-examples/function.HH.Asio.v.md +++ /dev/null @@ -1,32 +0,0 @@ -```basic-usage.hack -/** - * Query an arbitrary number of URLs in parallel - * returning them as a Vector of string responses. - */ -async function get_urls(\ConstVector $urls): Awaitable> { - // Wrap each URL string into a curl_exec awaitable - $handles = $urls->map($url ==> \HH\Asio\curl_exec($url)); - - // Wait on each handle in parallel and return the results - return await \HH\Asio\v($handles); -} - -<<__EntryPoint>> -async function basic_usage_main(): Awaitable { - $urls = ImmVector { - "http://example.com", - "http://example.net", - "http://example.org", - }; - - $pages = await get_urls($urls); - foreach ($pages as $page) { - echo \substr($page, 0, 15).' ... '.\substr($page, -8); - } -} -```.skipif -// Skip if we don't have an internet connection -if (!\get_headers("www.example.com")) { - print "skip"; -} -``` diff --git a/api-examples/function.HH.Asio.vf.md b/api-examples/function.HH.Asio.vf.md deleted file mode 100644 index dbf449c8b..000000000 --- a/api-examples/function.HH.Asio.vf.md +++ /dev/null @@ -1,27 +0,0 @@ -```basic-usage.hack -<<__EntryPoint>> -async function basic_usage_main(): Awaitable { - $times = ImmVector { - 100000000, // Sat, 03 Mar 1973 09:46:40 - 200000000, // Mon, 03 May 1976 19:33:20 - 300000000, // Thu, 05 Jul 1979 05:20:00 - 400000000, // Sat, 04 Sep 1982 15:06:40 - 500000000, // Tue, 05 Nov 1985 00:53:20 - 600000000, // Thu, 05 Jan 1989 10:40:00 - 700000000, // Sat, 07 Mar 1992 20:26:40 - 800000000, // Tue, 09 May 1995 06:13:20 - 900000000, // Thu, 09 Jul 1998 16:00:00 - 1000000000, // Sun, 09 Sep 2001 01:46:40 - }; - - // Similar to $times->filter(...) - // But awaits the awaitable result of the callback - // rather than using it directly - $saturdays = - await \HH\Asio\vf($times, async ($time) ==> (\gmdate('w', $time) === '6')); - - foreach ($saturdays as $time) { - echo \gmdate('r', $time), "\n"; - } -} -``` diff --git a/api-examples/function.HH.Asio.vfk.md b/api-examples/function.HH.Asio.vfk.md deleted file mode 100644 index 0e4c5ac08..000000000 --- a/api-examples/function.HH.Asio.vfk.md +++ /dev/null @@ -1,30 +0,0 @@ -```basic-usage.hack -<<__EntryPoint>> -async function basic_usage_main(): Awaitable { - $times = ImmVector { - 100000000, // Sat, 03 Mar 1973 09:46:40 - 200000000, // Mon, 03 May 1976 19:33:20 - 300000000, // Thu, 05 Jul 1979 05:20:00 - 400000000, // Sat, 04 Sep 1982 15:06:40 - 500000000, // Tue, 05 Nov 1985 00:53:20 - 600000000, // Thu, 05 Jan 1989 10:40:00 - 700000000, // Sat, 07 Mar 1992 20:26:40 - 800000000, // Tue, 09 May 1995 06:13:20 - 900000000, // Thu, 09 Jul 1998 16:00:00 - 1000000000, // Sun, 09 Sep 2001 01:46:40 - }; - - // Similar to $times->filter(...) - // But awaits the awaitable result of the callback - // rather than using it directly - $saturdays = await \HH\Asio\vfk( - $times, - // All saturdays EXCEPT the one which happens to be the first vector element - async ($idx, $time) ==> ($idx > 0) && (\gmdate('w', $time) === '6'), - ); - - foreach ($saturdays as $time) { - echo \gmdate('r', $time), "\n"; - } -} -``` diff --git a/api-examples/function.HH.Asio.vfkw.md b/api-examples/function.HH.Asio.vfkw.md deleted file mode 100644 index d2720ebe0..000000000 --- a/api-examples/function.HH.Asio.vfkw.md +++ /dev/null @@ -1,29 +0,0 @@ -```basic-usage.hack -<<__EntryPoint>> -async function basic_usage_main(): Awaitable { - // Return all non-negative odd numbers - // Positive evens and odds at every third index filtered out, - // Negatives and zero cause exception - $odds = await \HH\Asio\vfkw( - Vector {-1, 0, 1, 2, 3, 4, 5}, - - async ($idx, $val) ==> { - if ($val <= 0) { - throw new \Exception("$val is non-positive"); - } else { - return ($idx % 3) && ($val % 2); - } - }, - ); - - foreach ($odds as $result) { - if ($result->isSucceeded()) { - echo "Success: "; - \var_dump($result->getResult()); - } else { - echo "Failed: "; - \var_dump($result->getException()->getMessage()); - } - } -} -``` diff --git a/api-examples/function.HH.Asio.vfw.md b/api-examples/function.HH.Asio.vfw.md deleted file mode 100644 index e64b4e025..000000000 --- a/api-examples/function.HH.Asio.vfw.md +++ /dev/null @@ -1,29 +0,0 @@ -```basic-usage.hack -<<__EntryPoint>> -async function basic_usage_main(): Awaitable { - // Return all non-negative odd numbers - // Positive evens filtered out, - // Negatives and zero cause exception - $odds = await \HH\Asio\vfw( - Vector {-1, 0, 1, 2, 3, 4}, - - async ($val) ==> { - if ($val <= 0) { - throw new \Exception("$val is non-positive"); - } else { - return ($val % 2) == 1; - } - }, - ); - - foreach ($odds as $result) { - if ($result->isSucceeded()) { - echo "Success: "; - \var_dump($result->getResult()); - } else { - echo "Failed: "; - \var_dump($result->getException()->getMessage()); - } - } -} -``` diff --git a/api-examples/function.HH.Asio.vm.md b/api-examples/function.HH.Asio.vm.md deleted file mode 100644 index 787525e01..000000000 --- a/api-examples/function.HH.Asio.vm.md +++ /dev/null @@ -1,33 +0,0 @@ -```basic-usage.hack -/** - * Query an arbitrary number of URLs in parallel - * returning them as a Vector of string responses. - * - * Refer to \HH\Asio\v() for a more verbose version of this. - */ -async function get_urls(\ConstVector $urls): Awaitable> { - - // Invoke \HH\Asio\curl_exec for each URL, - // then await on each in parallel - return await \HH\Asio\vm($urls, fun("\HH\Asio\curl_exec")); -} - -<<__EntryPoint>> -async function basic_usage_main(): Awaitable { - $urls = ImmVector { - "http://example.com", - "http://example.net", - "http://example.org", - }; - - $pages = await get_urls($urls); - foreach ($pages as $page) { - echo \substr($page, 0, 15).' ... '.\substr($page, -8); - } -} -```.skipif -// Skip if we don't have an internet connection -if (!\get_headers("www.example.com")) { - print "skip"; -} -``` diff --git a/api-examples/function.HH.Asio.vmk.md b/api-examples/function.HH.Asio.vmk.md deleted file mode 100644 index b49e2d7b4..000000000 --- a/api-examples/function.HH.Asio.vmk.md +++ /dev/null @@ -1,37 +0,0 @@ -```basic-usage.hack -/** - * Query an arbitrary number of URLs in parallel - * returning them as a Vector of string responses. - */ -async function get_urls(\ConstVector $urls): Awaitable> { - - // Await on curl requests in parallel and - // prepend the request ID index - return await \HH\Asio\vmk( - $urls, - async ($idx, $url) ==> { - $content = await \HH\Asio\curl_exec($url); - return $idx." => ".$content; - }, - ); -} - -<<__EntryPoint>> -async function basic_usage_main(): Awaitable { - $urls = ImmVector { - "http://example.com", - "http://example.net", - "http://example.org", - }; - - $pages = await get_urls($urls); - foreach ($pages as $page) { - echo \substr($page, 0, 20).' ... '.\substr($page, -8); - } -} -```.skipif -// Skip if we don't have an internet connection -if (!\get_headers("www.example.com")) { - print "skip"; -} -``` diff --git a/api-examples/function.HH.Asio.vmkw.md b/api-examples/function.HH.Asio.vmkw.md deleted file mode 100644 index a8c65e28a..000000000 --- a/api-examples/function.HH.Asio.vmkw.md +++ /dev/null @@ -1,30 +0,0 @@ -```basic-usage.hack -<<__EntryPoint>> -async function basic_usage_main(): Awaitable { - // Map a vector of numbers to their value divided by their index - // throwing on division by zero. - $quotients = await \HH\Asio\vmkw( - Vector {1, 2, 6, 12}, - - async ($idx, $val) ==> { - if ($idx != 0) { - return $val / $idx; - } else { - throw new \Exception( - "Division by zero: ".\print_r($val, true).'/'.\print_r($idx, true), - ); - } - }, - ); - - foreach ($quotients as $result) { - if ($result->isSucceeded()) { - echo "Success: "; - \var_dump($result->getResult()); - } else { - echo "Failed: "; - \var_dump($result->getException()->getMessage()); - } - } -} -``` diff --git a/api-examples/function.HH.Asio.vmw.md b/api-examples/function.HH.Asio.vmw.md deleted file mode 100644 index e4f010108..000000000 --- a/api-examples/function.HH.Asio.vmw.md +++ /dev/null @@ -1,28 +0,0 @@ -```basic-usage.hack -<<__EntryPoint>> -async function basic_usage_main(): Awaitable { - // Map a vector of numbers to half integer half - // throwing if they can't be divided evenly - $halves = await \HH\Asio\vmw( - Vector {1, 2, 3, 4}, - - async ($val) ==> { - if ($val % 2) { - throw new \Exception("$val is an odd number"); - } else { - return $val / 2; - } - }, - ); - - foreach ($halves as $result) { - if ($result->isSucceeded()) { - echo "Success: "; - \var_dump($result->getResult()); - } else { - echo "Failed: "; - \var_dump($result->getException()->getMessage()); - } - } -} -``` diff --git a/api-examples/function.HH.Asio.vw.md b/api-examples/function.HH.Asio.vw.md deleted file mode 100644 index 9b2bcd2a5..000000000 --- a/api-examples/function.HH.Asio.vw.md +++ /dev/null @@ -1,31 +0,0 @@ -```basic-usage.hack -async function one(): Awaitable { - return 1; -} - -<<__EntryPoint>> -async function basic_usage_main(): Awaitable { - $mcr = \MCRouter::createSimple(ImmVector {}); - - $handles = \HH\Asio\vw(Vector { - // This will throw an exception, since there's no servers to speak to - $mcr->get("no-such-key"), - - // While this will obviously succeed - one(), - }); - - $results = await $handles; - foreach ($results as $result) { - if ($result->isSucceeded()) { - echo "Success: "; - \var_dump($result->getResult()); - } else { - echo "Failed: "; - \var_dump($result->getException()->getMessage()); - } - } -} -```.skipif -\Hack\UserDocumentation\API\Examples\MCRouter\skipif(); -``` diff --git a/api-examples/function.HH.Lib.C.any.md b/api-examples/function.HH.Lib.C.any.md deleted file mode 100644 index 338c7a063..000000000 --- a/api-examples/function.HH.Lib.C.any.md +++ /dev/null @@ -1,23 +0,0 @@ -```basic-usage.hack -$strings = vec["a", "b", "c", "d"]; -$predicate_result_1 = C\any($strings, $x ==> $x == "a"); -echo "First predicate: $predicate_result_1\n"; -//Output: First predicate: true - -$predicate_result_2 = C\any($strings, $x ==> $x == "z"); -echo "Second predicate: $predicate_result_2\n"; -//Output: Second predicate: false - -$predicate_result_3 = C\any($strings); -echo "Third predicate: $predicate_result_3\n"; -//Output: Third predicate: true - -$empty_strings = vec[]; -$predicate_result_4 = C\any($empty_strings, $x ==> $x == "a"); -echo "Fourth predicate: $predicate_result_4\n"; -//Output: Fourth predicate: false - -$predicate_result_5 = C\any($empty_strings); -echo "Fifth predicate: $predicate_result_5\n"; -//Output: Fifth predicate: false -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.C.contains.md b/api-examples/function.HH.Lib.C.contains.md deleted file mode 100644 index bad824955..000000000 --- a/api-examples/function.HH.Lib.C.contains.md +++ /dev/null @@ -1,15 +0,0 @@ -```basic-usage.hack -$strings = vec["a", "b", "c", "d"]; -$contains_result_1 = C\contains($strings, "a"); -echo "First contains result: $contains_result_1\n"; -//Output: First contains result: true - -$contains_result_2 = C\contains($strings, "z"); -echo "Second contains result: $contains_result_2\n"; -//Output: Second contains result: false - -$empty_strings = vec[]; -$contains_result_3 = C\contains($empty_strings, "a"); -echo "Third contains result: $contains_result_3\n"; -//Output: Third contains result: false -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.C.contains_key.md b/api-examples/function.HH.Lib.C.contains_key.md deleted file mode 100644 index e9b19e982..000000000 --- a/api-examples/function.HH.Lib.C.contains_key.md +++ /dev/null @@ -1,14 +0,0 @@ -```basic-usage.hack -$dict = dict["key_1" => "a", "key_2" => "b"]; -$contains_key_result_1 = C\contains_key($dict, "key_1"); -echo "First contains key result: $contains_key_result_1\n"; -//Output: First contains key result: true - -$contains_key_result_2 = C\contains_key($dict, "key_3"); -echo "Second contains key result: $contains_key_result_2\n"; -//Output: Second contains key result: false - -$contains_key_result_3 = C\contains_key($dict, ""); -echo "Third contains key result: $contains_key_result_3\n"; -//Output: Third contains key result: false -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.C.count.md b/api-examples/function.HH.Lib.C.count.md deleted file mode 100644 index 1961b331b..000000000 --- a/api-examples/function.HH.Lib.C.count.md +++ /dev/null @@ -1,11 +0,0 @@ -```basic-usage.hack -$strings = vec["a", "b", "c", "d", "e"]; -$count_result_1 = C\count($strings); -echo "First count result: $count_result_1\n"; -//Output: First count result: 5 - -$empty_strings = vec[]; -$count_result_2 = C\count($empty_strings); -echo "Second count result: $count_result_2\n"; -//Output: Second count result: 0 -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.C.every.md b/api-examples/function.HH.Lib.C.every.md deleted file mode 100644 index b810e60cd..000000000 --- a/api-examples/function.HH.Lib.C.every.md +++ /dev/null @@ -1,19 +0,0 @@ -```basic-usage.hack -$strings = vec["a", "b", "c", "d"]; -$predicate_result_1 = C\every($strings, $x ==> $x != "z"); -echo "First predicate: $predicate_result_1\n"; -//Output: First predicate: true -$predicate_result_2 = C\every($strings, $x ==> $x == "a"); -echo "Second predicate: $predicate_result_2\n"; -//Output: Second predicate: false -$predicate_result_3 = C\every($strings); -echo "Third predicate: $predicate_result_3\n"; -//Output: Third predicate: true -$empty_strings = vec[]; -$predicate_result_4 = C\every($empty_strings, $x ==> $x == "a"); -echo "Fourth predicate: $predicate_result_4\n"; -//Output: Fourth predicate: true -$predicate_result_5 = C\every($empty_strings); -echo "Fifth predicate: $predicate_result_5\n"; -//Output: Fifth predicate: true -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.C.find.md b/api-examples/function.HH.Lib.C.find.md deleted file mode 100644 index f69ed2691..000000000 --- a/api-examples/function.HH.Lib.C.find.md +++ /dev/null @@ -1,15 +0,0 @@ -```basic-usage.hack -$strings = vec["a", "b", "c", "d"]; -$predicate_string_1 = C\find($strings, $x ==> $x == "b"); -echo "First predicate: $predicate_string_1\n"; -//Output: First predicate: b - -$predicate_string_2 = C\find($strings, $x ==> $x == "z"); -$predicate_string_2_as_string = $predicate_string_2 ?? "null"; -echo "Second predicate: $predicate_string_2_as_string\n"; -//Output: Second predicate: null - -$repeat_strings = vec["a1", "b", "a2", "d"]; -$predicate_string_3 = C\find($repeat_strings, $x ==> ($x == "a1" || $x == "a2")); -echo "Repeat_predicate: $predicate_string_3\n"; -//Output: Repeat_predicate: a1 \ No newline at end of file diff --git a/api-examples/function.HH.Lib.C.find_key.md b/api-examples/function.HH.Lib.C.find_key.md deleted file mode 100644 index dbfc6c7e7..000000000 --- a/api-examples/function.HH.Lib.C.find_key.md +++ /dev/null @@ -1,16 +0,0 @@ -```basic-usage.hack -$dict = dict["key_1" => "a", "key_2" => "b", "key_3" => "c"]; -$predicate_result_1 = C\find_key($dict, $x ==> $x == "a"); -echo "First predicate: $predicate_result_1\n"; -//Output: First predicate: key_1 - -$predicate_result_2 = C\find_key($dict, $x ==> $x == "z"); -$predicate_result_2_as_string = $predicate_result_2 ?? "null"; -echo "Second predicate: $predicate_result_2_as_string\n"; -//Output: Second predicate: null - -$repeat_dict = dict["key_1" => "a", "key_2" => "b", "key_3" => "c", "key_4" => "a"]; -$predicate_result_3 = C\find_key($dict, $x ==> $x == "a"); -echo "Repeat_predicate: $predicate_result_3\n"; -//Output: Repeat_predicate: key_1 -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.C.findx.md b/api-examples/function.HH.Lib.C.findx.md deleted file mode 100644 index 4bf885af9..000000000 --- a/api-examples/function.HH.Lib.C.findx.md +++ /dev/null @@ -1,10 +0,0 @@ -```basic-usage.hack -$strings = vec["a", "b", "c", "d"]; -$predicate_result_1 = C\findx($strings, $x ==> $x == "a"); -echo "First predicate: $predicate_result_1\n"; -//Output: First predicate: a - -$predicate_result_2 = C\findx($strings, $x ==> $x == "z"); -//Output: Hit a php exception : exception 'InvariantViolationException' -//with message 'HH\Lib\C\findx: Couldn't find target value.' -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.C.first.md b/api-examples/function.HH.Lib.C.first.md deleted file mode 100644 index 1b7756f59..000000000 --- a/api-examples/function.HH.Lib.C.first.md +++ /dev/null @@ -1,12 +0,0 @@ -```basie-usage.hack -$strings = vec["a", "b", "c"]; -$first_string = C\first($strings); -echo "First string in traversable: $first_string \n"; -//Output: First string in traversable: a - -$empty_traversable = vec[]; -$first_element = C\first($empty_traversable); -$first_element_as_string = $first_element ?? "null"; -echo "First element in empty traversable: $first_element_as_string"; -//Output: First element in empty traversable: null -``` diff --git a/api-examples/function.HH.Lib.C.first_key.md b/api-examples/function.HH.Lib.C.first_key.md deleted file mode 100644 index 1757d769d..000000000 --- a/api-examples/function.HH.Lib.C.first_key.md +++ /dev/null @@ -1,12 +0,0 @@ -```basic-usage.hack -$dict = dict["key_1" => "a", "key_2" => "b", "key_3" => "c"]; -$first_key_result_1 = C\first_key($dict); -echo "First first key result: $first_key_result_1\n"; -//Output: First first key result: key_1 - -$empty_dict = dict[]; -$first_key_result_2 = C\first_key($empty_dict); -$first_key_result_2_as_string = $first_key_result_2 ?? "null"; -echo "Second first key result: $first_key_result_2_as_string\n"; -//Output: Second first key result: null -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.C.first_keyx.md b/api-examples/function.HH.Lib.C.first_keyx.md deleted file mode 100644 index 715cc594c..000000000 --- a/api-examples/function.HH.Lib.C.first_keyx.md +++ /dev/null @@ -1,11 +0,0 @@ -```basic-usage.hack -$dict = dict["key_1" => "a", "key_2" => "b", "key_3" => "c"]; -$first_keyx_result_1 = C\first_keyx($dict); -echo "First first keyx result: $first_keyx_result_1\n"; -//Output: First first keyx result: key_1 - -$empty_dict = dict[]; -$first_keyx_result_2 = C\first_keyx($empty_dict); -//Output: Hit a php exception : exception 'InvariantViolationException' with message -//'HH\Lib\C\first_keyx: Expected at least one element.' -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.C.firstx.md b/api-examples/function.HH.Lib.C.firstx.md deleted file mode 100644 index be1402917..000000000 --- a/api-examples/function.HH.Lib.C.firstx.md +++ /dev/null @@ -1,11 +0,0 @@ -```basie-usage.hack -$strings = vec["a", "b", "c"]; -$first_string = C\firstx($strings); -echo "First string in traversable: $first_string \n"; -//Output: First string in traversable: a - -$empty_traversable = vec[]; -$first_element = C\firstx($empty_traversable); -//Output: Hit a php exception : exception 'InvariantViolationException' with message -//'HH\Lib\C\firstx: Expected at least one element.' -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.C.is_empty.md b/api-examples/function.HH.Lib.C.is_empty.md deleted file mode 100644 index 5739a0093..000000000 --- a/api-examples/function.HH.Lib.C.is_empty.md +++ /dev/null @@ -1,11 +0,0 @@ -```basie-usage.hack -$strings = vec["a", "b", "c", "d", "e"]; -$is_empty_result_1 = C\is_empty($strings); -echo "First is_empty result: $is_empty_result_1\n"; -//Output: First is_empty result: false - -$empty_strings = vec[]; -$is_empty_result_2 = C\is_empty($empty_strings); -echo "Second is_empty result: $is_empty_result_2\n"; -//Output: Second is_empty result: true -``` diff --git a/api-examples/function.HH.Lib.C.is_sorted.md b/api-examples/function.HH.Lib.C.is_sorted.md deleted file mode 100644 index f4f97cc23..000000000 --- a/api-examples/function.HH.Lib.C.is_sorted.md +++ /dev/null @@ -1,16 +0,0 @@ -```basie-usage.hack -$strings = vec["a", "b", "c", "d", "e"]; -$is_sorted_result_1 = C\is_sorted($strings); -echo "First is_sorted result: $is_sorted_result_1\n"; -//Output: First is_sorted result: true - -$second_strings = vec["a", "b", "a", "d", "e"]; -$is_sorted_result_2 = C\is_sorted($second_strings); -echo "Second is_sorted result: $is_sorted_result_2\n"; -//Output: Second is_sorted result: false - -$empty_strings = vec[]; -$is_sorted_result_3 = C\is_sorted($empty_strings); -echo "Third is_sorted result: $is_sorted_result_3\n"; -//Output: Third is_sorted result: true -``` diff --git a/api-examples/function.HH.Lib.C.is_sorted_by.md b/api-examples/function.HH.Lib.C.is_sorted_by.md deleted file mode 100644 index 0f3c3da9b..000000000 --- a/api-examples/function.HH.Lib.C.is_sorted_by.md +++ /dev/null @@ -1,10 +0,0 @@ -```basie-usage.hack -$strings = vec[1,2,3,4,5]; -$is_sorted_by_result_1 = C\is_sorted_by($strings, $x ==> $x); -echo "First is_sorted_by result: $is_sorted_by_result_1\n"; -//Output: First is_sorted_by result: true - -$is_sorted_by_result_2 = C\is_sorted_by($strings, $x ==> -$x); -echo "Second is_sorted_by result: $is_sorted_by_result_2\n"; -//Output: Second is_sorted_by result: false -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.C.last.md b/api-examples/function.HH.Lib.C.last.md deleted file mode 100644 index 35c7080be..000000000 --- a/api-examples/function.HH.Lib.C.last.md +++ /dev/null @@ -1,12 +0,0 @@ -```basic-usage.hack -$strings = vec["a", "b", "c"]; -$last_string = C\last($strings); -echo "Last string in traversable: $last_string \n"; -//Output: Last string in traversable: c - -$empty_traversable = vec[]; -$last_element = C\last($empty_traversable); -$last_element_as_string = $last_element ?? "null"; -echo "Last element in empty traversable: $last_element_as_string"; -//Output: Last element in empty traversable: null -``` diff --git a/api-examples/function.HH.Lib.C.last_key.md b/api-examples/function.HH.Lib.C.last_key.md deleted file mode 100644 index af899f9f3..000000000 --- a/api-examples/function.HH.Lib.C.last_key.md +++ /dev/null @@ -1,12 +0,0 @@ -```basic-usage.hack -$dict = dict["key_1" => "a", "key_2" => "b", "key_3" => "c"]; -$last_key_result_1 = C\last_key($dict); -echo "First last key result: $last_key_result_1\n"; -//Output: First last key result: key_3 - -$empty_dict = dict[]; -$last_key_result_2 = C\last_key($empty_dict); -$last_key_result_2_as_string = $last_key_result_2 ?? "null"; -echo "Second last key result: $last_key_result_2_as_string\n"; -//Output: Second last key result: null -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.C.last_keyx.md b/api-examples/function.HH.Lib.C.last_keyx.md deleted file mode 100644 index a5cfae6f6..000000000 --- a/api-examples/function.HH.Lib.C.last_keyx.md +++ /dev/null @@ -1,11 +0,0 @@ -```basic-usage.hack -$dict = dict["key_1" => "a", "key_2" => "b", "key_3" => "c"]; -$last_keyx_result_1 = C\last_keyx($dict); -echo "First last keyx result: $last_keyx_result_1\n"; -//Output: First last keyx result: key_3 - -$empty_dict = dict[]; -$last_keyx_result_2 = C\last_keyx($empty_dict); -//Output: Hit a php exception : exception 'InvariantViolationException' with message -//'HH\Lib\C\last_keyx: Expected at least one element.' -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.C.lastx.md b/api-examples/function.HH.Lib.C.lastx.md deleted file mode 100644 index 515f9dc83..000000000 --- a/api-examples/function.HH.Lib.C.lastx.md +++ /dev/null @@ -1,11 +0,0 @@ -```basic-usage.hack -$strings = vec["a", "b", "c"]; -$last_string = C\lastx($strings); -echo "Last string in traversable: $last_string \n"; -//Output: Last string in traversable: c - -$empty_traversable = vec[]; -$last_element = C\lastx($empty_traversable); -//Output: Hit a php exception : exception 'InvariantViolationException' with message -//'HH\Lib\C\lastx: Expected at least one element.' -``` diff --git a/api-examples/function.HH.Lib.C.nfirst.md b/api-examples/function.HH.Lib.C.nfirst.md deleted file mode 100644 index decd1f943..000000000 --- a/api-examples/function.HH.Lib.C.nfirst.md +++ /dev/null @@ -1,12 +0,0 @@ -```basie-usage.hack -$strings = vec["a", "b", "c"]; -$first_string = C\nfirst($strings); -echo "First string in traversable: $first_string \n"; -//Output: First string in traversable: a - -$empty_traversable = vec[]; -$first_element = C\nfirst($empty_traversable); -$first_element_as_string = $first_element ?? "null"; -echo "First element in empty traversable: $first_element_as_string"; -//Output: First element in empty traversable: null -``` diff --git a/api-examples/function.HH.Lib.C.onlyx.md b/api-examples/function.HH.Lib.C.onlyx.md deleted file mode 100644 index 33a50e70a..000000000 --- a/api-examples/function.HH.Lib.C.onlyx.md +++ /dev/null @@ -1,16 +0,0 @@ -```basic-usage.hack -$string = vec["a"]; -$onlyx_result_1 = C\onlyx($string); -echo "First onlyx result: $onlyx_result_1\n"; -//Output: First onlyx result: a - -$strings = vec["a", "b"]; -$onlyx_result_2 = C\onlyx($strings); -//Output: Hit a php exception : exception 'InvariantViolationException' with message -//'Expected exactly one element but got 2.' - -$empty_strings = vec[]; -$onlyx_result_3 = C\onlyx($empty_strings); -//Output: Hit a php exception : exception 'InvariantViolationException' with message -//'Expected non-empty Traversable.' -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.C.pop_back.md b/api-examples/function.HH.Lib.C.pop_back.md deleted file mode 100644 index 37b40a587..000000000 --- a/api-examples/function.HH.Lib.C.pop_back.md +++ /dev/null @@ -1,12 +0,0 @@ -```basic-usage.hack -$strings = vec["a", "b"]; -$pop_back_result_1 = C\pop_back(inout $strings); -echo "First pop_back result: $pop_back_result_1\n"; -//Output: First pop_back result: b - -$empty_strings = vec[]; -$pop_back_result_2 = C\pop_back(inout $empty_strings); -$pop_back_result_2_as_string = $pop_back_result_2 ?? "null"; -echo "Second pop_back result: $pop_back_result_2_as_string\n"; -//Output: Second pop_back result: null -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.C.pop_backx.md b/api-examples/function.HH.Lib.C.pop_backx.md deleted file mode 100644 index f2e8f0495..000000000 --- a/api-examples/function.HH.Lib.C.pop_backx.md +++ /dev/null @@ -1,11 +0,0 @@ -```basic-usage.hack -$strings = vec["a", "b"]; -$pop_backx_result_1 = C\pop_backx(inout $strings); -echo "First pop_backx result: $pop_backx_result_1\n"; -//Output: First pop_backx result: b - -$empty_strings = vec[]; -$pop_backx_result_2 = C\pop_backx(inout $empty_strings); -//Output: Hit a php exception : exception 'InvariantViolationException' with message -//'HH\Lib\C\pop_backx: Expected at least one element' -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.C.pop_front.md b/api-examples/function.HH.Lib.C.pop_front.md deleted file mode 100644 index 210dead47..000000000 --- a/api-examples/function.HH.Lib.C.pop_front.md +++ /dev/null @@ -1,12 +0,0 @@ -```basic-usage.hack -$strings = vec["a", "b"]; -$pop_front_result_1 = C\pop_front(inout $strings); -echo "First pop_front result: $pop_front_result_1\n"; -//Output: First pop_front result: a - -$empty_strings = vec[]; -$pop_front_result_2 = C\pop_front(inout $empty_strings); -$pop_front_result_2_as_string = $pop_front_result_2 ?? "null"; -echo "Second pop_front result: $pop_front_result_2_as_string\n"; -//Output: Second pop_front result: null -``` diff --git a/api-examples/function.HH.Lib.C.pop_frontx.md b/api-examples/function.HH.Lib.C.pop_frontx.md deleted file mode 100644 index 77dfebfdb..000000000 --- a/api-examples/function.HH.Lib.C.pop_frontx.md +++ /dev/null @@ -1,11 +0,0 @@ -```basic-usage.hack -$strings = vec["a", "b"]; -$pop_frontx_result_1 = C\pop_frontx(inout $strings); -echo "First pop_frontx result: $pop_frontx_result_1\n"; -//Output: First pop_frontx result: a - -$empty_strings = vec[]; -$pop_frontx_result_2 = C\pop_frontx(inout $empty_strings); -//Output: Hit a php exception : exception 'InvariantViolationException' with message -//'HH\Lib\C\pop_frontx: Expected at least one element' -``` diff --git a/api-examples/function.HH.Lib.C.reduce.md b/api-examples/function.HH.Lib.C.reduce.md deleted file mode 100644 index 7cbaa09b3..000000000 --- a/api-examples/function.HH.Lib.C.reduce.md +++ /dev/null @@ -1,6 +0,0 @@ -```basic-usage.hack -$values = vec[1,2,3,4,5]; -$reduce_result = C\reduce($values, ($total, $value) ==> $total + $value, 0); -echo "Reduce result: $reduce_result\n"; -//Output: Reduce result: 15 -``` diff --git a/api-examples/function.HH.Lib.C.reduce_with_key.md b/api-examples/function.HH.Lib.C.reduce_with_key.md deleted file mode 100644 index d59a069f3..000000000 --- a/api-examples/function.HH.Lib.C.reduce_with_key.md +++ /dev/null @@ -1,7 +0,0 @@ -```basic-usage.hack -$dict = dict["a" => 1, "b" => 2, "c" => 3]; -$list = vec["a","b"]; -$reduce_with_key_result = C\reduce_with_key($dict, ($a, $k, $v) ==> $a + (C\contains($list, $k) ? 0 : $v), 0); -echo "Reduce with key result: $reduce_with_key_result\n"; -//Output: Reduce with key result: 3 -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Dict.associate.md b/api-examples/function.HH.Lib.Dict.associate.md deleted file mode 100644 index 8f1b355ee..000000000 --- a/api-examples/function.HH.Lib.Dict.associate.md +++ /dev/null @@ -1,8 +0,0 @@ -```basic-usage.hack -// NOTE: $keys, $values must be the same length -$keys = vec[1,2,3,4,5]; -$values = vec[1,4,9,16,25]; -$dict = Dict\associate($keys, $values); -\print_r($dict); -//Output: dict[1 => 1, 2 => 4, 3 => 9, 4 => 16, 5 => 25] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Dict.chunk.md b/api-examples/function.HH.Lib.Dict.chunk.md deleted file mode 100644 index f03a6ac82..000000000 --- a/api-examples/function.HH.Lib.Dict.chunk.md +++ /dev/null @@ -1,9 +0,0 @@ -```basic-usage.hack -$result = Dict\chunk(dict[1 => 2, 2 => 4], 1); -print_r($result); -// result: vec[dict[1=>2], dict[2=>4]] - -$result = Dict\chunk(dict[], 1); -print_r($result); -//result: vec[] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Dict.count_values.md b/api-examples/function.HH.Lib.Dict.count_values.md deleted file mode 100644 index add22a5ea..000000000 --- a/api-examples/function.HH.Lib.Dict.count_values.md +++ /dev/null @@ -1,9 +0,0 @@ -```basic-usage.hack -$result = Dict\count_values(vec[1,2,2,3,3,3]); -print_r($result); -//result: dict[1=>1, 2=>2, 3=>3] - -$result = Dict\count_values(vec[0,0,0,0,0]); -print_r($result); -//result: dict[0=>5] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Dict.drop.md b/api-examples/function.HH.Lib.Dict.drop.md deleted file mode 100644 index ff9cf4dba..000000000 --- a/api-examples/function.HH.Lib.Dict.drop.md +++ /dev/null @@ -1,9 +0,0 @@ -```basic-usage.hack -$result = Dict\drop(dict[1 => 2, 2 => 4, 3 => 9], 1); -print_r($result); -//result: dict[2=>4, 3=>9] - -$result = Dict\drop(dict[], 1); -print_r($result); -//result: dict[] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Dict.equal.md b/api-examples/function.HH.Lib.Dict.equal.md deleted file mode 100644 index 0e5e2c39a..000000000 --- a/api-examples/function.HH.Lib.Dict.equal.md +++ /dev/null @@ -1,16 +0,0 @@ -```basic-usage.hack -$result = Dict\equal(dict[], dict[]); -print_r($result); -//result: true - -$result = Dict\equal(dict[1 => 2, 2 => 4], dict[1 => 2, 2 => 4]); -print_r($result); -//result: true - -$result = Dict\equal(dict[1 => 2, 2 => 4], dict[1 => 2, 300 => 4]); -print($result); -//result: false - -$result = Dict\equal(dict[1 => 2, 2 => 4], dict[1 => 2, 2 => 7000]); -//result: false -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Dict.fill_keys.md b/api-examples/function.HH.Lib.Dict.fill_keys.md deleted file mode 100644 index 4007798cd..000000000 --- a/api-examples/function.HH.Lib.Dict.fill_keys.md +++ /dev/null @@ -1,6 +0,0 @@ -```basic-usage.hack -$keys = vec['k1', 'k2', 'k3', 'k4']; -$value = 5; -$dict = Dict\fill_keys($keys, $value); -\print_r($dict); -``` diff --git a/api-examples/function.HH.Lib.Dict.from_keys.md b/api-examples/function.HH.Lib.Dict.from_keys.md deleted file mode 100644 index 34c4174ab..000000000 --- a/api-examples/function.HH.Lib.Dict.from_keys.md +++ /dev/null @@ -1,9 +0,0 @@ -```basic-usage.hack -$keys = vec[1, 2, 3, 4]; -$dict = Dict\from_keys($keys, $x ==> $x + 1); -\print_r($dict); - -$values = vec[1, 2, 3, 4]; -$dict = Dict\from_keys($keys, $x ==> 5); -\print_r($dict); -``` diff --git a/api-examples/function.HH.Lib.Dict.from_values.md b/api-examples/function.HH.Lib.Dict.from_values.md deleted file mode 100644 index ad8c4dbeb..000000000 --- a/api-examples/function.HH.Lib.Dict.from_values.md +++ /dev/null @@ -1,15 +0,0 @@ -```hack.basic-usage.hack -$original_dict_1 = dict[1 => 1, 2 => 2, 3 => 3]; -$from_values_dict_1 = Dict\from_values($original_dict_1, $x ==> $x + 1); -echo "Resulting from values dict 1: \n"; -\print_r($from_values_dict_1); -//Output: Resulting from values dict 1: -//dict[2 => 1, 3 => 2, 4 => 3] - -$original_dict_2 = dict[1 => 1, 2 => 2, 3 => 3]; -$from_values_repeat_value_dict_2 = Dict\from_values($original_dict_2, $x ==> $x * 0); -echo "Resulting from repeat values dict 2: \n"; -\print_r($from_values_repeat_value_dict_2); -//Output: Resulting from repeat values dict 2: -//dict[0 => 3] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Dict.group_by.md b/api-examples/function.HH.Lib.Dict.group_by.md deleted file mode 100644 index cd9ec92e8..000000000 --- a/api-examples/function.HH.Lib.Dict.group_by.md +++ /dev/null @@ -1,7 +0,0 @@ -Group numbers by their parity (separate even and odd numbers): - -```basic-usage.hack -$numbers = vec[1, 1, 2, 3, 5, 8, 14]; -$groups = Dict\group_by($numbers, $value ==> $value % 2); -\print_r($groups); -``` diff --git a/api-examples/function.HH.Lib.Dict.map.md b/api-examples/function.HH.Lib.Dict.map.md deleted file mode 100644 index 929b8e694..000000000 --- a/api-examples/function.HH.Lib.Dict.map.md +++ /dev/null @@ -1,15 +0,0 @@ -```basic-usage.hack -$original_dict_1 = dict["key_1" => 1, "key_2" => 2, "key_3" => 3]; -$dict_of_lambda_multiplied_values = Dict\map($original_dict_1, $val ==> $val * 2); -echo "Resulting lambda multiplied dict: \n"; -\print_r($dict_of_lambda_multiplied_values); -//Output: Resulting lambda multiplied dict: -//dict["key_1" => 2, "key_2" => 4, "key_3" => 6] - -$original_dict_2 = dict["key_1" => "a", "key_2" => "b", "key_3" => "c"]; -$dict_of_function_uppercased_values = Dict\map($original_dict_2, Str\uppercase<>); -echo "Resulting function uppercased dict: \n"; -\print_r($dict_of_function_uppercased_values); -//Output: Resulting function uppercased dict: -//dict["key_1" => "A", "key_2" => "B", "key_3" => "C"] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Dict.merge.md b/api-examples/function.HH.Lib.Dict.merge.md deleted file mode 100644 index a09448530..000000000 --- a/api-examples/function.HH.Lib.Dict.merge.md +++ /dev/null @@ -1,9 +0,0 @@ -```basic-usage.hack -$result = Dict\merge(dict[1 => 2, 2 => 4], dict[7 => 2, 100 => 4]); -print_r($result); -//result: dict[1=>2, 2=>4, 7=>2, 100=>4] - -$result = Dict\merge(dict[1 => 2, 2 => 4], dict[7 => 2, 2 => 100]); -print_r($result); -//result: dict[1=>2, 2=>100, 7=>2] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Dict.select_keys.md b/api-examples/function.HH.Lib.Dict.select_keys.md deleted file mode 100644 index a0b2c8983..000000000 --- a/api-examples/function.HH.Lib.Dict.select_keys.md +++ /dev/null @@ -1,14 +0,0 @@ -```basic-usage.hack -$dict_with_all_keys = dict["key1" => "value 1", "key2" => "value 2", "key3" => "value 3"]; - -$present_required_keys = vec["key1"]; -$keys_not_present_in_dict = vec["incorrect_keys"]; - -$dict_with_present_keys = Dict\select_keys($dict_with_all_keys, $present_required_keys); -echo"Result when keys present in dict: \n"; -\print_r($dict_with_present_keys); - -$dict_with_keys_not_present = Dict\select_keys($dict_with_all_keys, $keys_not_present_in_dict); -echo"Result when keys not present in dict: \n"; -\print_r($dict_with_keys_not_present); -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Dict.sort.md b/api-examples/function.HH.Lib.Dict.sort.md deleted file mode 100644 index 35299643a..000000000 --- a/api-examples/function.HH.Lib.Dict.sort.md +++ /dev/null @@ -1,9 +0,0 @@ -```basic-usage.hack -$result = Dict\sort(dict[1 => 2000, 2 => 1000, 3 => 9]); -print_r($result); -//result: dict[3=>9, 2=>1000, 1=>2000] - -$result = Dict\sort(dict[]); -print_r($result); -//result: dict[] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Dict.take.md b/api-examples/function.HH.Lib.Dict.take.md deleted file mode 100644 index cd3db6fdb..000000000 --- a/api-examples/function.HH.Lib.Dict.take.md +++ /dev/null @@ -1,9 +0,0 @@ -```basic-usage.hack -$result = Dict\take(dict[1 => 2, 2 => 4, 3 => 9], 1); -print_r($result); -//dict[1=>2] - -$result = Dict\take(dict[], 1); -print_r($result); -//result: dict[] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Keyset.chunk.md b/api-examples/function.HH.Lib.Keyset.chunk.md deleted file mode 100644 index deb1d0094..000000000 --- a/api-examples/function.HH.Lib.Keyset.chunk.md +++ /dev/null @@ -1,9 +0,0 @@ -```basic-usage.hack -$result = Keyset\chunk(vec[1,2,3,4,5,6],3); -print_r($result); -//result: [keyset[1,2,3], keyset[4,5,6]] - -$result = Keyset\chunk(vec[1,2,2,3,4,5],3); -print_r($result); -//result: [keyset[1,2], keyset[3,4,5]] -``` diff --git a/api-examples/function.HH.Lib.Keyset.diff.md b/api-examples/function.HH.Lib.Keyset.diff.md deleted file mode 100644 index 8949a53c2..000000000 --- a/api-examples/function.HH.Lib.Keyset.diff.md +++ /dev/null @@ -1,9 +0,0 @@ -```basic-usage.hack -$result = Keyset\diff(keyset[1,2,3,4,5,6], vec[1,2,3]); -print_r($result); -//result: keyset[4,5,6] - -$result = Keyset\diff(vec[1,2,3,4,5,6], keyset[]); -print_r($result); -//result: keyset[1,2,3,4,5,6] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Keyset.drop.md b/api-examples/function.HH.Lib.Keyset.drop.md deleted file mode 100644 index 07ba82e32..000000000 --- a/api-examples/function.HH.Lib.Keyset.drop.md +++ /dev/null @@ -1,9 +0,0 @@ -```basic-usage.hack -$result = Keyset\drop(keyset[1,2,3,4,5,6], 3); -print_r($result); -//result: keyset[4,5,6] - -$result = Keyset\drop(vec[1,2,3,4,5,6], 0); -print_r($result); -//result: keyset[1,2,3,4,5,6] -``` diff --git a/api-examples/function.HH.Lib.Keyset.equal.md b/api-examples/function.HH.Lib.Keyset.equal.md deleted file mode 100644 index 8a772c4b4..000000000 --- a/api-examples/function.HH.Lib.Keyset.equal.md +++ /dev/null @@ -1,13 +0,0 @@ -```basic-usage.hack -$result = Keyset\equal(keyset[1,2,3,4], keyset[1,2,3,4]); -print_r($result); -//result: true - -$result = Keyset\equal(keyset[1,2,3,4], keyset[4,2,3,1]); -print_r($result); -//result: true - -$result = Keyset\equal(keyset[1,2,3,4], keyset[1,2,3,4,5]); -print_r($result); -//result: false -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Keyset.filter.md b/api-examples/function.HH.Lib.Keyset.filter.md deleted file mode 100644 index 502a0de4e..000000000 --- a/api-examples/function.HH.Lib.Keyset.filter.md +++ /dev/null @@ -1,13 +0,0 @@ -```basic-usage.hack -$result = Keyset\filter(keyset[1,2,3,4], $val ==> $val%2==0); -print_r($result); -//result: keyset[2,4] - -$result = Keyset\filter(keyset[1,2,3,4], $val ==> $val==0); -print_r($result); -//result: keyset[] - -$result = Keyset\filter(keyset[1,2,3,4], $val ==> $val == $val); -print_r($result); -//result: keyset[1,2,3,4] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Keyset.filter_nulls.md b/api-examples/function.HH.Lib.Keyset.filter_nulls.md deleted file mode 100644 index 4431ca7c2..000000000 --- a/api-examples/function.HH.Lib.Keyset.filter_nulls.md +++ /dev/null @@ -1,13 +0,0 @@ -```basic-usage.hack -$result = Keyset\filter_nulls(vec[1,2,3,4,null, null]); -print_r($result); -//result: keyset[1,2,3,4] - -$result = Keyset\filter_nulls(vec[1,2,3,4]); -print_r($result); -//result: keyset[1,2,3,4] - -$result = Keyset\filter_nulls(vec[]); -print_r($result); -//result: keyset[] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Keyset.filter_with_key.md b/api-examples/function.HH.Lib.Keyset.filter_with_key.md deleted file mode 100644 index 37c89450c..000000000 --- a/api-examples/function.HH.Lib.Keyset.filter_with_key.md +++ /dev/null @@ -1,13 +0,0 @@ -```basic-usage.hack -$result = Keyset\filter_with_key(dict[1 => 2, 2 => 4, 3 => 5], ($key, $val) ==> $val%2==0); -print_r($result); -//result: keyset[2,4] - -$result = Keyset\filter_with_key(dict[1 => 2, 2 => 4], ($key, $val) ==> $val==0); -print_r($result); -//result: keyset[] - -$result = Keyset\filter_with_key(dict[1 => 2, 2 => 4, 3 => 5], ($key, $val) ==> $val == $val); -print_r($result); -//result: keyset[2,4,5] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Keyset.flatten.md b/api-examples/function.HH.Lib.Keyset.flatten.md deleted file mode 100644 index dc1c61183..000000000 --- a/api-examples/function.HH.Lib.Keyset.flatten.md +++ /dev/null @@ -1,16 +0,0 @@ -```basic-usage.hack -$example_set = vec[keyset[1,2,3,4,5],keyset[98, 99]]; -$result = Keyset\flatten($example_set); -print_r($result); -//result: keyset[1,2,3,4,5,98,99] - -$example_set = vec[vec[1,2,3,4,5,5,5,5]]; -$result = Keyset\flatten($example_set); -print_r($result); -//result: keyset[1,2,3,4,5] - -$example_set = vec[]; -$result = Keyset\flatten($example_set); -print_r($result); -//result: keyset[] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Keyset.intersect.md b/api-examples/function.HH.Lib.Keyset.intersect.md deleted file mode 100644 index 33c080c5a..000000000 --- a/api-examples/function.HH.Lib.Keyset.intersect.md +++ /dev/null @@ -1,13 +0,0 @@ -```basic-usage.hack -$example_set1 = keyset[1,2,3,4,5]; -$example_set2 = keyset[1,3]; - -$result = Keyset\intersect($example_set1, $example_set2); -print_r($result); -//result: keyset[1,3] - -$example_vec3 = keyset[6,7]; -$result = Keyset\intersect($example_set1, $example_vec3); -print_r($result); -//result: keyset[] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Keyset.keys.md b/api-examples/function.HH.Lib.Keyset.keys.md deleted file mode 100644 index 724252f77..000000000 --- a/api-examples/function.HH.Lib.Keyset.keys.md +++ /dev/null @@ -1,9 +0,0 @@ -```basic-usage.hack -$result = Keyset\keys(dict[1 => 100, 33 => 400 ]); -print_r($result); -//result: keyset[1,33] - -$result = Keyset\keys(dict[]); -print_r($result); -//result: keyset[] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Keyset.map.md b/api-examples/function.HH.Lib.Keyset.map.md deleted file mode 100644 index fc69b0c67..000000000 --- a/api-examples/function.HH.Lib.Keyset.map.md +++ /dev/null @@ -1,9 +0,0 @@ -```basic-usage.hack -$result = Keyset\map(keyset[1,2,3,4], $val ==> $val*2); -print_r($result); -//result: keyset[2,4,6,8] - -$result = Keyset\map(keyset[1,2,3,4], $val ==> $val); -print_r($result); -//result: keyset[1,2,3,4] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Keyset.map_with_key.md b/api-examples/function.HH.Lib.Keyset.map_with_key.md deleted file mode 100644 index a18934b47..000000000 --- a/api-examples/function.HH.Lib.Keyset.map_with_key.md +++ /dev/null @@ -1,9 +0,0 @@ -```basic-usage.hack -$result = Keyset\map_with_key(dict[1 => 2, 2 => 4, 3 => 5], ($key, $val) ==> $val*$key); -print_r($result); -//result: keyset[2,8,15] - -$result = Keyset\map_with_key(dict[1 => 2, 2 => 4], ($key, $val) ==> $key); -print_r($result); -//result: keyset[1,2] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Keyset.partition.md b/api-examples/function.HH.Lib.Keyset.partition.md deleted file mode 100644 index 27ecd92ce..000000000 --- a/api-examples/function.HH.Lib.Keyset.partition.md +++ /dev/null @@ -1,9 +0,0 @@ -```basic-usage.hack -$result = Keyset\partition(keyset[1,2,3,4], $val ==> $val%2==0); -print_r($result); -//result: vec[keyset[2,4], keyset[1,3]] - -$result = Keyset\partition(keyset[1,2,3,4], $val ==> $val==0); -print_r($result); -//result: vec[keyset[], keyset[1,2,3,4]] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Keyset.sort.md b/api-examples/function.HH.Lib.Keyset.sort.md deleted file mode 100644 index bc969b0ab..000000000 --- a/api-examples/function.HH.Lib.Keyset.sort.md +++ /dev/null @@ -1,9 +0,0 @@ -```basic-usage.hack -$result = Keyset\sort(keyset[1,200, 5]); -print_r($result); -//result: keyset[1,5,200] - -$result = Keyset\sort(keyset[100,2000,3,4]); -print_r($result); -//result: keyset[3,4,100,2000] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Keyset.take.md b/api-examples/function.HH.Lib.Keyset.take.md deleted file mode 100644 index a6e616912..000000000 --- a/api-examples/function.HH.Lib.Keyset.take.md +++ /dev/null @@ -1,9 +0,0 @@ -```basic-usage.hack -$result = Keyset\take(keyset[1,200, 5], 2); -print_r($result); -//result: keyset[1,200] - -$result = Keyset\take(keyset[100,2000,3,4], 0); -print_r($result); -//result: keyset[] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Keyset.union.md b/api-examples/function.HH.Lib.Keyset.union.md deleted file mode 100644 index e6129883b..000000000 --- a/api-examples/function.HH.Lib.Keyset.union.md +++ /dev/null @@ -1,9 +0,0 @@ -```basic-usage.hack -$result = Keyset\union(keyset[1,2], vec[4,5] ); -print_r($result); -//result: keyset[1,2,4,5] - -$result = Keyset\union(keyset[1,2], vec[3,3,4,5] ); -print_r($result); -//result: keyset[1,2,3,4,5] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Math.abs.md b/api-examples/function.HH.Lib.Math.abs.md deleted file mode 100644 index b61efecef..000000000 --- a/api-examples/function.HH.Lib.Math.abs.md +++ /dev/null @@ -1,9 +0,0 @@ -```basic-usage.hack -$negative_number = -25; -$negative_number_abs = Math\abs($negative_number); -echo "Negative test - before: $negative_number after: $negative_number_abs \n"; - -$positive_number = 25; -$positive_number_abs = Math\abs($positive_number); -echo "Positive test - before: $positive_number after: $positive_number_abs \n"; -``` diff --git a/api-examples/function.HH.Lib.Math.base_convert.md b/api-examples/function.HH.Lib.Math.base_convert.md deleted file mode 100644 index 61e6e6bca..000000000 --- a/api-examples/function.HH.Lib.Math.base_convert.md +++ /dev/null @@ -1,10 +0,0 @@ -```basic-usage.hack -$result1 = Math\base_convert("30", 10, 16); -echo "30 in base 10 is $result1 in base 16 \n"; - -$result2 = Math\base_convert("2f", 16, 10); -echo "2f in base 16 is $result2 in base 10 \n"; - -$result3 = Math\base_convert("1111", 2, 16); -echo "1111 in base 2 is $result3 in base 16 \n"; -``` diff --git a/api-examples/function.HH.Lib.Math.ceil.md b/api-examples/function.HH.Lib.Math.ceil.md deleted file mode 100644 index 0cd88c96a..000000000 --- a/api-examples/function.HH.Lib.Math.ceil.md +++ /dev/null @@ -1,9 +0,0 @@ -```basic-usage.hack -$val_1 = 3.2; -$ceil_1 = Math\ceil($val_1); -echo "Ceiling of $val_1 is $ceil_1 \n"; - -$val_2 = 7; -$ceil_2 = Math\ceil($val_2); -echo "Ceiling of $val_2 is $ceil_2 \n"; -``` diff --git a/api-examples/function.HH.Lib.Math.floor.md b/api-examples/function.HH.Lib.Math.floor.md deleted file mode 100644 index 6959f2551..000000000 --- a/api-examples/function.HH.Lib.Math.floor.md +++ /dev/null @@ -1,7 +0,0 @@ -```basic-usage.hack -$floor1 = Math\floor(4.7); -echo "Floor of 4.7 is $floor1 \n"; - -$floor2 = Math\floor(5); -echo "Floor or 5 is $floor2 \n"; -``` diff --git a/api-examples/function.HH.Lib.Math.from_base.md b/api-examples/function.HH.Lib.Math.from_base.md deleted file mode 100644 index 5ea81899f..000000000 --- a/api-examples/function.HH.Lib.Math.from_base.md +++ /dev/null @@ -1,7 +0,0 @@ -```basic-usage.hack -$val1 = Math\from_base("101", 2); -echo "101 in base 2 represents the number $val1 \n"; - -$val2 = Math\from_base("e", 16); -echo "e in base 16 represents the number $val2 \n"; -``` diff --git a/api-examples/function.HH.Lib.Math.int_div.md b/api-examples/function.HH.Lib.Math.int_div.md deleted file mode 100644 index 1cba2c15d..000000000 --- a/api-examples/function.HH.Lib.Math.int_div.md +++ /dev/null @@ -1,8 +0,0 @@ -```basic-usage.hack -$result1 = Math\int_div(8, 4); -echo "Integer division of 8 by 4 yields $result1 \n"; - -$result2 = Math\int_div(7, 4); -echo "Integer division of 7 by 4 yields $result2 \n"; - -``` diff --git a/api-examples/function.HH.Lib.Math.log.md b/api-examples/function.HH.Lib.Math.log.md deleted file mode 100644 index 25a1f6e3f..000000000 --- a/api-examples/function.HH.Lib.Math.log.md +++ /dev/null @@ -1,5 +0,0 @@ -``` -$x = 10; -$log = Math\log($x); -echo "Log is $log \n"; // Output: Log is 2.302585092994 -``` diff --git a/api-examples/function.HH.Lib.Math.max.md b/api-examples/function.HH.Lib.Math.max.md deleted file mode 100644 index c113c3582..000000000 --- a/api-examples/function.HH.Lib.Math.max.md +++ /dev/null @@ -1,5 +0,0 @@ -```basic-usage.hack -$v = vec[3, 2, 6, 1, 4]; -$max = Math\max($v); -echo "The max is $max"; -``` diff --git a/api-examples/function.HH.Lib.Math.max_by.md b/api-examples/function.HH.Lib.Math.max_by.md deleted file mode 100644 index e1f50ad8c..000000000 --- a/api-examples/function.HH.Lib.Math.max_by.md +++ /dev/null @@ -1,9 +0,0 @@ -``` -$items = vec[tuple('foo', 9), tuple('bar', 8), tuple('baz', 7)]; -$maxItem = Math\max_by($items, $item ==> $item[1]); -echo "The max item is " . $maxItem[0]; -``` -Ouput -``` -The max item is foo -``` diff --git a/api-examples/function.HH.Lib.Math.maxva.md b/api-examples/function.HH.Lib.Math.maxva.md deleted file mode 100644 index 5bed544d9..000000000 --- a/api-examples/function.HH.Lib.Math.maxva.md +++ /dev/null @@ -1,4 +0,0 @@ -```basic-usage.hack -$maxval = Math\maxva(4, 3, 8, 1, 1, 2); -echo "The max value is " . $maxval; -``` diff --git a/api-examples/function.HH.Lib.Math.mean.md b/api-examples/function.HH.Lib.Math.mean.md deleted file mode 100644 index 9f3d8ac24..000000000 --- a/api-examples/function.HH.Lib.Math.mean.md +++ /dev/null @@ -1,5 +0,0 @@ -```basic-usage.hack -$v = vec[1, 2, 3, 4, 5]; -$mean = Math\mean($v); -echo "Mean of the array is $mean \n"; // Output: Mean of the array is 3 -``` diff --git a/api-examples/function.HH.Lib.Math.min.md b/api-examples/function.HH.Lib.Math.min.md deleted file mode 100644 index 65124faeb..000000000 --- a/api-examples/function.HH.Lib.Math.min.md +++ /dev/null @@ -1,5 +0,0 @@ -```basic-usage.hack -$v = vec[3, 2, 6, 1, 4]; -$min = Math\min($v); -echo "The min is $min"; -``` diff --git a/api-examples/function.HH.Lib.Math.minva.md b/api-examples/function.HH.Lib.Math.minva.md deleted file mode 100644 index 98af2ebed..000000000 --- a/api-examples/function.HH.Lib.Math.minva.md +++ /dev/null @@ -1,4 +0,0 @@ -```basic-usage.hack -$minval = Math\minva(1, 2, 3, 4, 5, 5, 4); -echo "The min value is " . $minval; -``` diff --git a/api-examples/function.HH.Lib.Math.round.md b/api-examples/function.HH.Lib.Math.round.md deleted file mode 100644 index ccc02c155..000000000 --- a/api-examples/function.HH.Lib.Math.round.md +++ /dev/null @@ -1,10 +0,0 @@ -```basic-usage.hack -$round1 = Math\round(8.65); -echo "8.65 rounded to default precision 0 yields $round1 \n"; - -$round2 = Math\round(8.65, 1); -echo "8.65 rounded to precision 1 yields $round2 \n"; - -$round3 = Math\round(8.65, -1); -echo "8.65 rounded to precision -1 yields $round3 \n"; -``` diff --git a/api-examples/function.HH.Lib.Math.sin.md b/api-examples/function.HH.Lib.Math.sin.md deleted file mode 100644 index 37096c8ab..000000000 --- a/api-examples/function.HH.Lib.Math.sin.md +++ /dev/null @@ -1,12 +0,0 @@ -```basic-usage.hack -$rotation = 0; -$result = Math\sin($rotation); -echo "Math\sin of $rotation : $result \n"; - -$rotation = 90; -$result = Math\sin($rotation); -echo "Math\sin of $rotation : $result \n"; - -$rotation = 180; -$result = Math\sin($rotation); -echo "Math\sin of $rotation : $result \n"; diff --git a/api-examples/function.HH.Lib.Math.sum.md b/api-examples/function.HH.Lib.Math.sum.md deleted file mode 100644 index b393f1b55..000000000 --- a/api-examples/function.HH.Lib.Math.sum.md +++ /dev/null @@ -1,5 +0,0 @@ -```basic-usage.hack -$v = vec[2, 1, 4]; -$sum = Math\sum($v); -echo "Sum of array is $sum \n"; -``` diff --git a/api-examples/function.HH.Lib.Math.sum_float.md b/api-examples/function.HH.Lib.Math.sum_float.md deleted file mode 100644 index 1d90fc4fb..000000000 --- a/api-examples/function.HH.Lib.Math.sum_float.md +++ /dev/null @@ -1,5 +0,0 @@ -```basic-usage.hack -$v = vec[2.3, 1, 4.15]; -$sum = Math\sum_float($v); -echo "Float sum of array is $sum \n"; -``` diff --git a/api-examples/function.HH.Lib.Math.tan.md b/api-examples/function.HH.Lib.Math.tan.md deleted file mode 100644 index 9c2e8347f..000000000 --- a/api-examples/function.HH.Lib.Math.tan.md +++ /dev/null @@ -1,12 +0,0 @@ -```basic-usage.hack -$rotation = 0; -$result = Math\tan($rotation); -echo "Math\\tan of $rotation : $result \n"; - -$rotation = 90; -$result = Math\tan($rotation); -echo "Math\\tan of $rotation : $result \n"; - -$rotation = 180; -$result = Math\tan($rotation); -echo "Math\\tan of $rotation : $result \n"; diff --git a/api-examples/function.HH.Lib.Math.to_base.md b/api-examples/function.HH.Lib.Math.to_base.md deleted file mode 100644 index a63169680..000000000 --- a/api-examples/function.HH.Lib.Math.to_base.md +++ /dev/null @@ -1,15 +0,0 @@ -```basic-usage.hack -$in = 30; - -$base_1 = 10; -$out_1 = Math\to_base($in, $base_1); -echo "$in to base $base_1 is $out_1 \n"; - -$base_2 = 16; -$out_2 = Math\to_base($in, $base_2); -echo "$in to base $base_2 is $out_2 \n"; - -$base_3 = 2; -$out_3 = Math\to_base($in, $base_3); -echo "$in to base $base_3 is $out_3 \n"; -``` diff --git a/api-examples/function.HH.Lib.Str.capitalize.md b/api-examples/function.HH.Lib.Str.capitalize.md deleted file mode 100644 index 02ffffcce..000000000 --- a/api-examples/function.HH.Lib.Str.capitalize.md +++ /dev/null @@ -1,9 +0,0 @@ -```basic-usage.hack -$result = Str\capitalize("example_string"); -echo($result); -// result "Example_string" - -$result = Str\capitalize("Example_string"); -echo($result); -// result "Example_string" -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Str.chunk.md b/api-examples/function.HH.Lib.Str.chunk.md deleted file mode 100644 index 6deb3c15b..000000000 --- a/api-examples/function.HH.Lib.Str.chunk.md +++ /dev/null @@ -1,9 +0,0 @@ -```basic-usage.hack -$result = Str\chunk("example_string", 5); -print_r($result); -//result: ["examp", "le_st", "ring"] - -$result = Str\chunk("example_string", 50); -print_r($result); -//result: ["example_string"] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Str.compare.md b/api-examples/function.HH.Lib.Str.compare.md deleted file mode 100644 index b6ff79bdb..000000000 --- a/api-examples/function.HH.Lib.Str.compare.md +++ /dev/null @@ -1,13 +0,0 @@ -```basic-usage.hack -$comparison_1 = Str\compare("apple", "banana"); -echo "Result of first comparison: $comparison_1 \n"; - -$comparison_2 = Str\compare("banana", "apple"); -echo "Result of second comparison: $comparison_2 \n"; - -$comparison_3 = Str\compare("apple", "apple"); -echo "Result of third comparison: $comparison_3 \n"; - -$comparison_4 = Str\compare("apple", "Apple"); -echo "Result of fourth comparison: $comparison_4 \n"; -``` diff --git a/api-examples/function.HH.Lib.Str.compare_ci.md b/api-examples/function.HH.Lib.Str.compare_ci.md deleted file mode 100644 index 1bc5d2f9b..000000000 --- a/api-examples/function.HH.Lib.Str.compare_ci.md +++ /dev/null @@ -1,13 +0,0 @@ -```basic-usage.hack -$comparison_1 = Str\compare_ci("apple", "banana"); -echo "Result of first comparison: $comparison_1 \n"; - -$comparison_2 = Str\compare_ci("banana", "apple"); -echo "Result of second comparison: $comparison_2 \n"; - -$comparison_3 = Str\compare_ci("apple", "Banana"); -echo "Result of third comparison: $comparison_3 \n"; - -$comparison_4 = Str\compare_ci("apple", "Apple"); -echo "Result of fourth comparison: $comparison_4 \n"; -``` diff --git a/api-examples/function.HH.Lib.Str.contains.md b/api-examples/function.HH.Lib.Str.contains.md deleted file mode 100644 index 2afb2cc12..000000000 --- a/api-examples/function.HH.Lib.Str.contains.md +++ /dev/null @@ -1,17 +0,0 @@ -```basic-usage.hack -$result = Str\contains("example_string", "example"); -echo($result); -//result: true - -$result = Str\contains("example_string", "EXAMPLE"); // different case -echo($result); -//result: false - -$result = Str\contains("example_string", "example", 2); // with offset -echo($result); -//result: false - -$result = Str\contains("example_string", "uncontained"); -echo($result); -//result: false -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Str.ends_with.md b/api-examples/function.HH.Lib.Str.ends_with.md deleted file mode 100644 index c4408793a..000000000 --- a/api-examples/function.HH.Lib.Str.ends_with.md +++ /dev/null @@ -1,13 +0,0 @@ -```basic-usage.hack -$result = Str\ends_with("example_string", "string"); -echo($result); -//result: true - -$result = Str\ends_with("example_string", "STRING"); -echo($result); -//result: false - -$result = Str\ends_with("example_string", "uncontained"); -echo($result); -// result false -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Str.ends_with_ci.md b/api-examples/function.HH.Lib.Str.ends_with_ci.md deleted file mode 100644 index 537683296..000000000 --- a/api-examples/function.HH.Lib.Str.ends_with_ci.md +++ /dev/null @@ -1,11 +0,0 @@ -```basic-usage.hack -$result = Str\ends_with_ci("example_string", "string"); -echo($result); -//result: true -$result = Str\ends_with_ci("example_string", "STRING"); -echo($result); -//result: true -$result = Str\ends_with_ci("example_string", "uncontained"); -echo($result); -//result: false -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Str.join.md b/api-examples/function.HH.Lib.Str.join.md deleted file mode 100644 index aa29e9b50..000000000 --- a/api-examples/function.HH.Lib.Str.join.md +++ /dev/null @@ -1,9 +0,0 @@ -```basic-usage.hack -$strings= vec["a", "b", "c", "d"]; - -$joined_string_1 = Str\join($strings, ","); -echo "First string: $joined_string_1 \n"; - -$joined_string_2 = Str\join($strings, "-"); -echo "Second string: $joined_string_2"; -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Str.length.md b/api-examples/function.HH.Lib.Str.length.md deleted file mode 100644 index 013f3d8a2..000000000 --- a/api-examples/function.HH.Lib.Str.length.md +++ /dev/null @@ -1,9 +0,0 @@ -```basic-usage.hack -$result = Str\length("example_string"); -echo($result); -//result: 14 - -$result = Str\length(""); -echo($result); -//result: 0 -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Str.replace.md b/api-examples/function.HH.Lib.Str.replace.md deleted file mode 100644 index 928216c3a..000000000 --- a/api-examples/function.HH.Lib.Str.replace.md +++ /dev/null @@ -1,13 +0,0 @@ -```basic-usage.hack -$result = Str\replace("example_string", "string", "replacement"); -echo($result); -//result: "example_replacement" - -$result = Str\replace("example_string", "STRING", "replacement"); -echo($result); -//result: "example_string" - -$result = Str\replace("example_string", "uncontained", "replacement"); -echo($result); -//result: "example_string" -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Str.replace_ci.md b/api-examples/function.HH.Lib.Str.replace_ci.md deleted file mode 100644 index 9ec7113c9..000000000 --- a/api-examples/function.HH.Lib.Str.replace_ci.md +++ /dev/null @@ -1,13 +0,0 @@ -```basic-usage.hack -$result = Str\replace_ci("example_string", "string", "replacement"); -echo($result); -//result: example_replacement - -$result = Str\replace_ci("example_string", "STRING", "replacement"); -echo($result); -//result: example_replacement - -$result = Str\replace_ci("example_string", "uncontained", "replacement"); -echo($result); -//result: example_string -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Str.replace_every.md b/api-examples/function.HH.Lib.Str.replace_every.md deleted file mode 100644 index 182d1ef0b..000000000 --- a/api-examples/function.HH.Lib.Str.replace_every.md +++ /dev/null @@ -1,13 +0,0 @@ -```basic-usage.hack -$result = Str\replace_every("example_string", dict["example"=>"test", "string"=>"value"]); -echo($result); -//result: test_value - -$result = Str\replace_every("example_string", dict["EXAMPLE"=>"test", "STRING"=>"value"]); -echo($result); -//result: example_string - -$result = Str\replace_every("example_string", dict["uncontained"=>"test", "uncontained_2"=>"value"]); -echo($result); -//result: example_string -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Str.replace_every_ci.md b/api-examples/function.HH.Lib.Str.replace_every_ci.md deleted file mode 100644 index 6eee8157c..000000000 --- a/api-examples/function.HH.Lib.Str.replace_every_ci.md +++ /dev/null @@ -1,13 +0,0 @@ -```basic-usage.hack -$result = Str\replace_every_ci("example_string", dict["example"=>"test", "string"=>"value"]); -echo($result); -//result: test_value - -$result = Str\replace_every_ci("example_string", dict["EXAMPLE"=>"test", "STRING"=>"value"]); -echo($result); -//result: test_value - -$result = Str\replace_every_ci("example_string", dict["uncontained"=>"test", "uncontained_2"=>"value"]); -echo($result); -//result: example_string -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Str.reverse.md b/api-examples/function.HH.Lib.Str.reverse.md deleted file mode 100644 index 3e7e6b4c5..000000000 --- a/api-examples/function.HH.Lib.Str.reverse.md +++ /dev/null @@ -1,13 +0,0 @@ -```basic-usage.hack -$result = Str\reverse("example_string"); -echo($result); -//result: "gnirts_elpmaxe" - -$result = Str\reverse("Example_string"); -echo($result); -//result:"gnirts_elpmaxE" - -$result = Str\reverse(""); -echo($result); -//result: "" -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Str.search.md b/api-examples/function.HH.Lib.Str.search.md deleted file mode 100644 index 6e0b121b2..000000000 --- a/api-examples/function.HH.Lib.Str.search.md +++ /dev/null @@ -1,17 +0,0 @@ -```basic-usage.hack -$result = Str\search("example_string", "example"); -echo($result); -//result: 0 - -$result = Str\search("example_string", "EXAMPLE"); -echo($result); -//result: null - -$result = Str\search("example_string", "example", 2); // with offset -echo($result); -//result: null - -$result = Str\search("example_string", "uncontained"); -echo($result); -//result: null -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Str.search_ci.md b/api-examples/function.HH.Lib.Str.search_ci.md deleted file mode 100644 index fd8b9e4c9..000000000 --- a/api-examples/function.HH.Lib.Str.search_ci.md +++ /dev/null @@ -1,17 +0,0 @@ -```basic-usage.hack -$result = Str\search_ci("example_string", "example"); -echo($result); -//result: 0 - -$result = Str\search_ci("example_string", "EXAMPLE"); -echo($result); -//result: 0 - -$result = Str\search_ci("example_string", "example", 2); // with offset -echo($result); -//result: null - -$result = Str\search_ci("example_string", "uncontained"); -echo($result); -//result: null -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Str.slice.md b/api-examples/function.HH.Lib.Str.slice.md deleted file mode 100644 index 59e8b4565..000000000 --- a/api-examples/function.HH.Lib.Str.slice.md +++ /dev/null @@ -1,17 +0,0 @@ -```basic-usage.hack -$result = Str\slice("example_string", 5); -echo($result); -//result: "le_string" - -$result = Str\slice("example_string", 5, 1); -echo($result); -//result: "l" - -$result = Str\slice("example_string", 2, 0); -echo($result); -//result: "" - -$result = Str\slice("example_string", 1000); -echo($result); -//result: -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Str.splice_l.md b/api-examples/function.HH.Lib.Str.splice_l.md deleted file mode 100644 index e1e37c60f..000000000 --- a/api-examples/function.HH.Lib.Str.splice_l.md +++ /dev/null @@ -1,4 +0,0 @@ -```basic-usage.hack -$locale = \HH\Lib\Locale\create("en_US.UTF-8"); -$result = Str\splice_l($locale, "apple", "orange", 5, 0); -echo "Splice string with en_US.UTF-8: $result \n"; diff --git a/api-examples/function.HH.Lib.Str.split.md b/api-examples/function.HH.Lib.Str.split.md deleted file mode 100644 index ed975cfce..000000000 --- a/api-examples/function.HH.Lib.Str.split.md +++ /dev/null @@ -1,8 +0,0 @@ -```basic-usage.hack -$str = "This, is, a, great, software, for sure."; -$split_str = Str\split($str, ","); -\print_r($split_str); - -$split_str2 = Str\split($str, ",", 3); -\print_r($split_str2); -``` diff --git a/api-examples/function.HH.Lib.Str.starts_with.md b/api-examples/function.HH.Lib.Str.starts_with.md deleted file mode 100644 index 99f2391b9..000000000 --- a/api-examples/function.HH.Lib.Str.starts_with.md +++ /dev/null @@ -1,13 +0,0 @@ -```basic-usage.hack -$result = Str\starts_with("example_string", "example"); -echo($result); -//result: true - -$result = Str\starts_with("example_string", "EXAMPLE"); -echo($result); -//result: false - -$result = Str\starts_with("example_string", "string"); -echo($result); -//result: false -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Str.starts_with_ci.md b/api-examples/function.HH.Lib.Str.starts_with_ci.md deleted file mode 100644 index 22c02809c..000000000 --- a/api-examples/function.HH.Lib.Str.starts_with_ci.md +++ /dev/null @@ -1,13 +0,0 @@ -```basic-usage.hack -$result = Str\starts_with_ci("example_string", "example"); -echo($result); -//result: true - -$result = Str\starts_with_ci("example_string", "EXAMPLE"); -echo($result); -//result: true - -$result = Str\starts_with_ci("example_string", "string"); -echo($result); -//result: false -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Str.strip_suffix.md b/api-examples/function.HH.Lib.Str.strip_suffix.md deleted file mode 100644 index be93fbc29..000000000 --- a/api-examples/function.HH.Lib.Str.strip_suffix.md +++ /dev/null @@ -1,5 +0,0 @@ -```basic-usage.hack -$input = "\$100 USD"; -$result = Str\strip_suffix($input, "USD"); -echo "Strip suffix from $input : $result \n"; - diff --git a/api-examples/function.HH.Lib.Str.trim.md b/api-examples/function.HH.Lib.Str.trim.md deleted file mode 100644 index fadc51fe0..000000000 --- a/api-examples/function.HH.Lib.Str.trim.md +++ /dev/null @@ -1,9 +0,0 @@ -```basic-usage.hack -$result = Str\trim("example_string "); -echo($result); -//result: "example_string" - -$result = Str\trim(" example_string "); -echo($result); -//result: "example_string" -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Str.uppercase.md b/api-examples/function.HH.Lib.Str.uppercase.md deleted file mode 100644 index 69c429f5e..000000000 --- a/api-examples/function.HH.Lib.Str.uppercase.md +++ /dev/null @@ -1,7 +0,0 @@ -```basic-usage.hack -$string = "hhvm"; - -$string_upper = Str\uppercase($string); -echo "Uppercase string: $string_upper \n"; -//result: Uppercase string: HHVM -``` diff --git a/api-examples/function.HH.Lib.Str.uppercase_l.md b/api-examples/function.HH.Lib.Str.uppercase_l.md deleted file mode 100644 index eecce7f25..000000000 --- a/api-examples/function.HH.Lib.Str.uppercase_l.md +++ /dev/null @@ -1,4 +0,0 @@ -```basic-usage.hack -$locale = \HH\Lib\Locale\create("en_US.UTF-8"); -$uppercase_string = Str\uppercase_l($locale, 'ifoo'); -echo "Get uppercase string with en_US.UTF-8: $uppercase_string \n"; diff --git a/api-examples/function.HH.Lib.Vec.chunk.md b/api-examples/function.HH.Lib.Vec.chunk.md deleted file mode 100644 index 88199d9a0..000000000 --- a/api-examples/function.HH.Lib.Vec.chunk.md +++ /dev/null @@ -1,9 +0,0 @@ -```basic-usage.hack -$example_vec = vec[1,2,3,4,5]; -$chunks = Vec\chunk($example_vec, 3); -print_r($chunks); -// result [[1,2,3], [4,5]] -$chunks = Vec\chunk($example_vec, 5); -print_r($chunks); -// result [1,2,3,4,5] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Vec.concat.md b/api-examples/function.HH.Lib.Vec.concat.md deleted file mode 100644 index 293aea454..000000000 --- a/api-examples/function.HH.Lib.Vec.concat.md +++ /dev/null @@ -1,9 +0,0 @@ -```basic-usage.hack -$original_vec = vec["abc", "def", "ghi"]; -$rest = vec["xxx", "yyy"]; -$concat_vec = Vec\concat($original_vec, $rest); -echo "Resulting concat vec: \n"; -\print_r($concat_vec); -//Output: Resulting concat vec: -//vec["abc", "def", "ghi", "xxx", "yyy"] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Vec.diff.md b/api-examples/function.HH.Lib.Vec.diff.md deleted file mode 100644 index 53389e416..000000000 --- a/api-examples/function.HH.Lib.Vec.diff.md +++ /dev/null @@ -1,14 +0,0 @@ -```basic-usage.hack -$example_vec1 = vec[1,2,3,4,5]; -$example_vec2 = vec[1,3]; - -$diffed_vec = Vec\diff($example_vec1, $example_vec2); -print_r($diffed_vec); -// result: [2,4,5] - -$example_vec3 = vec[6,7]; - -$diffed_vec = Vec\diff($example_vec1, $example_vec3); -print_r($diffed_vec); -// result: [1,2,3,4,5] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Vec.drop.md b/api-examples/function.HH.Lib.Vec.drop.md deleted file mode 100644 index 24226ceb4..000000000 --- a/api-examples/function.HH.Lib.Vec.drop.md +++ /dev/null @@ -1,10 +0,0 @@ -```basic-usage.hack -$example_vec = vec[1,2,3,4,5]; -$result = Vec\drop($example_vec, 3); -print_r($result); -//result: [4,5] - -$result = Vec\drop($example_vec, 0); -print_r($result); -//result: [1,2,3,4,5] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Vec.fill.md b/api-examples/function.HH.Lib.Vec.fill.md deleted file mode 100644 index 7fdfadfe8..000000000 --- a/api-examples/function.HH.Lib.Vec.fill.md +++ /dev/null @@ -1,13 +0,0 @@ -```basic-usage.hack -$result = Vec\fill(2, 100); -print_r($result); -//result: [100, 100] - -$result = Vec\fill(0, 10); -print_r($result); -//result: [] - -$result = Vec\fill(5, 1); -print_r($result); -//result: [1,1,1,1,1] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Vec.filter.md b/api-examples/function.HH.Lib.Vec.filter.md deleted file mode 100644 index ad1c1d439..000000000 --- a/api-examples/function.HH.Lib.Vec.filter.md +++ /dev/null @@ -1,8 +0,0 @@ -```basic-usage.hack -$numbers = vec[1, 2, 3, 4, 5]; -$filter_numbers = Vec\filter($numbers, $number ==> $number % 2 === 0); -echo "Filter numbers are: \n"; -\print_r($filter_numbers); -//Output: Filter numbers are: -//vec[2, 4] -``` diff --git a/api-examples/function.HH.Lib.Vec.flatten.md b/api-examples/function.HH.Lib.Vec.flatten.md deleted file mode 100644 index 4de04a86c..000000000 --- a/api-examples/function.HH.Lib.Vec.flatten.md +++ /dev/null @@ -1,16 +0,0 @@ -```basic-usage.hack -$example_vec = vec[vec[1,2,3,4,5],vec[98,99]]; -$result = Vec\flatten($example_vec); -print_r($result); -//result: [1,2,3,4,5,98,99] - -$example_vec = vec[vec[1,2,3,4,5,98,99]]; -$result = Vec\flatten($example_vec); -print_r($result); -//result: [1,2,3,4,5,98,99] - -$example_vec = vec[]; -$result = Vec\flatten($example_vec); -print_r($result); -//result: [] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Vec.intersect.md b/api-examples/function.HH.Lib.Vec.intersect.md deleted file mode 100644 index a3727b257..000000000 --- a/api-examples/function.HH.Lib.Vec.intersect.md +++ /dev/null @@ -1,13 +0,0 @@ -```basic-usage.hack -$example_vec1 = vec[1,2,3,4,5]; -$example_vec2 = vec[1,3]; - -$result = Vec\intersect($example_vec1, $example_vec2); -print_r($result); -//result: [1,3] - -$example_vec3 = vec[6,7]; -$result = Vec\intersect($example_vec1, $example_vec3); -print_r($result); -//result: [] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Vec.keys.md b/api-examples/function.HH.Lib.Vec.keys.md deleted file mode 100644 index 338976481..000000000 --- a/api-examples/function.HH.Lib.Vec.keys.md +++ /dev/null @@ -1,9 +0,0 @@ -```basic-usage.hack -$result = Vec\keys(dict[1 => 100, 33 => 400 ]); -print_r($result); -//result: [1, 33] - -$result = Vec\keys(dict[]); -print_r($result); -//result: [] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Vec.map.md b/api-examples/function.HH.Lib.Vec.map.md deleted file mode 100644 index 9a672f7c5..000000000 --- a/api-examples/function.HH.Lib.Vec.map.md +++ /dev/null @@ -1,8 +0,0 @@ -```basic-usage.hack -$numbers = vec[1, 2, 3]; -$new_numbers = Vec\map($numbers, $number ==> ($number + 1)); -echo "new numbers are: \n"; -\print_r($new_numbers); -//Output: new numbers are: -//vec[2, 3, 4] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Vec.partition.md b/api-examples/function.HH.Lib.Vec.partition.md deleted file mode 100644 index 741bb77a0..000000000 --- a/api-examples/function.HH.Lib.Vec.partition.md +++ /dev/null @@ -1,14 +0,0 @@ -```basic-usage.hack -$example_vec = vec[1,2,3,4,5]; -$result = Vec\partition($example_vec, $val ==> $val%2 == 0); -print_r($result); -// result: [[2,4], [1,3,5]] - -$result = Vec\partition($example_vec, $val ==> $val == $val); -print_r($result); -//result: [[1,2,3,4,5], []] - -$result = Vec\partition($example_vec, $val ==> $val != 0); -print_r($result); -//result: [[1,2,3,4,5], []] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Vec.range.md b/api-examples/function.HH.Lib.Vec.range.md deleted file mode 100644 index cde664e41..000000000 --- a/api-examples/function.HH.Lib.Vec.range.md +++ /dev/null @@ -1,13 +0,0 @@ -```basic-usage.hack -$result = Vec\range(1, 10, 1); -print_r($result); -//result: [1,2,3,4,5,6,7,8,9,10] - -$result = Vec\range(1, 10, 2); -print_r($result); -//result: [1,3,5,7,9] - -$result = Vec\range(1, 10, 3); -print_r($result); -//result: [1,4,7,10] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Vec.reverse.md b/api-examples/function.HH.Lib.Vec.reverse.md deleted file mode 100644 index 51ea0536e..000000000 --- a/api-examples/function.HH.Lib.Vec.reverse.md +++ /dev/null @@ -1,5 +0,0 @@ -```basic-usage.hack -$vector = vec[1, 2, 3, 4, 5, 6]; -$reversed = Vec\reverse($vector); -\print_r($reversed); -``` diff --git a/api-examples/function.HH.Lib.Vec.sample.md b/api-examples/function.HH.Lib.Vec.sample.md deleted file mode 100644 index dc9360998..000000000 --- a/api-examples/function.HH.Lib.Vec.sample.md +++ /dev/null @@ -1,14 +0,0 @@ -```basic-usage.hack -$example_vec = vec[1,2,3,4,5]; -$result = Vec\sample($example_vec, 3); -print_r($result); -//result: [2,5,3] OR any 3 elements - -$result = Vec\sample($example_vec, 0); -print_r($result); -//result: [] - -$result = Vec\sample($example_vec, 5); -print_r($result); -//result: [4,5,2,1,3]; All 5 elements -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Vec.slice.md b/api-examples/function.HH.Lib.Vec.slice.md deleted file mode 100644 index 0bdcfcece..000000000 --- a/api-examples/function.HH.Lib.Vec.slice.md +++ /dev/null @@ -1,8 +0,0 @@ -```basic-usage.hack -$vector = vec[1, 2, 3, 4, 5, 6, 7]; -$sliced_vector = Vec\slice($vector, 3); -\print_r($sliced_vector); - -$sliced_vector2 = Vec\slice($vector, 2, 3); -\print_r($sliced_vector2); -``` diff --git a/api-examples/function.HH.Lib.Vec.sort.md b/api-examples/function.HH.Lib.Vec.sort.md deleted file mode 100644 index e5a0b6be9..000000000 --- a/api-examples/function.HH.Lib.Vec.sort.md +++ /dev/null @@ -1,16 +0,0 @@ -```basic-usage.hack -$example_vec = vec[100,2,4,1,6]; -$result = Vec\sort($example_vec); -print_r($result); -//result: [1,2,4,6,100] - -$example_vec = vec[1,2,3,4,5]; -$result = Vec\sort($example_vec); -print_r($result); -//result: [1,2,3,4,5] - -$example_vec = vec[0,0,0,0,0]; -$result = Vec\sort($example_vec); -print_r($result); -//result: [0,0,0,0,0] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Vec.take.md b/api-examples/function.HH.Lib.Vec.take.md deleted file mode 100644 index cb285372f..000000000 --- a/api-examples/function.HH.Lib.Vec.take.md +++ /dev/null @@ -1,14 +0,0 @@ -```basic-usage.hack -$example_vec = vec[1,2,3,4,5]; -$result = Vec\take($example_vec, 3); -print_r($result); -//result: [1,2,3] - -$result = Vec\take($example_vec, 0); -print_r($result); -//result: [] - -$result = Vec\take($example_vec, 5); -print_r($result); -//result: [1,2,3,4,5] -``` \ No newline at end of file diff --git a/api-examples/function.HH.Lib.Vec.unique.md b/api-examples/function.HH.Lib.Vec.unique.md deleted file mode 100644 index c280c0b76..000000000 --- a/api-examples/function.HH.Lib.Vec.unique.md +++ /dev/null @@ -1,6 +0,0 @@ -```basic-usage.hack -$vector = vec[1, 1, 2, 3, 4, 4, 4, 4]; -$uniqueVals = Vec\unique($vector); -\print_r($uniqueVals); -``` - diff --git a/api-examples/function.HH.Lib.Vec.zip.md b/api-examples/function.HH.Lib.Vec.zip.md deleted file mode 100644 index 8adc47a1c..000000000 --- a/api-examples/function.HH.Lib.Vec.zip.md +++ /dev/null @@ -1,13 +0,0 @@ -```basic-usage.hack -$example_vec1 = vec[1,2,3,4,5]; -$example_vec2 = vec[11,17,23,44,55]; - -$result = Vec\zip($example_vec1, $example_vec2); -print_r($result); -//result: [[1, 11], [2,17], [3,23], [4, 44], [5,55]] - -$example_vec3 = vec[6,7]; -$result = Vec\zip($example_vec1, $example_vec3); -print_r($result); -//result: [[1,6], [2,7]] -``` \ No newline at end of file diff --git a/api-examples/function.curl_multi_await.md b/api-examples/function.curl_multi_await.md deleted file mode 100644 index 8e82bfd52..000000000 --- a/api-examples/function.curl_multi_await.md +++ /dev/null @@ -1,56 +0,0 @@ -The following shows a scenario where you are going to wait for and return the result of activity on multiple curl handles. A bit of a simpler approach would be to use [`HH\Asio\curl_exec`](//hack/reference/function/HH.Asio.curl_exec/), which is a wrapper around `curl_multi_await`. - -```basic-usage.hack -async function get_curl_content(Set $urls): Awaitable> { - - $chs = Vector {}; - foreach ($urls as $url) { - $ch = \curl_init($url); - \curl_setopt($ch, \CURLOPT_RETURNTRANSFER, true); - $chs[] = $ch; - } - - $mh = \curl_multi_init(); - foreach ($chs as $ch) { - \curl_multi_add_handle($mh, $ch); - } - - $active = -1; - do { - $ret = \curl_multi_exec($mh, inout $active); - } while ($ret == \CURLM_CALL_MULTI_PERFORM); - - while ($active && $ret == \CURLM_OK) { - $select = await \curl_multi_await($mh); - if ($select === -1) { - // https://bugs.php.net/bug.php?id=61141 - await \HH\Asio\usleep(100); - } - do { - $ret = \curl_multi_exec($mh, inout $active); - } while ($ret == \CURLM_CALL_MULTI_PERFORM); - } - - $content = Vector {}; - - foreach ($chs as $ch) { - $str = (string)\curl_multi_getcontent($ch); - $content[] = \substr($str, 0, 10); - \curl_multi_remove_handle($mh, $ch); - } - - \curl_multi_close($mh); - - return $content; -} - -<<__EntryPoint>> -async function run(): Awaitable { - $urls = Set { - 'https://hhvm.com/blog/2020/05/04/hhvm-4.56.html', - 'https://hhvm.com/blog/2020/10/21/hhvm-4.80.html', - }; - $content = await get_curl_content($urls); - \var_dump($content); -} -``` diff --git a/api-php/php-classes.list b/api-php/php-classes.list deleted file mode 100644 index 914d24e97..000000000 --- a/api-php/php-classes.list +++ /dev/null @@ -1,747 +0,0 @@ -amqpchannel -amqpconnection -amqpenvelope -amqpexchange -amqpqueue -apciterator -apcuiterator -appenditerator -argumentcounterror -arithmeticerror -arrayaccess -arrayiterator -arrayobject -assertionerror -badfunctioncallexception -badmethodcallexception -cachingiterator -cairo -cairoantialias -cairocontent -cairocontext -cairoexception -cairoextend -cairofillrule -cairofilter -cairofontface -cairofontoptions -cairofontslant -cairofonttype -cairofontweight -cairoformat -cairogradientpattern -cairohintmetrics -cairohintstyle -cairoimagesurface -cairolineargradient -cairolinecap -cairolinejoin -cairomatrix -cairooperator -cairopath -cairopattern -cairopatterntype -cairopdfsurface -cairopslevel -cairopssurface -cairoradialgradient -cairoscaledfont -cairosolidpattern -cairostatus -cairosubpixelorder -cairosurface -cairosurfacepattern -cairosurfacetype -cairosvgsurface -cairosvgversion -cairotoyfontface -callbackfilteriterator -chdb -closure -collator -collectable -com -com-exception -commonmark-cql -commonmark-interfaces-ivisitable -commonmark-interfaces-ivisitor -commonmark-node -commonmark-node-blockquote -commonmark-node-bulletlist -commonmark-node-code -commonmark-node-codeblock -commonmark-node-customblock -commonmark-node-custominline -commonmark-node-document -commonmark-node-heading -commonmark-node-htmlblock -commonmark-node-htmlinline -commonmark-node-image -commonmark-node-item -commonmark-node-linebreak -commonmark-node-link -commonmark-node-orderedlist -commonmark-node-paragraph -commonmark-node-softbreak -commonmark-node-text -commonmark-node-text-emphasis -commonmark-node-text-strong -commonmark-node-thematicbreak -commonmark-parser -compileerror -componere-abstract-definition -componere-definition -componere-method -componere-patch -componere-value -cond -countable -curlfile -dateinterval -dateperiod -datetime -datetimeimmutable -datetimeinterface -datetimezone -directory -directoryiterator -divisionbyzeroerror -domainexception -domattr -domcdatasection -domcharacterdata -domcomment -domdocument -domdocumentfragment -domdocumenttype -domelement -domentity -domentityreference -domexception -domimplementation -domnamednodemap -domnode -domnodelist -domnotation -domprocessinginstruction -domtext -domxpath -dotnet -ds-collection -ds-deque -ds-hashable -ds-map -ds-pair -ds-priorityqueue -ds-queue -ds-sequence -ds-set -ds-stack -ds-vector -dummyclosure -dummycontinuation -emptyiterator -error -errorexception -ev -evcheck -evchild -evembed -event -eventbase -eventbuffer -eventbufferevent -eventconfig -eventdnsbase -eventhttp -eventhttpconnection -eventhttprequest -eventlistener -eventsslcontext -eventutil -evfork -evidle -evio -evloop -evperiodic -evprepare -evsignal -evstat -evtimer -evwatcher -exception -fannconnection -ffi -ffi-cdata -ffi-ctype -ffi-exception -ffi-parserexception -filesystemiterator -filteriterator -finfo -gearmanclient -gearmanexception -gearmanjob -gearmantask -gearmanworker -gender -generator -globiterator -gmagick -gmagickdraw -gmagickpixel -gmp -haruannotation -harudestination -harudoc -haruencoder -haruexception -harufont -haruimage -haruoutline -harupage -hashcontext -hrtime-performancecounter -hrtime-stopwatch -hrtime-unit -httpdeflatestream -httpinflatestream -httpmessage -httpquerystring -httprequest -httprequestpool -httpresponse -imagesprite -imagick -imagickdraw -imagickdrawexception -imagickexception -imagickkernel -imagickpixel -imagickpixelexception -imagickpixeliterator -imagickpixeliteratorexception -infiniteiterator -intlbreakiterator -intlcalendar -intlchar -intlcodepointbreakiterator -intldateformatter -intlexception -intlgregoriancalendar -intliterator -intlpartsiterator -intlrulebasedbreakiterator -intltimezone -invalidargumentexception -iterator -iteratoraggregate -iteratoriterator -jsonexception -jsonserializable -judy -ktaglib-id3v2-attachedpictureframe -ktaglib-id3v2-frame -ktaglib-id3v2-tag -ktaglib-mpeg-audioproperties -ktaglib-mpeg-file -ktaglib-tag -lapack -lapackexception -lengthexception -libxmlerror -limititerator -locale -logicexception -lua -luaclosure -memcache -memcached -memcachedexception -messageformatter -mongo -mongobindata -mongoclient -mongocode -mongocollection -mongocommandcursor -mongoconnectionexception -mongocursor -mongocursorexception -mongocursorinterface -mongocursortimeoutexception -mongodate -mongodb -mongodb-bson-binary -mongodb-bson-binaryinterface -mongodb-bson-dbpointer -mongodb-bson-decimal128 -mongodb-bson-decimal128interface -mongodb-bson-int64 -mongodb-bson-javascript -mongodb-bson-javascriptinterface -mongodb-bson-maxkey -mongodb-bson-maxkeyinterface -mongodb-bson-minkey -mongodb-bson-minkeyinterface -mongodb-bson-objectid -mongodb-bson-objectidinterface -mongodb-bson-persistable -mongodb-bson-regex -mongodb-bson-regexinterface -mongodb-bson-serializable -mongodb-bson-symbol -mongodb-bson-timestamp -mongodb-bson-timestampinterface -mongodb-bson-type -mongodb-bson-undefined -mongodb-bson-unserializable -mongodb-bson-utcdatetime -mongodb-bson-utcdatetimeinterface -mongodb-driver-bulkwrite -mongodb-driver-command -mongodb-driver-cursor -mongodb-driver-cursorid -mongodb-driver-exception-authenticationexception -mongodb-driver-exception-bulkwriteexception -mongodb-driver-exception-commandexception -mongodb-driver-exception-connectionexception -mongodb-driver-exception-connectiontimeoutexception -mongodb-driver-exception-exception -mongodb-driver-exception-executiontimeoutexception -mongodb-driver-exception-invalidargumentexception -mongodb-driver-exception-logicexception -mongodb-driver-exception-runtimeexception -mongodb-driver-exception-serverexception -mongodb-driver-exception-sslconnectionexception -mongodb-driver-exception-unexpectedvalueexception -mongodb-driver-exception-writeexception -mongodb-driver-manager -mongodb-driver-monitoring-commandfailedevent -mongodb-driver-monitoring-commandstartedevent -mongodb-driver-monitoring-commandsubscriber -mongodb-driver-monitoring-commandsucceededevent -mongodb-driver-monitoring-subscriber -mongodb-driver-query -mongodb-driver-readconcern -mongodb-driver-readpreference -mongodb-driver-server -mongodb-driver-session -mongodb-driver-writeconcern -mongodb-driver-writeconcernerror -mongodb-driver-writeerror -mongodb-driver-writeresult -mongodbref -mongodeletebatch -mongoduplicatekeyexception -mongoexception -mongoexecutiontimeoutexception -mongogridfs -mongogridfscursor -mongogridfsexception -mongogridfsfile -mongoid -mongoinsertbatch -mongoint32 -mongoint64 -mongolog -mongomaxkey -mongominkey -mongopool -mongoprotocolexception -mongoregex -mongoresultexception -mongotimestamp -mongoupdatebatch -mongowritebatch -mongowriteconcernexception -multipleiterator -mutex -mysqli -mysqli-driver -mysqli-result -mysqli-sql-exception -mysqli-stmt -mysqli-warning -mysqlnduhconnection -mysqlnduhpreparedstatement -mysql-xdevapi-baseresult -mysql-xdevapi-collection -mysql-xdevapi-collectionadd -mysql-xdevapi-collectionfind -mysql-xdevapi-collectionmodify -mysql-xdevapi-collectionremove -mysql-xdevapi-columnresult -mysql-xdevapi-crudoperationbindable -mysql-xdevapi-crudoperationlimitable -mysql-xdevapi-crudoperationskippable -mysql-xdevapi-crudoperationsortable -mysql-xdevapi-databaseobject -mysql-xdevapi-docresult -mysql-xdevapi-exception -mysql-xdevapi-executable -mysql-xdevapi-executionstatus -mysql-xdevapi-expression -mysql-xdevapi-result -mysql-xdevapi-rowresult -mysql-xdevapi-schema -mysql-xdevapi-schemaobject -mysql-xdevapi-session -mysql-xdevapi-sqlstatement -mysql-xdevapi-sqlstatementresult -mysql-xdevapi-statement -mysql-xdevapi-table -mysql-xdevapi-tabledelete -mysql-xdevapi-tableinsert -mysql-xdevapi-tableselect -mysql-xdevapi-tableupdate -mysql-xdevapi-warning -mysql-xdevapi-xsession -norewinditerator -normalizer -numberformatter -oauth -oauthexception -oauthprovider -OCI-Collection -OCI-Lob -outeriterator -outofboundsexception -outofrangeexception -overflowexception -parallel-channel -parallel-events -parallel-events-event -parallel-events-event-type -parallel-events-input -parallel-future -parallel-runtime -parallel-sync -parentiterator -parle-errorinfo -parle-lexer -parle-lexerexception -parle-parser -parle-parserexception -parle-rlexer -parle-rparser -parle-stack -parle-token -parseerror -pdo -pdoexception -pdostatement -phar -phardata -pharexception -pharfileinfo -phdfs -php-user-filter -pht-atomicinteger -pht-hashtable -pht-queue -pht-runnable -pht-thread -pht-threaded -pht-vector -pool -quickhashinthash -quickhashintset -quickhashintstringhash -quickhashstringinthash -rangeexception -rararchive -rarentry -rarexception -recursivearrayiterator -recursivecachingiterator -recursivecallbackfilteriterator -recursivedirectoryiterator -recursivefilteriterator -recursiveiterator -recursiveiteratoriterator -recursiveregexiterator -recursivetreeiterator -reflection -reflectionclass -reflectionclassconstant -reflectionexception -reflectionextension -reflectionfunction -reflectionfunctionabstract -reflectiongenerator -reflectionmethod -reflectionnamedtype -reflectionobject -reflectionparameter -reflectionproperty -reflectiontype -reflectionzendextension -reflector -regexiterator -resourcebundle -rrdcreator -rrdgraph -rrdupdater -runtimeexception -seaslog -seekableiterator -serializable -sessionhandler -sessionhandlerinterface -sessionidinterface -sessionupdatetimestamphandlerinterface -simplexmlelement -simplexmliterator -snmp -snmpexception -soapclient -soapfault -soapheader -soapparam -soapserver -soapvar -solrclient -solrclientexception -solrcollapsefunction -solrdismaxquery -solrdocument -solrdocumentfield -solrexception -solrgenericresponse -solrillegalargumentexception -solrillegaloperationexception -solrinputdocument -solrmissingmandatoryparameterexception -solrmodifiableparams -solrobject -solrparams -solrpingresponse -solrquery -solrqueryresponse -solrresponse -solrserverexception -solrupdateresponse -solrutils -sphinxclient -splbool -spldoublylinkedlist -splenum -splfileinfo -splfileobject -splfixedarray -splfloat -splheap -splint -splmaxheap -splminheap -splobjectstorage -splobserver -splpriorityqueue -splqueue -splstack -splstring -splsubject -spltempfileobject -spltype -spoofchecker -sqlite3 -sqlite3result -sqlite3stmt -stdclass -stomp -stompexception -stompframe -streamwrapper -svm -svmmodel -swfaction -swfbitmap -swfbutton -swfdisplayitem -swffill -swffont -swffontchar -swfgradient -swfmorph -swfmovie -swfprebuiltclip -swfshape -swfsound -swfsoundinstance -swfsprite -swftext -swftextfield -swfvideostream -swoole-async -swoole-atomic -swoole-buffer -swoole-channel -swoole-client -swoole-connection-iterator -swoole-coroutine -swoole-event -swoole-exception -swoole-http-client -swoole-http-request -swoole-http-response -swoole-http-server -swoole-lock -swoole-mmap -swoole-mysql -swoole-mysql-exception -swoole-process -swoole-redis-server -swoole-serialize -swoole-server -swoole-table -swoole-timer -swoole-websocket-frame -swoole-websocket-server -syncevent -syncmutex -syncreaderwriter -syncsemaphore -syncsharedmemory -thread -threaded -throwable -tidy -tidynode -tokyotyrant -tokyotyrantexception -tokyotyrantiterator -tokyotyrantquery -tokyotyranttable -transliterator -traversable -typeerror -uconverter -ui-area -ui-control -ui-controls-box -ui-controls-button -ui-controls-check -ui-controls-colorbutton -ui-controls-combo -ui-controls-editablecombo -ui-controls-entry -ui-controls-form -ui-controls-grid -ui-controls-group -ui-controls-label -ui-controls-multilineentry -ui-controls-picker -ui-controls-progress -ui-controls-radio -ui-controls-separator -ui-controls-slider -ui-controls-spin -ui-controls-tab -ui-draw-brush -ui-draw-brush-gradient -ui-draw-brush-lineargradient -ui-draw-brush-radialgradient -ui-draw-color -ui-draw-line-cap -ui-draw-line-join -ui-draw-matrix -ui-draw-path -ui-draw-pen -ui-draw-stroke -ui-draw-text-font -ui-draw-text-font-descriptor -ui-draw-text-font-italic -ui-draw-text-font-stretch -ui-draw-text-font-weight -ui-draw-text-layout -ui-exception-invalidargumentexception -ui-exception-runtimeexception -ui-executor -ui-key -ui-menu -ui-menuitem -ui-point -ui-size -ui-window -underflowexception -unexpectedvalueexception -v8js -v8jsexception -variant -varnishadmin -varnishlog -varnishstat -volatile -vtiful-kernel-excel -vtiful-kernel-format -weakmap -weakref -weakreference -wkhtmltox-image-converter -wkhtmltox-pdf-converter -wkhtmltox-pdf-object -worker -xmldiff-base -xmldiff-dom -xmldiff-file -xmldiff-memory -xmlreader -xsltprocessor -yaconf -yaf-action-abstract -yaf-application -yaf-bootstrap-abstract -yaf-config-abstract -yaf-config-ini -yaf-config-simple -yaf-controller-abstract -yaf-dispatcher -yaf-exception -yaf-exception-dispatchfailed -yaf-exception-loadfailed -yaf-exception-loadfailed-action -yaf-exception-loadfailed-controller -yaf-exception-loadfailed-module -yaf-exception-loadfailed-view -yaf-exception-routerfailed -yaf-exception-startuperror -yaf-exception-typeerror -yaf-loader -yaf-plugin-abstract -yaf-registry -yaf-request-abstract -yaf-request-http -yaf-request-simple -yaf-response-abstract -yaf-route-interface -yaf-route-map -yaf-router -yaf-route-regex -yaf-route-rewrite -yaf-route-simple -yaf-route-static -yaf-route-supervar -yaf-session -yaf-view-interface -yaf-view-simple -yar-client -yar-client-exception -yar-concurrent-client -yar-server -yar-server-exception -ziparchive -zmq -zmqcontext -zmqdevice -zmqpoll -zmqsocket -zookeeper -zookeeperauthenticationexception -zookeeperconfig -zookeeperconnectionexception -zookeeperexception -zookeepermarshallingexception -zookeepernonodeexception -zookeeperoperationtimeoutexception -zookeepersessionexception diff --git a/api-php/php-functions.list b/api-php/php-functions.list deleted file mode 100644 index 0dbb44796..000000000 --- a/api-php/php-functions.list +++ /dev/null @@ -1,6490 +0,0 @@ -abs -acos -acosh -addcslashes -addslashes -aggregate -aggregate-info -aggregate-methods -aggregate-methods-by-list -aggregate-methods-by-regexp -aggregate-properties -aggregate-properties-by-list -aggregate-properties-by-regexp -aggregation-info -apache-child-terminate -apache-getenv -apache-get-modules -apache-get-version -apache-lookup-uri -apache-note -apache-request-headers -apache-reset-timeout -apache-response-headers -apache-setenv -apc-add -apc-bin-dump -apc-bin-dumpfile -apc-bin-load -apc-bin-loadfile -apc-cache-info -apc-cas -apc-clear-cache -apc-compile-file -apc-dec -apc-define-constants -apc-delete -apc-delete-file -apc-exists -apc-fetch -apc-inc -apc-load-constants -apc-sma-info -apc-store -apcu-add -apcu-cache-info -apcu-cas -apcu-clear-cache -apcu-dec -apcu-delete -apcu-entry -apcu-exists -apcu-fetch -apcu-inc -apcu-sma-info -apcu-store -apd-breakpoint -apd-callstack -apd-clunk -apd-continue -apd-croak -apd-dump-function-table -apd-dump-persistent-resources -apd-dump-regular-resources -apd-echo -apd-get-active-symbols -apd-set-pprof-trace -apd-set-session -apd-set-session-trace -apd-set-session-trace-socket -array -array-change-key-case -array-chunk -array-column -array-combine -array-count-values -array-diff -array-diff-assoc -array-diff-key -array-diff-uassoc -array-diff-ukey -array-fill -array-fill-keys -array-filter -array-flip -array-intersect -array-intersect-assoc -array-intersect-key -array-intersect-uassoc -array-intersect-ukey -array-key-exists -array-key-first -array-key-last -array-keys -array-map -array-merge -array-merge-recursive -array-multisort -array-pad -array-pop -array-product -array-push -array-rand -array-reduce -array-replace -array-replace-recursive -array-reverse -array-search -array-shift -array-slice -array-splice -array-sum -array-udiff -array-udiff-assoc -array-udiff-uassoc -array-uintersect -array-uintersect-assoc -array-uintersect-uassoc -array-unique -array-unshift -array-values -array-walk -array-walk-recursive -arsort -asin -asinh -asort -assert -assert-options -atan -atan2 -atanh -autoload -base64-decode -base64-encode -base-convert -basename -bbcode-add-element -bbcode-add-smiley -bbcode-create -bbcode-destroy -bbcode-parse -bbcode-set-arg-parser -bbcode-set-flags -bcadd -bccomp -bcdiv -bcmod -bcmul -bcompiler-load -bcompiler-load-exe -bcompiler-parse-class -bcompiler-read -bcompiler-write-class -bcompiler-write-constant -bcompiler-write-exe-footer -bcompiler-write-file -bcompiler-write-footer -bcompiler-write-function -bcompiler-write-functions-from-file -bcompiler-write-header -bcompiler-write-included-filename -bcpow -bcpowmod -bcscale -bcsqrt -bcsub -bin2hex -bindec -bindtextdomain -bind-textdomain-codeset -blenc-encrypt -boolval -bson-decode -bson-encode -bzclose -bzcompress -bzdecompress -bzerrno -bzerror -bzerrstr -bzflush -bzopen -bzread -bzwrite -cairo-append-path -cairo-arc -cairo-arc-negative -cairo-available-fonts -cairo-available-surfaces -cairo-clip -cairo-clip-extents -cairo-clip-preserve -cairo-clip-rectangle-list -cairo-close-path -cairo-copy-page -cairo-copy-path -cairo-copy-path-flat -cairo-create -cairo-curve-to -cairo-device-to-user -cairo-device-to-user-distance -cairo-fill -cairo-fill-extents -cairo-fill-preserve -cairo-font-extents -cairo-font-face-get-type -cairo-font-face-status -cairo-font-options-create -cairo-font-options-equal -cairo-font-options-get-antialias -cairo-font-options-get-hint-metrics -cairo-font-options-get-hint-style -cairo-font-options-get-subpixel-order -cairo-font-options-hash -cairo-font-options-merge -cairo-font-options-set-antialias -cairo-font-options-set-hint-metrics -cairo-font-options-set-hint-style -cairo-font-options-set-subpixel-order -cairo-font-options-status -cairo-format-stride-for-width -cairo-get-antialias -cairo-get-current-point -cairo-get-dash -cairo-get-dash-count -cairo-get-fill-rule -cairo-get-font-face -cairo-get-font-matrix -cairo-get-font-options -cairo-get-group-target -cairo-get-line-cap -cairo-get-line-join -cairo-get-line-width -cairo-get-matrix -cairo-get-miter-limit -cairo-get-operator -cairo-get-scaled-font -cairo-get-source -cairo-get-target -cairo-get-tolerance -cairo-glyph-path -cairo-has-current-point -cairo-identity-matrix -cairo-image-surface-create -cairo-image-surface-create-for-data -cairo-image-surface-create-from-png -cairo-image-surface-get-data -cairo-image-surface-get-format -cairo-image-surface-get-height -cairo-image-surface-get-stride -cairo-image-surface-get-width -cairo-in-fill -cairo-in-stroke -cairo-line-to -cairo-mask -cairo-mask-surface -cairo-matrix-create-scale -cairo-matrix-create-translate -cairo-matrix-init -cairo-matrix-init-identity -cairo-matrix-init-rotate -cairo-matrix-init-scale -cairo-matrix-init-translate -cairo-matrix-invert -cairo-matrix-multiply -cairo-matrix-rotate -cairo-matrix-scale -cairo-matrix-transform-distance -cairo-matrix-transform-point -cairo-matrix-translate -cairo-move-to -cairo-new-path -cairo-new-sub-path -cairo-paint -cairo-paint-with-alpha -cairo-path-extents -cairo-pattern-add-color-stop-rgb -cairo-pattern-add-color-stop-rgba -cairo-pattern-create-for-surface -cairo-pattern-create-linear -cairo-pattern-create-radial -cairo-pattern-create-rgb -cairo-pattern-create-rgba -cairo-pattern-get-color-stop-count -cairo-pattern-get-color-stop-rgba -cairo-pattern-get-extend -cairo-pattern-get-filter -cairo-pattern-get-linear-points -cairo-pattern-get-matrix -cairo-pattern-get-radial-circles -cairo-pattern-get-rgba -cairo-pattern-get-surface -cairo-pattern-get-type -cairo-pattern-set-extend -cairo-pattern-set-filter -cairo-pattern-set-matrix -cairo-pattern-status -cairo-pdf-surface-create -cairo-pdf-surface-set-size -cairo-pop-group -cairo-pop-group-to-source -cairo-ps-get-levels -cairo-ps-level-to-string -cairo-ps-surface-create -cairo-ps-surface-dsc-begin-page-setup -cairo-ps-surface-dsc-begin-setup -cairo-ps-surface-dsc-comment -cairo-ps-surface-get-eps -cairo-ps-surface-restrict-to-level -cairo-ps-surface-set-eps -cairo-ps-surface-set-size -cairo-push-group -cairo-push-group-with-content -cairo-rectangle -cairo-rel-curve-to -cairo-rel-line-to -cairo-rel-move-to -cairo-reset-clip -cairo-restore -cairo-rotate -cairo-save -cairo-scale -cairo-scaled-font-create -cairo-scaled-font-extents -cairo-scaled-font-get-ctm -cairo-scaled-font-get-font-face -cairo-scaled-font-get-font-matrix -cairo-scaled-font-get-font-options -cairo-scaled-font-get-scale-matrix -cairo-scaled-font-get-type -cairo-scaled-font-glyph-extents -cairo-scaled-font-status -cairo-scaled-font-text-extents -cairo-select-font-face -cairo-set-antialias -cairo-set-dash -cairo-set-fill-rule -cairo-set-font-face -cairo-set-font-matrix -cairo-set-font-options -cairo-set-font-size -cairo-set-line-cap -cairo-set-line-join -cairo-set-line-width -cairo-set-matrix -cairo-set-miter-limit -cairo-set-operator -cairo-set-scaled-font -cairo-set-source -cairo-set-source-surface -cairo-set-tolerance -cairo-show-page -cairo-show-text -cairo-status -cairo-status-to-string -cairo-stroke -cairo-stroke-extents -cairo-stroke-preserve -cairo-surface-copy-page -cairo-surface-create-similar -cairo-surface-finish -cairo-surface-flush -cairo-surface-get-content -cairo-surface-get-device-offset -cairo-surface-get-font-options -cairo-surface-get-type -cairo-surface-mark-dirty -cairo-surface-mark-dirty-rectangle -cairo-surface-set-device-offset -cairo-surface-set-fallback-resolution -cairo-surface-show-page -cairo-surface-status -cairo-surface-write-to-png -cairo-svg-surface-create -cairo-svg-surface-get-versions -cairo-svg-surface-restrict-to-version -cairo-svg-version-to-string -cairo-text-extents -cairo-text-path -cairo-transform -cairo-translate -cairo-user-to-device -cairo-user-to-device-distance -cairo-version -cairo-version-string -calculhmac -calcul-hmac -cal-days-in-month -cal-from-jd -cal-info -call-user-func -call-user-func-array -call-user-method -call-user-method-array -cal-to-jd -ceil -chdb-create -chdir -checkdate -checkdnsrr -chgrp -chmod -chop -chown -chr -chroot -chunk-split -class-alias -class-exists -class-implements -classkit-import -classkit-method-add -classkit-method-copy -classkit-method-redefine -classkit-method-remove -classkit-method-rename -class-parents -class-uses -cleardrawingwand -clearmagickwand -clearpixeliterator -clearpixelwand -clearstatcache -cli-get-process-title -cli-set-process-title -clonedrawingwand -clonemagickwand -clonepixelwand -closedir -closelog -collator-asort -collator-compare -collator-create -collator-get-attribute -collator-get-error-code -collator-get-error-message -collator-get-locale -collator-get-sort-key -collator-get-strength -collator-set-attribute -collator-set-strength -collator-sort -collator-sort-with-sort-keys -com-addref -com-create-guid -com-event-sink -com-get -com-get-active-object -com-invoke -com-isenum -com-load -com-load-typelib -com-message-pump -commonmark-parse -commonmark-render -commonmark-render-html -commonmark-render-latex -commonmark-render-man -commonmark-render-xml -compact -com-print-typeinfo -com-propget -com-propput -com-propset -com-release -com-set -connection-aborted -connection-status -connection-timeout -constant -convert-cyr-string -convert-uudecode -convert-uuencode -copy -cos -cosh -count -count-chars -counter-bump -counter-bump-value -counter-create -counter-get -counter-get-meta -counter-get-named -counter-get-value -counter-reset -counter-reset-value -crack-check -crack-closedict -crack-getlastmessage -crack-opendict -crc32 -create-function -crypt -ctype-alnum -ctype-alpha -ctype-cntrl -ctype-digit -ctype-graph -ctype-lower -ctype-print -ctype-punct -ctype-space -ctype-upper -ctype-xdigit -cubrid-affected-rows -cubrid-bind -cubrid-client-encoding -cubrid-close -cubrid-close-prepare -cubrid-close-request -cubrid-col-get -cubrid-col-size -cubrid-column-names -cubrid-column-types -cubrid-commit -cubrid-connect -cubrid-connect-with-url -cubrid-current-oid -cubrid-data-seek -cubrid-db-name -cubrid-disconnect -cubrid-drop -cubrid-errno -cubrid-error -cubrid-error-code -cubrid-error-code-facility -cubrid-error-msg -cubrid-execute -cubrid-fetch -cubrid-fetch-array -cubrid-fetch-assoc -cubrid-fetch-field -cubrid-fetch-lengths -cubrid-fetch-object -cubrid-fetch-row -cubrid-field-flags -cubrid-field-len -cubrid-field-name -cubrid-field-seek -cubrid-field-table -cubrid-field-type -cubrid-free-result -cubrid-get -cubrid-get-autocommit -cubrid-get-charset -cubrid-get-class-name -cubrid-get-client-info -cubrid-get-db-parameter -cubrid-get-query-timeout -cubrid-get-server-info -cubrid-insert-id -cubrid-is-instance -cubrid-list-dbs -cubrid-load-from-glo -cubrid-lob2-bind -cubrid-lob2-close -cubrid-lob2-export -cubrid-lob2-import -cubrid-lob2-new -cubrid-lob2-read -cubrid-lob2-seek -cubrid-lob2-seek64 -cubrid-lob2-size -cubrid-lob2-size64 -cubrid-lob2-tell -cubrid-lob2-tell64 -cubrid-lob2-write -cubrid-lob-close -cubrid-lob-export -cubrid-lob-get -cubrid-lob-send -cubrid-lob-size -cubrid-lock-read -cubrid-lock-write -cubrid-move-cursor -cubrid-new-glo -cubrid-next-result -cubrid-num-cols -cubrid-num-fields -cubrid-num-rows -cubrid-pconnect -cubrid-pconnect-with-url -cubrid-ping -cubrid-prepare -cubrid-put -cubrid-query -cubrid-real-escape-string -cubrid-result -cubrid-rollback -cubrid-save-to-glo -cubrid-schema -cubrid-send-glo -cubrid-seq-drop -cubrid-seq-insert -cubrid-seq-put -cubrid-set-add -cubrid-set-autocommit -cubrid-set-db-parameter -cubrid-set-drop -cubrid-set-query-timeout -cubrid-unbuffered-query -cubrid-version -curl-close -curl-copy-handle -curl-errno -curl-error -curl-escape -curl-exec -curl-file-create -curl-getinfo -curl-init -curl-multi-add-handle -curl-multi-close -curl-multi-errno -curl-multi-exec -curl-multi-getcontent -curl-multi-info-read -curl-multi-init -curl-multi-remove-handle -curl-multi-select -curl-multi-setopt -curl-multi-strerror -curl-pause -curl-reset -curl-setopt -curl-setopt-array -curl-share-close -curl-share-errno -curl-share-init -curl-share-setopt -curl-share-strerror -curl-strerror -curl-unescape -curl-version -current -cyrus-authenticate -cyrus-bind -cyrus-close -cyrus-connect -cyrus-query -cyrus-unbind -date -date-add -date-create -date-create-from-format -date-create-immutable -date-create-immutable-from-format -date-date-set -date-default-timezone-get -date-default-timezone-set -date-diff -datefmt-create -datefmt-format -datefmt-format-object -datefmt-get-calendar -datefmt-get-calendar-object -datefmt-get-datetype -datefmt-get-error-code -datefmt-get-error-message -datefmt-get-locale -datefmt-get-pattern -datefmt-get-timetype -datefmt-get-timezone -datefmt-get-timezone-id -datefmt-is-lenient -datefmt-localtime -datefmt-parse -datefmt-set-calendar -datefmt-set-lenient -datefmt-set-pattern -datefmt-set-timezone -datefmt-set-timezone-id -date-format -date-get-last-errors -date-interval-create-from-date-string -date-interval-format -date-isodate-set -date-modify -date-offset-get -date-parse -date-parse-from-format -date-sub -date-sun-info -date-sunrise -date-sunset -date-time-set -date-timestamp-get -date-timestamp-set -date-timezone-get -date-timezone-set -db2-autocommit -db2-bind-param -db2-client-info -db2-close -db2-column-privileges -db2-columns -db2-commit -db2-connect -db2-conn-error -db2-conn-errormsg -db2-cursor-type -db2-escape-string -db2-exec -db2-execute -db2-fetch-array -db2-fetch-assoc -db2-fetch-both -db2-fetch-object -db2-fetch-row -db2-field-display-size -db2-field-name -db2-field-num -db2-field-precision -db2-field-scale -db2-field-type -db2-field-width -db2-foreign-keys -db2-free-result -db2-free-stmt -db2-get-option -db2-last-insert-id -db2-lob-read -db2-next-result -db2-num-fields -db2-num-rows -db2-pclose -db2-pconnect -db2-prepare -db2-primary-keys -db2-procedure-columns -db2-procedures -db2-result -db2-rollback -db2-server-info -db2-set-option -db2-special-columns -db2-statistics -db2-stmt-error -db2-stmt-errormsg -db2-table-privileges -db2-tables -dba-close -dba-delete -dba-exists -dba-fetch -dba-firstkey -dba-handlers -dba-insert -dba-key-split -dba-list -dba-nextkey -dba-open -dba-optimize -dba-popen -dba-replace -dbase-add-record -dbase-close -dbase-create -dbase-delete-record -dbase-get-header-info -dbase-get-record -dbase-get-record-with-names -dbase-numfields -dbase-numrecords -dbase-open -dbase-pack -dbase-replace-record -dba-sync -dbplus-add -dbplus-aql -dbplus-chdir -dbplus-close -dbplus-curr -dbplus-errcode -dbplus-errno -dbplus-find -dbplus-first -dbplus-flush -dbplus-freealllocks -dbplus-freelock -dbplus-freerlocks -dbplus-getlock -dbplus-getunique -dbplus-info -dbplus-last -dbplus-lockrel -dbplus-next -dbplus-open -dbplus-prev -dbplus-rchperm -dbplus-rcreate -dbplus-rcrtexact -dbplus-rcrtlike -dbplus-resolve -dbplus-restorepos -dbplus-rkeys -dbplus-ropen -dbplus-rquery -dbplus-rrename -dbplus-rsecindex -dbplus-runlink -dbplus-rzap -dbplus-savepos -dbplus-setindex -dbplus-setindexbynumber -dbplus-sql -dbplus-tcl -dbplus-tremove -dbplus-undo -dbplus-undoprepare -dbplus-unlockrel -dbplus-unselect -dbplus-update -dbplus-xlockrel -dbplus-xunlockrel -dbx-close -dbx-compare -dbx-connect -dbx-error -dbx-escape-string -dbx-fetch-row -dbx-query -dbx-sort -dcgettext -dcngettext -deaggregate -debug-backtrace -debug-print-backtrace -debug-zval-dump -decbin -dechex -decoct -define -defined -define-syslog-variables -deflate-add -deflate-init -deg2rad -delete -destroydrawingwand -destroymagickwand -destroypixeliterator -destroypixelwand -destroypixelwandarray -destroypixelwands -dgettext -die -dio-close -dio-fcntl -dio-open -dio-read -dio-seek -dio-stat -dio-tcsetattr -dio-truncate -dio-write -dir -dirname -diskfreespace -disk-free-space -disk-total-space -dl -dngettext -dns-check-record -dns-get-mx -dns-get-record -domattribute-name -domattribute-set-value -domattribute-specified -domattribute-value -dom-attr-is-id -dom-characterdata-append-data -dom-characterdata-delete-data -dom-characterdata-insert-data -dom-characterdata-replace-data -dom-characterdata-substring-data -domdocument-add-root -dom-document-adopt-node -dom-document-create-attribute -domdocument-create-attribute -dom-document-create-attribute-ns -dom-document-create-cdatasection -domdocument-create-cdata-section -dom-document-create-comment -domdocument-create-comment -dom-document-create-document-fragment -dom-document-create-element -domdocument-create-element -dom-document-create-element-ns -domdocument-create-element-ns -dom-document-create-entity-reference -domdocument-create-entity-reference -dom-document-create-processing-instruction -domdocument-create-processing-instruction -dom-document-create-text-node -domdocument-create-text-node -domdocument-doctype -domdocument-document-element -domdocument-dump-file -domdocument-dump-mem -dom-document-get-element-by-id -domdocument-get-element-by-id -dom-document-get-elements-by-tag-name -domdocument-get-elements-by-tagname -dom-document-get-elements-by-tag-name-ns -domdocument-html-dump-mem -dom-document-import-node -dom-document-normalize-document -dom-document-relaxNG-validate-file -dom-document-relaxNG-validate-xml -dom-document-rename-node -dom-document-save -dom-document-save-html -dom-document-save-html-file -dom-document-savexml -dom-document-schema-validate-file -dom-document-schema-validate-xml -domdocumenttype-entities -domdocumenttype-internal-subset -domdocumenttype-name -domdocumenttype-notations -domdocumenttype-public-id -domdocumenttype-system-id -dom-document-validate -dom-document-xinclude -domdocument-xinclude -dom-domconfiguration-can-set-parameter -dom-domconfiguration-get-parameter -dom-domconfiguration-set-parameter -dom-domerrorhandler-handle-error -dom-domimplementationlist-item -dom-domimplementationsource-get-domimplementation -dom-domimplementationsource-get-domimplementations -dom-domstringlist-item -dom-element-get-attribute -domelement-get-attribute -dom-element-get-attribute-node -domelement-get-attribute-node -dom-element-get-attribute-node-ns -dom-element-get-attribute-ns -dom-element-get-elements-by-tag-name -domelement-get-elements-by-tagname -dom-element-get-elements-by-tag-name-ns -dom-element-has-attribute -domelement-has-attribute -dom-element-has-attribute-ns -dom-element-remove-attribute -domelement-remove-attribute -dom-element-remove-attribute-node -dom-element-remove-attribute-ns -dom-element-set-attribute -domelement-set-attribute -dom-element-set-attribute-node -domelement-set-attribute-node -dom-element-set-attribute-node-ns -dom-element-set-attribute-ns -dom-element-set-id-attribute -dom-element-set-id-attribute-node -dom-element-set-id-attribute-ns -domelement-tagname -dom-import-simplexml -dom-namednodemap-count -dom-namednodemap-get-named-item -dom-namednodemap-get-named-item-ns -dom-namednodemap-item -dom-namednodemap-remove-named-item -dom-namednodemap-remove-named-item-ns -dom-namednodemap-set-named-item -dom-namednodemap-set-named-item-ns -dom-namelist-get-name -dom-namelist-get-namespace-uri -domnode-add-namespace -dom-node-append-child -domnode-append-child -domnode-append-sibling -domnode-attributes -domnode-child-nodes -dom-node-clone-node -domnode-clone-node -dom-node-compare-document-position -domnode-dump-node -domnode-first-child -domnode-get-content -dom-node-get-feature -dom-node-get-user-data -dom-node-has-attributes -domnode-has-attributes -dom-node-has-child-nodes -domnode-has-child-nodes -dom-node-insert-before -domnode-insert-before -domnode-is-blank-node -dom-node-is-default-namespace -dom-node-is-equal-node -dom-node-is-same-node -dom-node-is-supported -domnode-last-child -dom-nodelist-count -dom-nodelist-item -dom-node-lookup-namespace-uri -dom-node-lookup-prefix -domnode-next-sibling -domnode-node-name -domnode-node-type -domnode-node-value -dom-node-normalize -domnode-owner-document -domnode-parent-node -domnode-prefix -domnode-previous-sibling -dom-node-remove-child -domnode-remove-child -dom-node-replace-child -domnode-replace-child -domnode-replace-node -domnode-set-content -domnode-set-name -domnode-set-namespace -dom-node-set-user-data -domnode-unlink-node -domprocessinginstruction-data -domprocessinginstruction-target -dom-string-extend-find-offset16 -dom-string-extend-find-offset32 -dom-text-is-whitespace-in-element-content -dom-text-replace-whole-text -dom-text-split-text -dom-userdatahandler-handle -domxml-new-doc -domxml-open-file -domxml-open-mem -domxml-version -domxml-xmltree -domxml-xslt-stylesheet -domxml-xslt-stylesheet-doc -domxml-xslt-stylesheet-file -domxml-xslt-version -dom-xpath-evaluate -dom-xpath-query -dom-xpath-register-ns -dom-xpath-register-php-functions -domxsltstylesheet-process -domxsltstylesheet-result-dump-file -domxsltstylesheet-result-dump-mem -dotnet-load -doubleval -drawaffine -drawannotation -drawarc -drawbezier -drawcircle -drawcolor -drawcomment -drawcomposite -drawellipse -drawgetclippath -drawgetcliprule -drawgetclipunits -drawgetexception -drawgetexceptionstring -drawgetexceptiontype -drawgetfillalpha -drawgetfillcolor -drawgetfillopacity -drawgetfillrule -drawgetfont -drawgetfontfamily -drawgetfontsize -drawgetfontstretch -drawgetfontstyle -drawgetfontweight -drawgetgravity -drawgetstrokealpha -drawgetstrokeantialias -drawgetstrokecolor -drawgetstrokedasharray -drawgetstrokedashoffset -drawgetstrokelinecap -drawgetstrokelinejoin -drawgetstrokemiterlimit -drawgetstrokeopacity -drawgetstrokewidth -drawgettextalignment -drawgettextantialias -drawgettextdecoration -drawgettextencoding -drawgettextundercolor -drawgetvectorgraphics -drawline -drawmatte -drawpathclose -drawpathcurvetoabsolute -drawpathcurvetoquadraticbezierabsolute -drawpathcurvetoquadraticbezierrelative -drawpathcurvetoquadraticbeziersmoothabsolute -drawpathcurvetoquadraticbeziersmoothrelative -drawpathcurvetorelative -drawpathcurvetosmoothabsolute -drawpathcurvetosmoothrelative -drawpathellipticarcabsolute -drawpathellipticarcrelative -drawpathfinish -drawpathlinetoabsolute -drawpathlinetohorizontalabsolute -drawpathlinetohorizontalrelative -drawpathlinetorelative -drawpathlinetoverticalabsolute -drawpathlinetoverticalrelative -drawpathmovetoabsolute -drawpathmovetorelative -drawpathstart -drawpoint -drawpolygon -drawpolyline -drawpopclippath -drawpopdefs -drawpoppattern -drawpushclippath -drawpushdefs -drawpushpattern -drawrectangle -drawrender -drawrotate -drawroundrectangle -drawscale -drawsetclippath -drawsetcliprule -drawsetclipunits -drawsetfillalpha -drawsetfillcolor -drawsetfillopacity -drawsetfillpatternurl -drawsetfillrule -drawsetfont -drawsetfontfamily -drawsetfontsize -drawsetfontstretch -drawsetfontstyle -drawsetfontweight -drawsetgravity -drawsetstrokealpha -drawsetstrokeantialias -drawsetstrokecolor -drawsetstrokedasharray -drawsetstrokedashoffset -drawsetstrokelinecap -drawsetstrokelinejoin -drawsetstrokemiterlimit -drawsetstrokeopacity -drawsetstrokepatternurl -drawsetstrokewidth -drawsettextalignment -drawsettextantialias -drawsettextdecoration -drawsettextencoding -drawsettextundercolor -drawsetvectorgraphics -drawsetviewbox -drawskewx -drawskewy -drawtranslate -each -easter-date -easter-days -echo -eio-busy -eio-cancel -eio-chmod -eio-chown -eio-close -eio-custom -eio-dup2 -eio-event-loop -eio-fallocate -eio-fchmod -eio-fchown -eio-fdatasync -eio-fstat -eio-fstatvfs -eio-fsync -eio-ftruncate -eio-futime -eio-get-event-stream -eio-get-last-error -eio-grp -eio-grp-add -eio-grp-cancel -eio-grp-limit -eio-init -eio-link -eio-lstat -eio-mkdir -eio-mknod -eio-nop -eio-npending -eio-nready -eio-nreqs -eio-nthreads -eio-open -eio-poll -eio-read -eio-readahead -eio-readdir -eio-readlink -eio-realpath -eio-rename -eio-rmdir -eio-seek -eio-sendfile -eio-set-max-idle -eio-set-max-parallel -eio-set-max-poll-reqs -eio-set-max-poll-time -eio-set-min-parallel -eio-stat -eio-statvfs -eio-symlink -eio-sync -eio-sync-file-range -eio-syncfs -eio-truncate -eio-unlink -eio-utime -eio-write -empty -enchant-broker-describe -enchant-broker-dict-exists -enchant-broker-free -enchant-broker-free-dict -enchant-broker-get-dict-path -enchant-broker-get-error -enchant-broker-init -enchant-broker-list-dicts -enchant-broker-request-dict -enchant-broker-request-pwl-dict -enchant-broker-set-dict-path -enchant-broker-set-ordering -enchant-dict-add-to-personal -enchant-dict-add-to-session -enchant-dict-check -enchant-dict-describe -enchant-dict-get-error -enchant-dict-is-in-session -enchant-dict-quick-check -enchant-dict-store-replacement -enchant-dict-suggest -end -ereg -eregi -eregi-replace -ereg-replace -error-clear-last -error-get-last -error-log -error-reporting -escapeshellarg -escapeshellcmd -eval -event-add -event-base-free -event-base-loop -event-base-loopbreak -event-base-loopexit -event-base-new -event-base-priority-init -event-base-reinit -event-base-set -event-buffer-base-set -event-buffer-disable -event-buffer-enable -event-buffer-fd-set -event-buffer-free -event-buffer-new -event-buffer-priority-set -event-buffer-read -event-buffer-set-callback -event-buffer-timeout-set -event-buffer-watermark-set -event-buffer-write -event-del -event-free -event-new -event-priority-set -event-set -event-timer-add -event-timer-del -event-timer-new -event-timer-set -exec -exif-imagetype -exif-read-data -exif-tagname -exif-thumbnail -exit -exp -expect-expectl -expect-popen -explode -expm1 -expression -extension-loaded -extract -ezmlm-hash -fam-cancel-monitor -fam-close -fam-monitor-collection -fam-monitor-directory -fam-monitor-file -fam-next-event -fam-open -fam-pending -fam-resume-monitor -fam-suspend-monitor -fann-cascadetrain-on-data -fann-cascadetrain-on-file -fann-clear-scaling-params -fann-copy -fann-create-from-file -fann-create-shortcut -fann-create-shortcut-array -fann-create-sparse -fann-create-sparse-array -fann-create-standard -fann-create-standard-array -fann-create-train -fann-create-train-from-callback -fann-descale-input -fann-descale-output -fann-descale-train -fann-destroy -fann-destroy-train -fann-duplicate-train-data -fann-get-activation-function -fann-get-activation-steepness -fann-get-bias-array -fann-get-bit-fail -fann-get-bit-fail-limit -fann-get-cascade-activation-functions -fann-get-cascade-activation-functions-count -fann-get-cascade-activation-steepnesses -fann-get-cascade-activation-steepnesses-count -fann-get-cascade-candidate-change-fraction -fann-get-cascade-candidate-limit -fann-get-cascade-candidate-stagnation-epochs -fann-get-cascade-max-cand-epochs -fann-get-cascade-max-out-epochs -fann-get-cascade-min-cand-epochs -fann-get-cascade-min-out-epochs -fann-get-cascade-num-candidate-groups -fann-get-cascade-num-candidates -fann-get-cascade-output-change-fraction -fann-get-cascade-output-stagnation-epochs -fann-get-cascade-weight-multiplier -fann-get-connection-array -fann-get-connection-rate -fann-get-errno -fann-get-errstr -fann-get-layer-array -fann-get-learning-momentum -fann-get-learning-rate -fann-get-mse -fann-get-MSE -fann-get-network-type -fann-get-num-input -fann-get-num-layers -fann-get-num-output -fann-get-quickprop-decay -fann-get-quickprop-mu -fann-get-rprop-decrease-factor -fann-get-rprop-delta-max -fann-get-rprop-delta-min -fann-get-rprop-delta-zero -fann-get-rprop-increase-factor -fann-get-sarprop-step-error-shift -fann-get-sarprop-step-error-threshold-factor -fann-get-sarprop-temperature -fann-get-sarprop-weight-decay-shift -fann-get-total-connections -fann-get-total-neurons -fann-get-train-error-function -fann-get-training-algorithm -fann-get-train-stop-function -fann-init-weights -fann-length-train-data -fann-merge-train-data -fann-num-input-train-data -fann-num-output-train-data -fann-print-error -fann-randomize-weights -fann-read-train-from-file -fann-reset-errno -fann-reset-errstr -fann-reset-mse -fann-reset-MSE -fann-run -fann-save -fann-save-train -fann-scale-input -fann-scale-input-train-data -fann-scale-output -fann-scale-output-train-data -fann-scale-train -fann-scale-train-data -fann-set-activation-function -fann-set-activation-function-hidden -fann-set-activation-function-layer -fann-set-activation-function-output -fann-set-activation-steepness -fann-set-activation-steepness-hidden -fann-set-activation-steepness-layer -fann-set-activation-steepness-output -fann-set-bit-fail-limit -fann-set-callback -fann-set-cascade-activation-functions -fann-set-cascade-activation-steepnesses -fann-set-cascade-candidate-change-fraction -fann-set-cascade-candidate-limit -fann-set-cascade-candidate-stagnation-epochs -fann-set-cascade-max-cand-epochs -fann-set-cascade-max-out-epochs -fann-set-cascade-min-cand-epochs -fann-set-cascade-min-out-epochs -fann-set-cascade-num-candidate-groups -fann-set-cascade-output-change-fraction -fann-set-cascade-output-stagnation-epochs -fann-set-cascade-weight-multiplier -fann-set-error-log -fann-set-input-scaling-params -fann-set-learning-momentum -fann-set-learning-rate -fann-set-output-scaling-params -fann-set-quickprop-decay -fann-set-quickprop-mu -fann-set-rprop-decrease-factor -fann-set-rprop-delta-max -fann-set-rprop-delta-min -fann-set-rprop-delta-zero -fann-set-rprop-increase-factor -fann-set-sarprop-step-error-shift -fann-set-sarprop-step-error-threshold-factor -fann-set-sarprop-temperature -fann-set-sarprop-weight-decay-shift -fann-set-scaling-params -fann-set-train-error-function -fann-set-training-algorithm -fann-set-train-stop-function -fann-set-weight -fann-set-weight-array -fann-shuffle-train-data -fann-subset-train-data -fann-test -fann-test-data -fann-train -fann-train-epoch -fann-train-on-data -fann-train-on-file -fastcgi-finish-request -fbird-add-user -fbird-affected-rows -fbird-backup -fbird-blob-add -fbird-blob-cancel -fbird-blob-close -fbird-blob-create -fbird-blob-echo -fbird-blob-get -fbird-blob-import -fbird-blob-info -fbird-blob-open -fbird-close -fbird-commit -fbird-commit-ret -fbird-connect -fbird-db-info -fbird-delete-user -fbird-drop-db -fbird-errcode -fbird-errmsg -fbird-execute -fbird-fetch-assoc -fbird-fetch-object -fbird-fetch-row -fbird-field-info -fbird-free-event-handler -fbird-free-query -fbird-free-result -fbird-gen-id -fbird-maintain-db -fbird-modify-user -fbird-name-result -fbird-num-fields -fbird-num-params -fbird-param-info -fbird-pconnect -fbird-prepare -fbird-query -fbird-restore -fbird-rollback -fbird-rollback-ret -fbird-server-info -fbird-service-attach -fbird-service-detach -fbird-set-event-handler -fbird-trans -fbird-wait-event -fbsql-affected-rows -fbsql-autocommit -fbsql-blob-size -fbsql-change-user -fbsql-clob-size -fbsql-close -fbsql-commit -fbsql-connect -fbsql-create-blob -fbsql-create-clob -fbsql-create-db -fbsql-database -fbsql-database-password -fbsql-data-seek -fbsql-db-query -fbsql-db-status -fbsql-drop-db -fbsql-errno -fbsql-error -fbsql-fetch-array -fbsql-fetch-assoc -fbsql-fetch-field -fbsql-fetch-lengths -fbsql-fetch-object -fbsql-fetch-row -fbsql-field-flags -fbsql-field-len -fbsql-field-name -fbsql-field-seek -fbsql-field-table -fbsql-field-type -fbsql-free-result -fbsql-get-autostart-info -fbsql-hostname -fbsql-insert-id -fbsql-list-dbs -fbsql-list-fields -fbsql-list-tables -fbsql-next-result -fbsql-num-fields -fbsql-num-rows -fbsql-password -fbsql-pconnect -fbsql-query -fbsql-read-blob -fbsql-read-clob -fbsql-result -fbsql-rollback -fbsql-rows-fetched -fbsql-select-db -fbsql-set-characterset -fbsql-set-lob-mode -fbsql-set-password -fbsql-set-transaction -fbsql-start-db -fbsql-stop-db -fbsql-tablename -fbsql-table-name -fbsql-username -fbsql-warnings -fclose -fdf-add-doc-javascript -fdf-add-template -fdf-close -fdf-create -fdf-enum-values -fdf-errno -fdf-error -fdf-get-ap -fdf-get-attachment -fdf-get-encoding -fdf-get-file -fdf-get-flags -fdf-get-opt -fdf-get-status -fdf-get-value -fdf-get-version -fdf-header -fdf-next-field-name -fdf-open -fdf-open-string -fdf-remove-item -fdf-save -fdf-save-string -fdf-set-ap -fdf-set-encoding -fdf-set-file -fdf-set-flags -fdf-set-javascript-action -fdf-set-on-import-javascript -fdf-set-opt -fdf-set-status -fdf-set-submit-form-action -fdf-set-target-frame -fdf-set-value -fdf-set-version -feof -fflush -fgetc -fgetcsv -fgets -fgetss -file -fileatime -filectime -file-exists -file-get-contents -filegroup -fileinode -filemtime -fileowner -fileperms -filepro -filepro-fieldcount -filepro-fieldname -filepro-fieldtype -filepro-fieldwidth -filepro-retrieve -filepro-rowcount -file-put-contents -filesize -filetype -filter-has-var -filter-id -filter-input -filter-input-array -filter-list -filter-var -filter-var-array -finfo-buffer -finfo-close -finfo-file -finfo-open -finfo-set-flags -floatval -flock -floor -flush -fmod -fnmatch -fopen -forward-static-call -forward-static-call-array -fpassthru -fprintf -fputcsv -fputs -fread -frenchtojd -fribidi-log2vis -fscanf -fseek -fsockopen -fstat -ftell -ftok -ftp-alloc -ftp-append -ftp-cdup -ftp-chdir -ftp-chmod -ftp-close -ftp-connect -ftp-delete -ftp-exec -ftp-fget -ftp-fput -ftp-get -ftp-get-option -ftp-login -ftp-mdtm -ftp-mkdir -ftp-mlsd -ftp-nb-continue -ftp-nb-fget -ftp-nb-fput -ftp-nb-get -ftp-nb-put -ftp-nlist -ftp-pasv -ftp-put -ftp-pwd -ftp-quit -ftp-raw -ftp-rawlist -ftp-rename -ftp-rmdir -ftp-set-option -ftp-site -ftp-size -ftp-ssl-connect -ftp-systype -ftruncate -func-get-arg -func-get-args -func-num-args -function-exists -fwrite -gc-collect-cycles -gc-disable -gc-enable -gc-enabled -gc-mem-caches -gc-status -gd-info -gearman-job-handle -gearman-job-status -geoip-asnum-by-name -geoip-continent-code-by-name -geoip-country-code3-by-name -geoip-country-code-by-name -geoip-country-name-by-name -geoip-database-info -geoip-db-avail -geoip-db-filename -geoip-db-get-all-info -geoip-domain-by-name -geoip-id-by-name -geoip-isp-by-name -geoip-netspeedcell-by-name -geoip-org-by-name -geoip-record-by-name -geoip-region-by-name -geoip-region-name-by-code -geoip-setup-custom-directory -geoip-time-zone-by-country-and-region -getallheaders -get-browser -get-called-class -get-cfg-var -get-class -get-class-methods -get-class-vars -get-current-user -getcwd -getdate -get-declared-classes -get-declared-interfaces -get-declared-traits -get-defined-constants -get-defined-functions -get-defined-vars -getenv -get-extension-funcs -get-headers -gethostbyaddr -gethostbyname -gethostbynamel -gethostname -get-html-translation-table -getimagesize -getimagesizefromstring -get-included-files -get-include-path -getlastmod -get-loaded-extensions -get-magic-quotes-gpc -get-magic-quotes-runtime -get-meta-tags -getmxrr -getmygid -getmyinode -getmypid -getmyuid -get-object-vars -getopt -get-parent-class -getprotobyname -getprotobynumber -getrandmax -get-required-files -get-resources -get-resource-type -getrusage -getservbyname -getservbyport -getSession -gettext -gettimeofday -gettype -glob -gmdate -gmmktime -gmp-abs -gmp-add -gmp-and -gmp-binomial -gmp-clrbit -gmp-cmp -gmp-com -gmp-div -gmp-divexact -gmp-div-q -gmp-div-qr -gmp-div-r -gmp-export -gmp-fact -gmp-gcd -gmp-gcdext -gmp-hamdist -gmp-import -gmp-init -gmp-intval -gmp-invert -gmp-jacobi -gmp-kronecker -gmp-lcm -gmp-legendre -gmp-mod -gmp-mul -gmp-neg -gmp-nextprime -gmp-or -gmp-perfect-power -gmp-perfect-square -gmp-popcount -gmp-pow -gmp-powm -gmp-prob-prime -gmp-random -gmp-random-bits -gmp-random-range -gmp-random-seed -gmp-root -gmp-rootrem -gmp-scan0 -gmp-scan1 -gmp-setbit -gmp-sign -gmp-sqrt -gmp-sqrtrem -gmp-strval -gmp-sub -gmp-testbit -gmp-xor -gmstrftime -gnupg-adddecryptkey -gnupg-addencryptkey -gnupg-addsignkey -gnupg-cleardecryptkeys -gnupg-clearencryptkeys -gnupg-clearsignkeys -gnupg-decrypt -gnupg-decryptverify -gnupg-encrypt -gnupg-encryptsign -gnupg-export -gnupg-geterror -gnupg-getprotocol -gnupg-import -gnupg-init -gnupg-keyinfo -gnupg-setarmor -gnupg-seterrormode -gnupg-setsignmode -gnupg-sign -gnupg-verify -gopher-parsedir -grapheme-extract -grapheme-stripos -grapheme-stristr -grapheme-strlen -grapheme-strpos -grapheme-strripos -grapheme-strrpos -grapheme-strstr -grapheme-substr -gregoriantojd -gupnp-context-get-host-ip -gupnp-context-get-port -gupnp-context-get-subscription-timeout -gupnp-context-host-path -gupnp-context-new -gupnp-context-set-subscription-timeout -gupnp-context-timeout-add -gupnp-context-unhost-path -gupnp-control-point-browse-start -gupnp-control-point-browse-stop -gupnp-control-point-callback-set -gupnp-control-point-new -gupnp-device-action-callback-set -gupnp-device-info-get -gupnp-device-info-get-service -gupnp-root-device-get-available -gupnp-root-device-get-relative-location -gupnp-root-device-new -gupnp-root-device-set-available -gupnp-root-device-start -gupnp-root-device-stop -gupnp-service-action-get -gupnp-service-action-return -gupnp-service-action-return-error -gupnp-service-action-set -gupnp-service-freeze-notify -gupnp-service-info-get -gupnp-service-info-get-introspection -gupnp-service-introspection-get-state-variable -gupnp-service-notify -gupnp-service-proxy-action-get -gupnp-service-proxy-action-set -gupnp-service-proxy-add-notify -gupnp-service-proxy-callback-set -gupnp-service-proxy-get-subscribed -gupnp-service-proxy-remove-notify -gupnp-service-proxy-send-action -gupnp-service-proxy-set-subscribed -gupnp-service-thaw-notify -gzclose -gzcompress -gzdecode -gzdeflate -gzencode -gzeof -gzfile -gzgetc -gzgets -gzgetss -gzinflate -gzopen -gzpassthru -gzputs -gzread -gzrewind -gzseek -gztell -gzuncompress -gzwrite -halt-compiler -hash -hash-algos -hash-copy -hash-equals -hash-file -hash-final -hash-hkdf -hash-hmac -hash-hmac-algos -hash-hmac-file -hash-init -hash-pbkdf2 -hash-update -hash-update-file -hash-update-stream -header -header-register-callback -header-remove -headers-list -headers-sent -hebrev -hebrevc -hex2bin -hexdec -highlight-file -highlight-string -hrtime -htmlentities -html-entity-decode -htmlspecialchars -htmlspecialchars-decode -http-build-cookie -http-build-query -http-build-str -http-build-url -http-cache-etag -http-cache-last-modified -http-chunked-decode -http-date -http-deflate -http-get -http-get-request-body -http-get-request-body-stream -http-get-request-headers -http-head -http-inflate -http-match-etag -http-match-modified -http-match-request-header -http-negotiate-charset -http-negotiate-content-type -http-negotiate-language -http-parse-cookie -http-parse-headers -http-parse-message -http-parse-params -http-persistent-handles-clean -http-persistent-handles-count -http-persistent-handles-ident -http-post-data -http-post-fields -http-put-data -http-put-file -http-put-stream -http-redirect -http-request -http-request-body-encode -http-request-method-exists -http-request-method-name -http-request-method-register -http-request-method-unregister -http-response-code -http-send-content-disposition -http-send-content-type -http-send-data -http-send-file -http-send-last-modified -http-send-status -http-send-stream -http-support -http-throttle -hwapi-attribute-new -hwapi-content-new -hwapi-hgcsp -hwapi-object-new -hw-array2objrec -hw-changeobject -hw-children -hw-childrenobj -hw-close -hw-connect -hw-connection-info -hw-cp -hw-deleteobject -hw-docbyanchor -hw-docbyanchorobj -hw-document-attributes -hw-document-bodytag -hw-document-content -hw-document-setcontent -hw-document-size -hw-dummy -hw-edittext -hw-error -hw-errormsg -hw-free-document -hw-getanchors -hw-getanchorsobj -hw-getandlock -hw-getchildcoll -hw-getchildcollobj -hw-getchilddoccoll -hw-getchilddoccollobj -hw-getobject -hw-getobjectbyquery -hw-getobjectbyquerycoll -hw-getobjectbyquerycollobj -hw-getobjectbyqueryobj -hw-getparents -hw-getparentsobj -hw-getrellink -hw-getremote -hw-getremotechildren -hw-getsrcbydestobj -hw-gettext -hw-getusername -hw-identify -hw-incollections -hw-info -hw-inscoll -hw-insdoc -hw-insertanchors -hw-insertdocument -hw-insertobject -hw-mapid -hw-modifyobject -hw-mv -hw-new-document -hw-objrec2array -hw-output-document -hw-pconnect -hw-pipedocument -hw-root -hw-setlinkroot -hw-stat -hw-unlock -hw-who -hypot -i18n-loc-get-default -i18n-loc-get-error-code -i18n-loc-set-attribute -i18n-loc-set-default -i18n-loc-set-strength -ibase-add-user -ibase-affected-rows -ibase-backup -ibase-blob-add -ibase-blob-cancel -ibase-blob-close -ibase-blob-create -ibase-blob-echo -ibase-blob-get -ibase-blob-import -ibase-blob-info -ibase-blob-open -ibase-close -ibase-commit -ibase-commit-ret -ibase-connect -ibase-db-info -ibase-delete-user -ibase-drop-db -ibase-errcode -ibase-errmsg -ibase-execute -ibase-fetch-assoc -ibase-fetch-object -ibase-fetch-row -ibase-field-info -ibase-free-event-handler -ibase-free-query -ibase-free-result -ibase-gen-id -ibase-maintain-db -ibase-modify-user -ibase-name-result -ibase-num-fields -ibase-num-params -ibase-param-info -ibase-pconnect -ibase-prepare -ibase-query -ibase-restore -ibase-rollback -ibase-rollback-ret -ibase-server-info -ibase-service-attach -ibase-service-detach -ibase-set-event-handler -ibase-timefmt -ibase-trans -ibase-wait-event -iconv -iconv-get-encoding -iconv-mime-decode -iconv-mime-decode-headers -iconv-mime-encode -iconv-set-encoding -iconv-strlen -iconv-strpos -iconv-strrpos -iconv-substr -id3-get-frame-long-name -id3-get-frame-short-name -id3-get-genre-id -id3-get-genre-list -id3-get-genre-name -id3-get-tag -id3-get-version -id3-remove-tag -id3-set-tag -idate -idn-to-ascii -idn-to-unicode -idn-to-utf8 -ifx-affected-rows -ifx-blobinfile-mode -ifx-byteasvarchar -ifx-close -ifx-connect -ifx-copy-blob -ifx-create-blob -ifx-create-char -ifx-do -ifx-error -ifx-errormsg -ifx-fetch-row -ifx-fieldproperties -ifx-fieldtypes -ifx-free-blob -ifx-free-char -ifx-free-result -ifx-get-blob -ifx-get-char -ifx-getsqlca -ifx-htmltbl-result -ifx-nullformat -ifx-num-fields -ifx-num-rows -ifx-pconnect -ifx-prepare -ifx-query -ifx-textasvarchar -ifx-update-blob -ifx-update-char -ifxus-close-slob -ifxus-create-slob -ifxus-free-slob -ifxus-open-slob -ifxus-read-slob -ifxus-seek-slob -ifxus-tell-slob -ifxus-write-slob -ignore-user-abort -iis-add-server -iis-get-dir-security -iis-get-script-map -iis-get-server-by-comment -iis-get-server-by-path -iis-get-server-rights -iis-get-service-state -iis-remove-server -iis-set-app-settings -iis-set-dir-security -iis-set-script-map -iis-set-server-rights -iis-start-server -iis-start-service -iis-stop-server -iis-stop-service -image2wbmp -imageaffine -imageaffinematrixconcat -imageaffinematrixget -imagealphablending -imageantialias -imagearc -imagebmp -imagechar -imagecharup -imagecolorallocate -imagecolorallocatealpha -imagecolorat -imagecolorclosest -imagecolorclosestalpha -imagecolorclosesthwb -imagecolordeallocate -imagecolorexact -imagecolorexactalpha -imagecolormatch -imagecolorresolve -imagecolorresolvealpha -imagecolorset -imagecolorsforindex -imagecolorstotal -imagecolortransparent -imageconvolution -imagecopy -imagecopymerge -imagecopymergegray -imagecopyresampled -imagecopyresized -imagecreate -imagecreatefrombmp -imagecreatefromgd -imagecreatefromgd2 -imagecreatefromgd2part -imagecreatefromgif -imagecreatefromjpeg -imagecreatefrompng -imagecreatefromstring -imagecreatefromwbmp -imagecreatefromwebp -imagecreatefromxbm -imagecreatefromxpm -imagecreatetruecolor -imagecrop -imagecropauto -imagedashedline -imagedestroy -imageellipse -imagefill -imagefilledarc -imagefilledellipse -imagefilledpolygon -imagefilledrectangle -imagefilltoborder -imagefilter -imageflip -imagefontheight -imagefontwidth -imageftbbox -imagefttext -imagegammacorrect -imagegd -imagegd2 -imagegetclip -imagegif -imagegrabscreen -imagegrabwindow -imageinterlace -imageistruecolor -imagejpeg -imagelayereffect -imageline -imageloadfont -imageopenpolygon -imagepalettecopy -imagepalettetotruecolor -imagepng -imagepolygon -imagepsbbox -imagepsencodefont -imagepsextendfont -imagepsfreefont -imagepsloadfont -imagepsslantfont -imagepstext -imagerectangle -imageresolution -imagerotate -imagesavealpha -imagescale -imagesetbrush -imagesetclip -imagesetinterpolation -imagesetpixel -imagesetstyle -imagesetthickness -imagesettile -imagestring -imagestringup -imagesx -imagesy -imagetruecolortopalette -imagettfbbox -imagettftext -imagetypes -image-type-to-extension -image-type-to-mime-type -imagewbmp -imagewebp -imagexbm -imap-8bit -imap-alerts -imap-append -imap-base64 -imap-binary -imap-body -imap-bodystruct -imap-check -imap-clearflag-full -imap-close -imap-create -imap-createmailbox -imap-delete -imap-deletemailbox -imap-errors -imap-expunge -imap-fetchbody -imap-fetchheader -imap-fetchmime -imap-fetch-overview -imap-fetchstructure -imap-fetchtext -imap-gc -imap-getacl -imap-getmailboxes -imap-get-quota -imap-get-quotaroot -imap-getsubscribed -imap-header -imap-headerinfo -imap-headers -imap-last-error -imap-list -imap-listmailbox -imap-listscan -imap-listsubscribed -imap-lsub -imap-mail -imap-mailboxmsginfo -imap-mail-compose -imap-mail-copy -imap-mail-move -imap-mime-header-decode -imap-msgno -imap-mutf7-to-utf8 -imap-num-msg -imap-num-recent -imap-open -imap-ping -imap-qprint -imap-rename -imap-renamemailbox -imap-reopen -imap-rfc822-parse-adrlist -imap-rfc822-parse-headers -imap-rfc822-write-address -imap-savebody -imap-scan -imap-scanmailbox -imap-search -imap-setacl -imap-setflag-full -imap-set-quota -imap-sort -imap-status -imap-subscribe -imap-thread -imap-timeout -imap-uid -imap-undelete -imap-unsubscribe -imap-utf7-decode -imap-utf7-encode -imap-utf8 -imap-utf8-to-mutf7 -implode -import-request-variables -in-array -include -include-once -inclued-get-data -inet-ntop -inet-pton -inflate-add -inflate-get-read-len -inflate-get-status -inflate-init -ingres-autocommit -ingres-autocommit-state -ingres-charset -ingres-close -ingres-commit -ingres-connect -ingres-cursor -ingres-errno -ingres-error -ingres-errsqlstate -ingres-escape-string -ingres-execute -ingres-fetch-array -ingres-fetch-assoc -ingres-fetch-object -ingres-fetch-proc-return -ingres-fetch-row -ingres-field-length -ingres-field-name -ingres-field-nullable -ingres-field-precision -ingres-field-scale -ingres-field-type -ingres-free-result -ingres-next-error -ingres-num-fields -ingres-num-rows -ingres-pconnect -ingres-prepare -ingres-query -ingres-result-seek -ingres-rollback -ingres-set-environment -ingres-unbuffered-query -ini-alter -ini-get -ini-get-all -ini-restore -ini-set -inotify-add-watch -inotify-init -inotify-queue-len -inotify-read -inotify-rm-watch -intdiv -interface-exists -intlcal-add -intlcal-after -intlcal-before -intlcal-clear -intlcal-create-instance -intlcal-equals -intlcal-field-difference -intlcal-from-date-time -intlcal-get -intlcal-get-actual-maximum -intlcal-get-actual-minimum -intlcal-get-available-locales -intlcal-get-day-of-week-type -intlcal-get-error-code -intlcal-get-error-message -intlcal-get-first-day-of-week -intlcal-get-greatest-minimum -intlcal-get-keyword-values-for-locale -intlcal-get-least-maximum -intlcal-get-locale -intlcal-get-maximum -intlcal-get-minimal-days-in-first-week -intlcal-get-minimum -intlcal-get-now -intlcal-get-repeated-wall-time-option -intlcal-get-skipped-wall-time-option -intlcal-get-time -intlcal-get-time-zone -intlcal-get-type -intlcal-get-weekend-transition -intlcal-in-daylight-time -intlcal-is-equivalent-to -intlcal-is-lenient -intlcal-is-set -intlcal-is-weekend -intlcal-roll -intlcal-set -intlcal-set-first-day-of-week -intlcal-set-lenient -intlcal-set-minimal-days-in-first-week -intlcal-set-repeated-wall-time-option -intlcal-set-skipped-wall-time-option -intlcal-set-time -intlcal-set-time-zone -intlcal-to-date-time -intl-error-name -intl-get-error-code -intl-get-error-message -intlgregcal-create-instance -intlgregcal-get-gregorian-change -intlgregcal-is-leap-year -intlgregcal-set-gregorian-change -intl-is-failure -intltz-count-equivalent-ids -intltz-create-default -intltz-create-enumeration -intltz-create-time-zone -intltz-create-time-zone-id-enumeration -intltz-from-date-time-zone -intltz-get-canonical-id -intltz-get-display-name -intltz-get-dst-savings -intltz-get-equivalent-id -intltz-get-error-code -intltz-get-error-message -intltz-get-gmt -intltz-get-id -intltz-get-offset -intltz-get-raw-offset -intltz-get-region -intltz-get-tz-data-version -intltz-get-unknown -intltz-has-same-rules -intltz-to-date-time-zone -intltz-use-daylight-time -intval -ip2long -iptcembed -iptcparse -is-a -is-array -is-bool -is-callable -is-countable -is-dir -is-double -isdrawingwand -is-executable -is-file -is-finite -is-float -is-infinite -is-int -is-integer -is-iterable -is-link -is-long -ismagickwand -is-nan -is-null -is-numeric -is-object -ispixeliterator -ispixelwand -ispixelwandsimilar -is-readable -is-real -is-resource -is-scalar -isset -is-soap-fault -is-string -is-subclass-of -is-tainted -is-uploaded-file -is-writable -is-writeable -iterator-apply -iterator-count -iterator-to-array -java-last-exception-clear -java-last-exception-get -jddayofweek -jdmonthname -jdtofrench -jdtogregorian -jdtojewish -jdtojulian -jdtounix -jewishtojd -join -jpeg2wbmp -json-decode -json-encode -json-last-error -json-last-error-msg -judy-type -judy-version -juliantojd -kadm5-chpass-principal -kadm5-create-principal -kadm5-delete-principal -kadm5-destroy -kadm5-flush -kadm5-get-policies -kadm5-get-principal -kadm5-get-principals -kadm5-init-with-password -kadm5-modify-principal -key -key-exists -krsort -ksort -lcfirst -lcg-value -lchgrp -lchown -ldap-8859-to-t61 -ldap-add -ldap-add-ext -ldap-bind -ldap-bind-ext -ldap-close -ldap-compare -ldap-connect -ldap-control-paged-result -ldap-control-paged-result-response -ldap-count-entries -ldap-delete -ldap-delete-ext -ldap-dn2ufn -ldap-err2str -ldap-errno -ldap-error -ldap-escape -ldap-exop -ldap-exop-passwd -ldap-exop-refresh -ldap-exop-whoami -ldap-explode-dn -ldap-first-attribute -ldap-first-entry -ldap-first-reference -ldap-free-result -ldap-get-attributes -ldap-get-dn -ldap-get-entries -ldap-get-option -ldap-get-values -ldap-get-values-len -ldap-list -ldap-mod-add -ldap-mod_add-ext -ldap-mod-add-ext -ldap-mod-del -ldap-mod_del-ext -ldap-mod-del-ext -ldap-modify -ldap-modify-batch -ldap-mod-replace -ldap-mod_replace-ext -ldap-mod-replace-ext -ldap-next-attribute -ldap-next-entry -ldap-next-reference -ldap-parse-exop -ldap-parse-reference -ldap-parse-result -ldap-read -ldap-rename -ldap-rename-ext -ldap-sasl-bind -ldap-search -ldap-set-option -ldap-set-rebind-proc -ldap-sort -ldap-start-tls -ldap-t61-to-8859 -ldap-unbind -levenshtein -libxml-clear-errors -libxml-disable-entity-loader -libxml-get-errors -libxml-get-last-error -libxml-set-external-entity-loader -libxml-set-streams-context -libxml-use-internal-errors -link -linkinfo -list -locale-accept-from-http -locale-canonicalize -locale-compose -localeconv -locale-filter-matches -locale-get-all-variants -locale-get-default -locale-get-display-language -locale-get-display-name -locale-get-display-region -locale-get-display-script -locale-get-display-variant -locale-get-keywords -locale-get-primary-language -locale-get-region -locale-get-script -locale-lookup -locale-parse -locale-set-default -localtime -log -log10 -log1p -log-cmd-delete -log-cmd-insert -log-cmd-update -log-getmore -log-killcursor -log-reply -log-write-batch -long2ip -lstat -ltrim -lzf-compress -lzf-decompress -lzf-optimized-for -magickadaptivethresholdimage -magickaddimage -magickaddimages -magickaddnoiseimage -magickaffinetransformimage -magickannotateimage -magickappendimages -magickaverageimages -magickblackthresholdimage -magickblurimage -magickblurimagechannel -magickborderimage -magickcharcoalimage -magickchopimage -magickclipimage -magickclippathimage -magickcoalesceimages -magickcolorfloodfillimage -magickcolorizeimage -magickcombineimages -magickcommentimage -magickcompareimagechannels -magickcompareimages -magickcompositeimage -magickconstituteimage -magickcontrastimage -magickconvolveimage -magickconvolveimagechannel -magickcropimage -magickcyclecolormapimage -magickdeconstructimages -magickdescribeimage -magickdespeckleimage -magickdisplayimage -magickdisplayimages -magickdrawimage -magickechoimageblob -magickechoimagesblob -magickedgeimage -magickembossimage -magickenhanceimage -magickequalizeimage -magickevaluateimage -magickevaluateimagechannel -magickflattenimages -magickflipimage -magickfloodfillpaintimage -magickflopimage -magickframeimage -magickfximage -magickfximagechannel -magickgammaimage -magickgammaimagechannel -magickgaussianblurimage -magickgaussianblurimagechannel -magickgetcharheight -magickgetcharwidth -magickgetcompression -magickgetcompressionquality -magickgetcopyright -magickgetexception -magickgetexceptionstring -magickgetexceptiontype -magickgetfilename -magickgetformat -magickgethomeurl -magickgetimage -magickgetimageattribute -magickgetimagebackgroundcolor -magickgetimageblob -magickgetimageblueprimary -magickgetimagebordercolor -magickgetimagechanneldepth -magickgetimagechanneldistortion -magickgetimagechannelextrema -magickgetimagechannelmean -magickgetimagechannelstatistics -magickgetimageclipmask -magickgetimagecolormapcolor -magickgetimagecolors -magickgetimagecolorspace -magickgetimagecompose -magickgetimagecompression -magickgetimagecompressionquality -magickgetimagedelay -magickgetimagedepth -magickgetimagedispose -magickgetimagedistortion -magickgetimageendian -magickgetimageextrema -magickgetimagefilename -magickgetimageformat -magickgetimagegamma -magickgetimagegreenprimary -magickgetimageheight -magickgetimagehistogram -magickgetimageindex -magickgetimageinterlacescheme -magickgetimageiterations -magickgetimagemattecolor -magickgetimagemimetype -magickgetimagepage -magickgetimagepixelcolor -magickgetimagepixels -magickgetimageprofile -magickgetimageproperty -magickgetimageredprimary -magickgetimageregion -magickgetimagerenderingintent -magickgetimageresolution -magickgetimagesblob -magickgetimagescene -magickgetimagesignature -magickgetimagesize -magickgetimagetickspersecond -magickgetimagetotalinkdensity -magickgetimagetype -magickgetimageunits -magickgetimagevirtualpixelmethod -magickgetimagewhitepoint -magickgetimagewidth -magickgetinterlacescheme -magickgetmaxtextadvance -magickgetmimetype -magickgetnumberimages -magickgetoption -magickgetpackagename -magickgetpage -magickgetquantumdepth -magickgetquantumrange -magickgetreleasedate -magickgetresource -magickgetresourcelimit -magickgetsamplingfactors -magickgetsize -magickgetstringheight -magickgetstringwidth -magickgettextascent -magickgettextdescent -magickgetversion -magickgetversionnumber -magickgetversionstring -magickgetwandsize -magickhasnextimage -magickhaspreviousimage -magickidentifyimage -magickimplodeimage -magicklabelimage -magicklevelimage -magicklevelimagechannel -magickmagnifyimage -magickmapimage -magickmattefloodfillimage -magickmedianfilterimage -magickminifyimage -magickmodulateimage -magickmontageimage -magickmorphimages -magickmosaicimages -magickmotionblurimage -magicknegateimage -magicknegateimagechannel -magicknewimage -magicknextimage -magicknormalizeimage -magickoilpaintimage -magickopaquepaintimage -magickorderedposterizeimage -magickpaintopaqueimage -magickpainttransparentimage -magickpingimage -magickposterizeimage -magickpreviewimages -magickpreviousimage -magickprofileimage -magickquantizeimage -magickquantizeimages -magickqueryconfigureoption -magickqueryconfigureoptions -magickqueryfontmetrics -magickqueryfonts -magickqueryformats -magickradialblurimage -magickraiseimage -magickreadimage -magickreadimageblob -magickreadimagefile -magickreadimages -magickrecolorimage -magickreducenoiseimage -magickremoveimage -magickremoveimageprofile -magickremoveimageprofiles -magickresampleimage -magickresetimagepage -magickresetiterator -magickresizeimage -magickrollimage -magickrotateimage -magicksampleimage -magickscaleimage -magickseparateimagechannel -magicksepiatoneimage -magicksetbackgroundcolor -magicksetcompression -magicksetcompressionquality -magicksetfilename -magicksetfirstiterator -magicksetformat -magicksetimage -magicksetimagealphachannel -magicksetimageattribute -magicksetimagebackgroundcolor -magicksetimagebias -magicksetimageblueprimary -magicksetimagebordercolor -magicksetimagechanneldepth -magicksetimageclipmask -magicksetimagecolormapcolor -magicksetimagecolorspace -magicksetimagecompose -magicksetimagecompression -magicksetimagecompressionquality -magicksetimagedelay -magicksetimagedepth -magicksetimagedispose -magicksetimageendian -magicksetimageextent -magicksetimagefilename -magicksetimageformat -magicksetimagegamma -magicksetimagegreenprimary -magicksetimageindex -magicksetimageinterlacescheme -magicksetimageiterations -magicksetimagemattecolor -magicksetimageopacity -magicksetimageoption -magicksetimagepage -magicksetimagepixels -magicksetimageprofile -magicksetimageproperty -magicksetimageredprimary -magicksetimagerenderingintent -magicksetimageresolution -magicksetimagescene -magicksetimagetickspersecond -magicksetimagetype -magicksetimageunits -magicksetimagevirtualpixelmethod -magicksetimagewhitepoint -magicksetinterlacescheme -magicksetlastiterator -magicksetoption -magicksetpage -magicksetpassphrase -magicksetresolution -magicksetresourcelimit -magicksetsamplingfactors -magicksetsize -magicksettype -magicksetwandsize -magickshadowimage -magicksharpenimage -magicksharpenimagechannel -magickshaveimage -magickshearimage -magicksolarizeimage -magickspliceimage -magickspreadimage -magickstatisticimage -magicksteganoimage -magickstereoimage -magickstripimage -magickswirlimage -magicktextureimage -magickthresholdimage -magickthresholdimagechannel -magickthumbnailimage -magicktintimage -magicktransformimage -magicktransparentpaintimage -magicktrimimage -magickunsharpmaskimage -magickunsharpmaskimagechannel -magickwaveimage -magickwhitethresholdimage -magickwriteimage -magickwriteimagefile -magickwriteimages -magickwriteimagesfile -magic-quotes-runtime -mail -mailparse-determine-best-xfer-encoding -mailparse-msg-create -mailparse-msg-extract-part -mailparse-msg-extract-part-file -mailparse-msg-extract-whole-part-file -mailparse-msg-free -mailparse-msg-get-part -mailparse-msg-get-part-data -mailparse-msg-get-structure -mailparse-msg-parse -mailparse-msg-parse-file -mailparse-rfc822-parse-addresses -mailparse-stream-encode -mailparse-uudecode-all -main -max -maxdb-affected-rows -maxdb-autocommit -maxdb-bind-param -maxdb-bind-result -maxdb-change-user -maxdb-character-set-name -maxdb-client-encoding -maxdb-close -maxdb-close-long-data -maxdb-commit -maxdb-connect -maxdb-connect-errno -maxdb-connect-error -maxdb-data-seek -maxdb-debug -maxdb-disable-reads-from-master -maxdb-disable-rpl-parse -maxdb-dump-debug-info -maxdb-embedded-connect -maxdb-enable-reads-from-master -maxdb-enable-rpl-parse -maxdb-errno -maxdb-error -maxdb-escape-string -maxdb-execute -maxdb-fetch -maxdb-fetch-array -maxdb-fetch-assoc -maxdb-fetch-field -maxdb-fetch-field-direct -maxdb-fetch-fields -maxdb-fetch-lengths -maxdb-fetch-object -maxdb-fetch-row -maxdb-field-count -maxdb-field-seek -maxdb-field-tell -maxdb-free-result -maxdb-get-client-info -maxdb-get-client-version -maxdb-get-host-info -maxdb-get-metadata -maxdb-get-proto-info -maxdb-get-server-info -maxdb-get-server-version -maxdb-info -maxdb-init -maxdb-insert-id -maxdb-kill -maxdb-master-query -maxdb-more-results -maxdb-multi-query -maxdb-next-result -maxdb-num-fields -maxdb-num-rows -maxdb-options -maxdb-param-count -maxdb-ping -maxdb-prepare -maxdb-query -maxdb-real-connect -maxdb-real-escape-string -maxdb-real-query -maxdb-report -maxdb-rollback -maxdb-rpl-parse-enabled -maxdb-rpl-probe -maxdb-rpl-query-type -maxdb-select-db -maxdb-send-long-data -maxdb-send-query -maxdb-server-end -maxdb-server-init -maxdb-set-opt -maxdb-sqlstate -maxdb-ssl-set -maxdb-stat -maxdb-stmt-affected-rows -maxdb-stmt-bind-param -maxdb-stmt-bind-result -maxdb-stmt-close -maxdb-stmt-close-long-data -maxdb-stmt-data-seek -maxdb-stmt-errno -maxdb-stmt-error -maxdb-stmt-execute -maxdb-stmt-fetch -maxdb-stmt-free-result -maxdb-stmt-init -maxdb-stmt-num-rows -maxdb-stmt-param-count -maxdb-stmt-prepare -maxdb-stmt-reset -maxdb-stmt-result-metadata -maxdb-stmt-send-long-data -maxdb-stmt-sqlstate -maxdb-stmt-store-result -maxdb-store-result -maxdb-thread-id -maxdb-thread-safe -maxdb-use-result -maxdb-warning-count -mb-check-encoding -mb-chr -mb-convert-case -mb-convert-encoding -mb-convert-kana -mb-convert-variables -mb-decode-mimeheader -mb-decode-numericentity -mb-detect-encoding -mb-detect-order -mb-encode-mimeheader -mb-encode-numericentity -mb-encoding-aliases -mb-ereg -mb-eregi -mb-eregi-replace -mb-ereg-match -mb-ereg-replace -mb-ereg-replace-callback -mb-ereg-search -mb-ereg-search-getpos -mb-ereg-search-getregs -mb-ereg-search-init -mb-ereg-search-pos -mb-ereg-search-regs -mb-ereg-search-setpos -mb-get-info -mb-http-input -mb-http-output -mb-internal-encoding -mb-language -mb-list-encodings -mb-ord -mb-output-handler -mb-parse-str -mb-preferred-mime-name -mb-regex-encoding -mb-regex-set-options -mb-scrub -mb-send-mail -mb-split -mb-strcut -mb-strimwidth -mb-stripos -mb-stristr -mb-strlen -mb-strpos -mb-strrchr -mb-strrichr -mb-strripos -mb-strrpos -mb-strstr -mb-strtolower -mb-strtoupper -mb-strwidth -mb-substitute-character -mb-substr -mb-substr-count -m-checkstatus -m-completeauthorizations -m-connect -m-connectionerror -mcrypt-cbc -mcrypt-cfb -mcrypt-create-iv -mcrypt-decrypt -mcrypt-ecb -mcrypt-enc-get-algorithms-name -mcrypt-enc-get-block-size -mcrypt-enc-get-iv-size -mcrypt-enc-get-key-size -mcrypt-enc-get-modes-name -mcrypt-enc-get-supported-key-sizes -mcrypt-enc-is-block-algorithm -mcrypt-enc-is-block-algorithm-mode -mcrypt-enc-is-block-mode -mcrypt-encrypt -mcrypt-enc-self-test -mcrypt-generic -mcrypt-generic-deinit -mcrypt-generic-end -mcrypt-generic-init -mcrypt-get-block-size -mcrypt-get-cipher-name -mcrypt-get-iv-size -mcrypt-get-key-size -mcrypt-list-algorithms -mcrypt-list-modes -mcrypt-module-close -mcrypt-module-get-algo-block-size -mcrypt-module-get-algo-key-size -mcrypt-module-get-supported-key-sizes -mcrypt-module-is-block-algorithm -mcrypt-module-is-block-algorithm-mode -mcrypt-module-is-block-mode -mcrypt-module-open -mcrypt-module-self-test -mcrypt-ofb -md5 -md5-file -mdecrypt-generic -m-deletetrans -m-destroyconn -m-destroyengine -memcache-add -memcache-add-server -memcache-close -memcache-connect -memcache-debug -memcache-decrement -memcache-delete -memcache-flush -memcache-get -memcache-get-extended-stats -memcache-get-server-status -memcache-get-stats -memcache-get-version -memcache-increment -memcache-pconnect -memcache-replace -memcache-set -memcache-set-compress-threshold -memcache-setoptimeout -memcache-set-server-params -memory-get-peak-usage -memory-get-usage -metaphone -method-exists -m-getcell -m-getcellbynum -m-getcommadelimited -m-getheader -mhash -mhash-count -mhash-get-block-size -mhash-get-hash-name -mhash-keygen-s2k -microtime -mime-content-type -min -ming-keypress -ming-setcubicthreshold -ming-setscale -ming-setswfcompression -ming-useconstants -ming-useswfversion -m-initconn -m-initengine -m-iscommadelimited -mkdir -mktime -m-maxconntimeout -m-monitor -m-numcolumns -m-numrows -money-format -move-uploaded-file -m-parsecommadelimited -mqseries-back -mqseries-begin -mqseries-close -mqseries-cmit -mqseries-conn -mqseries-connx -mqseries-disc -mqseries-get -mqseries-inq -mqseries-open -mqseries-put -mqseries-put1 -mqseries-set -mqseries-strerror -m-responsekeys -m-responseparam -m-returnstatus -msession-connect -msession-count -msession-create -msession-destroy -msession-disconnect -msession-find -msession-get -msession-get-array -msession-get-data -msession-inc -msession-list -msession-listvar -msession-lock -msession-plugin -msession-randstr -msession-set -msession-set-array -msession-set-data -msession-timeout -msession-uniq -msession-unlock -m-setblocking -m-setdropfile -m-setip -m-setssl -m-setssl-cafile -m-setssl-files -m-settimeout -msgfmt-create -msgfmt-format -msgfmt-format-message -msgfmt-get-error-code -msgfmt-get-error-message -msgfmt-get-locale -msgfmt-get-pattern -msgfmt-parse -msgfmt-parse-message -msgfmt-set-pattern -msg-get-queue -msg-queue-exists -msg-receive -msg-remove-queue -msg-send -msg-set-queue -msg-stat-queue -msql -msql-affected-rows -msql-close -msql-connect -msql-createdb -msql-create-db -msql-data-seek -msql-dbname -msql-db-query -msql-drop-db -msql-error -msql-fetch-array -msql-fetch-field -msql-fetch-object -msql-fetch-row -msql-fieldflags -msql-field-flags -msql-fieldlen -msql-field-len -msql-fieldname -msql-field-name -msql-field-seek -msql-fieldtable -msql-field-table -msql-fieldtype -msql-field-type -msql-free-result -msql-list-dbs -msql-list-fields -msql-list-tables -msql-numfields -msql-num-fields -msql-numrows -msql-num-rows -msql-pconnect -msql-query -msql-regcase -msql-result -msql-select-db -msql-tablename -m-sslcert-gen-hash -mssql-bind -mssql-close -mssql-connect -mssql-data-seek -mssql-execute -mssql-fetch-array -mssql-fetch-assoc -mssql-fetch-batch -mssql-fetch-field -mssql-fetch-object -mssql-fetch-row -mssql-field-length -mssql-field-name -mssql-field-seek -mssql-field-type -mssql-free-result -mssql-free-statement -mssql-get-last-message -mssql-guid-string -mssql-init -mssql-min-error-severity -mssql-min-message-severity -mssql-next-result -mssql-num-fields -mssql-num-rows -mssql-pconnect -mssql-query -mssql-result -mssql-rows-affected -mssql-select-db -mt-getrandmax -mt-rand -m-transactionssent -m-transinqueue -m-transkeyval -m-transnew -m-transsend -mt-srand -m-uwait -m-validateidentifier -m-verifyconnection -m-verifysslcert -mysql-affected-rows -mysql-client-encoding -mysql-close -mysql-connect -mysql-create-db -mysql-data-seek -mysql-db-name -mysql-db-query -mysql-drop-db -mysql-errno -mysql-error -mysql-escape-string -mysql-fetch-array -mysql-fetch-assoc -mysql-fetch-field -mysql-fetch-lengths -mysql-fetch-object -mysql-fetch-row -mysql-field-flags -mysql-field-len -mysql-field-name -mysql-field-seek -mysql-field-table -mysql-field-type -mysql-free-result -mysql-get-client-info -mysql-get-host-info -mysql-get-proto-info -mysql-get-server-info -mysqli-affected-rows -mysqli-autocommit -mysqli-begin-transaction -mysqli-bind-param -mysqli-bind-result -mysqli-change-user -mysqli-character-set-name -mysqli-client-encoding -mysqli-close -mysqli-commit -mysqli-connect -mysqli-connect-errno -mysqli-connect-error -mysqli-data-seek -mysqli-debug -mysqli-disable-reads-from-master -mysqli-disable-rpl-parse -mysqli-dump-debug-info -mysqli-embedded-server-end -mysqli-embedded-server-start -mysqli-enable-reads-from-master -mysqli-enable-rpl-parse -mysqli-errno -mysqli-error -mysqli-error-list -mysqli-escape-string -mysqli-execute -mysqli-fetch -mysqli-fetch-all -mysqli-fetch-array -mysqli-fetch-assoc -mysqli-fetch-field -mysqli-fetch-field-direct -mysqli-fetch-fields -mysqli-fetch-lengths -mysqli-fetch-object -mysqli-fetch-row -mysqli-field-count -mysqli-field-seek -mysqli-field-tell -mysqli-free-result -mysqli-get-cache-stats -mysqli-get-charset -mysqli-get-client-info -mysqli-get-client-stats -mysqli-get-client-version -mysqli-get-connection-stats -mysqli-get-host-info -mysqli-get-links-stats -mysqli-get-metadata -mysqli-get-proto-info -mysqli-get-server-info -mysqli-get-server-version -mysqli-get-warnings -mysqli-info -mysqli-init -mysqli-insert-id -mysqli-kill -mysqli-master-query -mysqli-more-results -mysqli-multi-query -mysqli-next-result -mysql-info -mysql-insert-id -mysqli-num-fields -mysqli-num-rows -mysqli-options -mysqli-param-count -mysqli-ping -mysqli-poll -mysqli-prepare -mysqli-query -mysqli-real-connect -mysqli-real-escape-string -mysqli-real-query -mysqli-reap-async-query -mysqli-refresh -mysqli-release-savepoint -mysqli-report -mysqli-rollback -mysqli-rpl-parse-enabled -mysqli-rpl-probe -mysqli-rpl-query-type -mysqli-savepoint -mysqli-select-db -mysqli-send-long-data -mysqli-send-query -mysqli-set-charset -mysqli-set-local-infile-default -mysqli-set-local-infile-handler -mysqli-set-opt -mysqli-slave-query -mysqli-sqlstate -mysqli-ssl-set -mysqli-stat -mysqli-stmt-affected-rows -mysqli-stmt-attr-get -mysqli-stmt-attr-set -mysqli-stmt-bind-param -mysqli-stmt-bind-result -mysqli-stmt-close -mysqli-stmt-data-seek -mysqli-stmt-errno -mysqli-stmt-error -mysqli-stmt-error-list -mysqli-stmt-execute -mysqli-stmt-fetch -mysqli-stmt-field-count -mysqli-stmt-free-result -mysqli-stmt-get-result -mysqli-stmt-get-warnings -mysqli-stmt-init -mysqli-stmt-insert-id -mysqli-stmt-more-results -mysqli-stmt-next-result -mysqli-stmt-num-rows -mysqli-stmt-param-count -mysqli-stmt-prepare -mysqli-stmt-reset -mysqli-stmt-result-metadata -mysqli-stmt-send-long-data -mysqli-stmt-sqlstate -mysqli-stmt-store-result -mysqli-store-result -mysqli-thread-id -mysqli-thread-safe -mysqli-use-result -mysqli-warning-count -mysql-list-dbs -mysql-list-fields -mysql-list-processes -mysql-list-tables -mysqlnd-memcache-get-config -mysqlnd-memcache-set -mysqlnd-ms-dump-servers -mysqlnd-ms-fabric-select-global -mysqlnd-ms-fabric-select-shard -mysqlnd-ms-get-last-gtid -mysqlnd-ms-get-last-used-connection -mysqlnd-ms-get-stats -mysqlnd-ms-match-wild -mysqlnd-ms-query-is-select -mysqlnd-ms-set-qos -mysqlnd-ms-set-user-pick-server -mysqlnd-ms-xa-begin -mysqlnd-ms-xa-commit -mysqlnd-ms-xa-gc -mysqlnd-ms-xa-rollback -mysqlnd-qc-clear-cache -mysqlnd-qc-get-available-handlers -mysqlnd-qc-get-cache-info -mysqlnd-qc-get-core-stats -mysqlnd-qc-get-normalized-query-trace-log -mysqlnd-qc-get-query-trace-log -mysqlnd-qc-set-cache-condition -mysqlnd-qc-set-is-select -mysqlnd-qc-set-storage-handler -mysqlnd-qc-set-user-handlers -mysqlnd-uh-convert-to-mysqlnd -mysqlnd-uh-set-connection-proxy -mysqlnd-uh-set-statement-proxy -mysql-num-fields -mysql-num-rows -mysql-pconnect -mysql-ping -mysql-query -mysql-real-escape-string -mysql-result -mysql-select-db -mysql-set-charset -mysql-stat -mysql-tablename -mysql-thread-id -mysql-unbuffered-query -mysql-xdevapi-expression -mysql-xdevapi-getsession -natcasesort -natsort -ncurses-addch -ncurses-addchnstr -ncurses-addchstr -ncurses-addnstr -ncurses-addstr -ncurses-assume-default-colors -ncurses-attroff -ncurses-attron -ncurses-attrset -ncurses-baudrate -ncurses-beep -ncurses-bkgd -ncurses-bkgdset -ncurses-border -ncurses-bottom-panel -ncurses-can-change-color -ncurses-cbreak -ncurses-clear -ncurses-clrtobot -ncurses-clrtoeol -ncurses-color-content -ncurses-color-set -ncurses-curs-set -ncurses-define-key -ncurses-def-prog-mode -ncurses-def-shell-mode -ncurses-delay-output -ncurses-delch -ncurses-deleteln -ncurses-del-panel -ncurses-delwin -ncurses-doupdate -ncurses-echo -ncurses-echochar -ncurses-end -ncurses-erase -ncurses-erasechar -ncurses-filter -ncurses-flash -ncurses-flushinp -ncurses-getch -ncurses-getmaxyx -ncurses-getmouse -ncurses-getyx -ncurses-halfdelay -ncurses-has-colors -ncurses-has-ic -ncurses-has-il -ncurses-has-key -ncurses-hide-panel -ncurses-hline -ncurses-inch -ncurses-init -ncurses-init-color -ncurses-init-pair -ncurses-insch -ncurses-insdelln -ncurses-insertln -ncurses-insstr -ncurses-instr -ncurses-isendwin -ncurses-keyok -ncurses-keypad -ncurses-killchar -ncurses-longname -ncurses-meta -ncurses-mouseinterval -ncurses-mousemask -ncurses-mouse-trafo -ncurses-move -ncurses-move-panel -ncurses-mvaddch -ncurses-mvaddchnstr -ncurses-mvaddchstr -ncurses-mvaddnstr -ncurses-mvaddstr -ncurses-mvcur -ncurses-mvdelch -ncurses-mvgetch -ncurses-mvhline -ncurses-mvinch -ncurses-mvvline -ncurses-mvwaddstr -ncurses-napms -ncurses-newpad -ncurses-new-panel -ncurses-newwin -ncurses-nl -ncurses-nocbreak -ncurses-noecho -ncurses-nonl -ncurses-noqiflush -ncurses-noraw -ncurses-pair-content -ncurses-panel-above -ncurses-panel-below -ncurses-panel-window -ncurses-pnoutrefresh -ncurses-prefresh -ncurses-putp -ncurses-qiflush -ncurses-raw -ncurses-refresh -ncurses-replace-panel -ncurses-reset-prog-mode -ncurses-reset-shell-mode -ncurses-resetty -ncurses-savetty -ncurses-scr-dump -ncurses-scr-init -ncurses-scrl -ncurses-scr-restore -ncurses-scr-set -ncurses-show-panel -ncurses-slk-attr -ncurses-slk-attroff -ncurses-slk-attron -ncurses-slk-attrset -ncurses-slk-clear -ncurses-slk-color -ncurses-slk-init -ncurses-slk-noutrefresh -ncurses-slk-refresh -ncurses-slk-restore -ncurses-slk-set -ncurses-slk-touch -ncurses-standend -ncurses-standout -ncurses-start-color -ncurses-termattrs -ncurses-termname -ncurses-timeout -ncurses-top-panel -ncurses-typeahead -ncurses-ungetch -ncurses-ungetmouse -ncurses-update-panels -ncurses-use-default-colors -ncurses-use-env -ncurses-use-extended-names -ncurses-vidattr -ncurses-vline -ncurses-waddch -ncurses-waddstr -ncurses-wattroff -ncurses-wattron -ncurses-wattrset -ncurses-wborder -ncurses-wclear -ncurses-wcolor-set -ncurses-werase -ncurses-wgetch -ncurses-whline -ncurses-wmouse-trafo -ncurses-wmove -ncurses-wnoutrefresh -ncurses-wrefresh -ncurses-wstandend -ncurses-wstandout -ncurses-wvline -newdrawingwand -newmagickwand -newpixeliterator -newpixelregioniterator -newpixelwand -newpixelwandarray -newpixelwands -newt-bell -newt-button -newt-button-bar -newt-centered-window -newt-checkbox -newt-checkbox-get-value -newt-checkbox-set-flags -newt-checkbox-set-value -newt-checkbox-tree -newt-checkbox-tree-add-item -newt-checkbox-tree-find-item -newt-checkbox-tree-get-current -newt-checkbox-tree-get-entry-value -newt-checkbox-tree-get-multi-selection -newt-checkbox-tree-get-selection -newt-checkbox-tree-multi -newt-checkbox-tree-set-current -newt-checkbox-tree-set-entry -newt-checkbox-tree-set-entry-value -newt-checkbox-tree-set-width -newt-clear-key-buffer -newt-cls -newt-compact-button -newt-component-add-callback -newt-component-takes-focus -newt-create-grid -newt-cursor-off -newt-cursor-on -newt-delay -newt-draw-form -newt-draw-root-text -newt-entry -newt-entry-get-value -newt-entry-set -newt-entry-set-filter -newt-entry-set-flags -newt-finished -newt-form -newt-form-add-component -newt-form-add-components -newt-form-add-hot-key -newt-form-destroy -newt-form-get-current -newt-form-run -newt-form-set-background -newt-form-set-height -newt-form-set-size -newt-form-set-timer -newt-form-set-width -newt-form-watch-fd -newt-get-screen-size -newt-grid-add-components-to-form -newt-grid-basic-window -newt-grid-free -newt-grid-get-size -newt-grid-h-close-stacked -newt-grid-h-stacked -newt-grid-place -newt-grid-set-field -newt-grid-simple-window -newt-grid-v-close-stacked -newt-grid-v-stacked -newt-grid-wrapped-window -newt-grid-wrapped-window-at -newt-init -newt-label -newt-label-set-text -newt-listbox -newt-listbox-append-entry -newt-listbox-clear -newt-listbox-clear-selection -newt-listbox-delete-entry -newt-listbox-get-current -newt-listbox-get-selection -newt-listbox-insert-entry -newt-listbox-item-count -newt-listbox-select-item -newt-listbox-set-current -newt-listbox-set-current-by-key -newt-listbox-set-data -newt-listbox-set-entry -newt-listbox-set-width -newt-listitem -newt-listitem-get-data -newt-listitem-set -newt-open-window -newt-pop-help-line -newt-pop-window -newt-push-help-line -newt-radiobutton -newt-radio-get-current -newt-redraw-help-line -newt-reflow-text -newt-refresh -newt-resize-screen -newt-resume -newt-run-form -newt-scale -newt-scale-set -newt-scrollbar-set -newt-set-help-callback -newt-set-suspend-callback -newt-suspend -newt-textbox -newt-textbox-get-num-lines -newt-textbox-reflowed -newt-textbox-set-height -newt-textbox-set-text -newt-vertical-scrollbar -newt-wait-for-key -newt-win-choice -newt-win-entries -newt-win-menu -newt-win-message -newt-win-messagev -newt-win-ternary -next -ngettext -nl2br -nl-langinfo -normalizer-get-raw-decomposition -normalizer-is-normalized -normalizer-normalize -notes-body -notes-copy-db -notes-create-db -notes-create-note -notes-drop-db -notes-find-note -notes-header-info -notes-list-msgs -notes-mark-read -notes-mark-unread -notes-nav-create -notes-search -notes-unread -notes-version -nsapi-request-headers -nsapi-response-headers -nsapi-virtual -nthmac -number-format -numfmt-create -numfmt-format -numfmt-format-currency -numfmt-get-attribute -numfmt-get-error-code -numfmt-get-error-message -numfmt-get-locale -numfmt-get-pattern -numfmt-get-symbol -numfmt-get-text-attribute -numfmt-parse -numfmt-parse-currency -numfmt-set-attribute -numfmt-set-pattern -numfmt-set-symbol -numfmt-set-text-attribute -oauth-get-sbs -oauth-urlencode -ob-clean -ob-deflatehandler -ob-end-clean -ob-end-flush -ob-etaghandler -ob-flush -ob-get-clean -ob-get-contents -ob-get-flush -ob-get-length -ob-get-level -ob-get-status -ob-gzhandler -ob-iconv-handler -ob-implicit-flush -ob-inflatehandler -ob-list-handlers -ob-start -ob-tidyhandler -oci-bind-array-by-name -ocibindbyname -oci-bind-by-name -ocicancel -oci-cancel -oci-client-version -oci-close -ocicloselob -ocicollappend -ocicollassign -ocicollassignelem -ocicollgetelem -ocicollmax -ocicollsize -ocicolltrim -ocicolumnisnull -ocicolumnname -ocicolumnprecision -ocicolumnscale -ocicolumnsize -ocicolumntype -ocicolumntyperaw -ocicommit -oci-commit -oci-connect -ocidefinebyname -oci-define-by-name -ocierror -oci-error -ociexecute -oci-execute -ocifetch -oci-fetch -oci-fetch-all -oci-fetch-array -oci-fetch-assoc -ocifetchinto -oci-fetch-object -oci-fetch-row -ocifetchstatement -oci-field-is-null -oci-field-name -oci-field-precision -oci-field-scale -oci-field-size -oci-field-type -oci-field-type-raw -ocifreecollection -ocifreecursor -ocifreedesc -oci-free-descriptor -ocifreestatement -oci-free-statement -oci-get-implicit-resultset -ociinternaldebug -oci-internal-debug -ociloadlob -oci-lob-copy -oci-lob-is-equal -ocilogoff -ocilogon -ocinewcollection -oci-new-collection -oci-new-connect -ocinewcursor -oci-new-cursor -ocinewdescriptor -oci-new-descriptor -ocinlogon -ocinumcols -oci-num-fields -oci-num-rows -ociparse -oci-parse -oci-password-change -oci-pconnect -ociplogon -oci-register-taf-callback -ociresult -oci-result -ocirollback -oci-rollback -ocirowcount -ocisavelob -ocisavelobfile -ociserverversion -oci-server-version -oci-set-action -oci-set-call-timeout -oci-set-call-timout -oci-set-client-identifier -oci-set-client-info -oci-set-db-operation -oci-set-edition -oci-set-module-name -ocisetprefetch -oci-set-prefetch -ocistatementtype -oci-statement-type -oci-unregister-taf-callback -ociwritelobtofile -ociwritetemporarylob -octdec -odbc-autocommit -odbc-binmode -odbc-close -odbc-close-all -odbc-columnprivileges -odbc-columns -odbc-commit -odbc-connect -odbc-cursor -odbc-data-source -odbc-do -odbc-error -odbc-errormsg -odbc-exec -odbc-execute -odbc-fetch-array -odbc-fetch-into -odbc-fetch-object -odbc-fetch-row -odbc-field-len -odbc-field-name -odbc-field-num -odbc-field-precision -odbc-field-scale -odbc-field-type -odbc-foreignkeys -odbc-free-result -odbc-gettypeinfo -odbc-longreadlen -odbc-next-result -odbc-num-fields -odbc-num-rows -odbc-pconnect -odbc-prepare -odbc-primarykeys -odbc-procedurecolumns -odbc-procedures -odbc-result -odbc-result-all -odbc-rollback -odbc-setoption -odbc-specialcolumns -odbc-statistics -odbc-tableprivileges -odbc-tables -opcache-compile-file -opcache-get-configuration -opcache-get-status -opcache-invalidate -opcache-is-script-cached -opcache-reset -openal-buffer-create -openal-buffer-data -openal-buffer-destroy -openal-buffer-get -openal-buffer-loadwav -openal-context-create -openal-context-current -openal-context-destroy -openal-context-process -openal-context-suspend -openal-device-close -openal-device-open -openal-listener-get -openal-listener-set -openal-source-create -openal-source-destroy -openal-source-get -openal-source-pause -openal-source-play -openal-source-rewind -openal-source-set -openal-source-stop -openal-stream -opendir -openlog -openssl-cipher-iv-length -openssl-csr-export -openssl-csr-export-to-file -openssl-csr-get-public-key -openssl-csr-get-subject -openssl-csr-new -openssl-csr-sign -openssl-decrypt -openssl-dh-compute-key -openssl-digest -openssl-encrypt -openssl-error-string -openssl-free-key -openssl-get-cert-locations -openssl-get-cipher-methods -openssl-get-curve-names -openssl-get-md-methods -openssl-get-privatekey -openssl-get-publickey -openssl-open -openssl-pbkdf2 -openssl-pkcs12-export -openssl-pkcs12-export-to-file -openssl-pkcs12-read -openssl-pkcs7-decrypt -openssl-pkcs7-encrypt -openssl-pkcs7-read -openssl-pkcs7-sign -openssl-pkcs7-verify -openssl-pkey-export -openssl-pkey-export-to-file -openssl-pkey-free -openssl-pkey-get-details -openssl-pkey-get-private -openssl-pkey-get-public -openssl-pkey-new -openssl-private-decrypt -openssl-private-encrypt -openssl-public-decrypt -openssl-public-encrypt -openssl-random-pseudo-bytes -openssl-seal -openssl-sign -openssl-spki-export -openssl-spki-export-challenge -openssl-spki-new -openssl-spki-verify -openssl-verify -openssl-x509-check-private-key -openssl-x509-checkpurpose -openssl-x509-export -openssl-x509-export-to-file -openssl-x509-fingerprint -openssl-x509-free -openssl-x509-parse -openssl-x509-read -ord -output-add-rewrite-var -output-reset-rewrite-vars -overload -override-function -ovrimos-close -ovrimos-commit -ovrimos-connect -ovrimos-cursor -ovrimos-exec -ovrimos-execute -ovrimos-fetch-into -ovrimos-fetch-row -ovrimos-field-len -ovrimos-field-name -ovrimos-field-num -ovrimos-field-type -ovrimos-free-result -ovrimos-longreadlen -ovrimos-num-fields -ovrimos-num-rows -ovrimos-prepare -ovrimos-result -ovrimos-result-all -ovrimos-rollback -pack -parse-ini-file -parse-ini-string -parsekit-compile-file -parsekit-compile-string -parsekit-func-arginfo -parse-str -parse-url -passthru -password-get-info -password-hash -password-needs-rehash -password-verify -pathinfo -pclose -pcntl-alarm -pcntl-async-signals -pcntl-errno -pcntl-exec -pcntl-fork -pcntl-get-last-error -pcntl-getpriority -pcntl-setpriority -pcntl-signal -pcntl-signal-dispatch -pcntl-signal-get-handler -pcntl-sigprocmask -pcntl-sigtimedwait -pcntl-sigwaitinfo -pcntl-strerror -pcntl-wait -pcntl-waitpid -pcntl-wexitstatus -pcntl-wifexited -pcntl-wifsignaled -pcntl-wifstopped -pcntl-wstopsig -pcntl-wtermsig -pdf-activate-item -PDF-activate-item -pdf-add-annotation -PDF-add-annotation -pdf-add-bookmark -PDF-add-bookmark -pdf-add-launchlink -PDF-add-launchlink -pdf-add-locallink -PDF-add-locallink -pdf-add-nameddest -PDF-add-nameddest -pdf-add-note -PDF-add-note -pdf-add-outline -PDF-add-outline -pdf-add-pdflink -PDF-add-pdflink -pdf-add-table-cell -PDF-add-table-cell -pdf-add-textflow -PDF-add-textflow -pdf-add-thumbnail -PDF-add-thumbnail -pdf-add-weblink -PDF-add-weblink -pdf-arc -PDF-arc -pdf-arcn -PDF-arcn -pdf-attach-file -PDF-attach-file -pdf-begin-document -PDF-begin-document -pdf-begin-font -PDF-begin-font -pdf-begin-glyph -PDF-begin-glyph -pdf-begin-item -PDF-begin-item -pdf-begin-layer -PDF-begin-layer -pdf-begin-page -PDF-begin-page -pdf-begin-page-ext -PDF-begin-page-ext -pdf-begin-pattern -PDF-begin-pattern -pdf-begin-template -PDF-begin-template -pdf-begin-template-ext -PDF-begin-template-ext -pdf-circle -PDF-circle -pdf-clip -PDF-clip -pdf-close -PDF-close -pdf-close-image -PDF-close-image -pdf-closepath -PDF-closepath -pdf-closepath-fill-stroke -PDF-closepath-fill-stroke -pdf-closepath-stroke -PDF-closepath-stroke -pdf-close-pdi -PDF-close-pdi -pdf-close-pdi-page -PDF-close-pdi-page -pdf-concat -PDF-concat -pdf-continue-text -PDF-continue-text -pdf-create-3dview -PDF-create-3dview -pdf-create-action -PDF-create-action -pdf-create-annotation -PDF-create-annotation -pdf-create-bookmark -PDF-create-bookmark -pdf-create-field -PDF-create-field -pdf-create-fieldgroup -PDF-create-fieldgroup -pdf-create-gstate -PDF-create-gstate -pdf-create-pvf -PDF-create-pvf -pdf-create-textflow -PDF-create-textflow -pdf-curveto -PDF-curveto -pdf-define-layer -PDF-define-layer -pdf-delete -PDF-delete -pdf-delete-pvf -PDF-delete-pvf -pdf-delete-table -PDF-delete-table -pdf-delete-textflow -PDF-delete-textflow -pdf-encoding-set-char -PDF-encoding-set-char -pdf-end-document -PDF-end-document -pdf-end-font -PDF-end-font -pdf-end-glyph -PDF-end-glyph -pdf-end-item -PDF-end-item -pdf-end-layer -PDF-end-layer -pdf-end-page -PDF-end-page -pdf-end-page-ext -PDF-end-page-ext -pdf-endpath -PDF-endpath -pdf-end-pattern -PDF-end-pattern -pdf-end-template -PDF-end-template -pdf-fill -PDF-fill -pdf-fill-imageblock -PDF-fill-imageblock -pdf-fill-pdfblock -PDF-fill-pdfblock -pdf-fill-stroke -PDF-fill-stroke -pdf-fill-textblock -PDF-fill-textblock -pdf-findfont -PDF-findfont -pdf-fit-image -PDF-fit-image -pdf-fit-pdi-page -PDF-fit-pdi-page -pdf-fit-table -PDF-fit-table -pdf-fit-textflow -PDF-fit-textflow -pdf-fit-textline -PDF-fit-textline -pdf-get-apiname -PDF-get-apiname -pdf-get-buffer -PDF-get-buffer -pdf-get-errmsg -PDF-get-errmsg -pdf-get-errnum -PDF-get-errnum -pdf-get-font -PDF-get-font -pdf-get-fontname -PDF-get-fontname -pdf-get-fontsize -PDF-get-fontsize -pdf-get-image-height -PDF-get-image-height -pdf-get-image-width -PDF-get-image-width -pdf-get-majorversion -PDF-get-majorversion -pdf-get-minorversion -PDF-get-minorversion -pdf-get-parameter -PDF-get-parameter -pdf-get-pdi-parameter -PDF-get-pdi-parameter -pdf-get-pdi-value -PDF-get-pdi-value -pdf-get-value -PDF-get-value -pdf-info-font -PDF-info-font -pdf-info-matchbox -PDF-info-matchbox -pdf-info-table -PDF-info-table -pdf-info-textflow -PDF-info-textflow -pdf-info-textline -PDF-info-textline -pdf-initgraphics -PDF-initgraphics -pdf-lineto -PDF-lineto -pdf-load-3ddata -PDF-load-3ddata -pdf-load-font -PDF-load-font -pdf-load-iccprofile -PDF-load-iccprofile -pdf-load-image -PDF-load-image -pdf-makespotcolor -PDF-makespotcolor -pdf-moveto -PDF-moveto -pdf-new -PDF-new -pdf-open-ccitt -PDF-open-ccitt -pdf-open-file -PDF-open-file -pdf-open-gif -PDF-open-gif -pdf-open-image -PDF-open-image -pdf-open-image-file -PDF-open-image-file -pdf-open-jpeg -PDF-open-jpeg -pdf-open-memory-image -PDF-open-memory-image -pdf-open-pdi -PDF-open-pdi -pdf-open-pdi-document -PDF-open-pdi-document -pdf-open-pdi-page -PDF-open-pdi-page -pdf-open-tiff -PDF-open-tiff -pdf-pcos-get-number -PDF-pcos-get-number -pdf-pcos-get-stream -PDF-pcos-get-stream -pdf-pcos-get-string -PDF-pcos-get-string -pdf-place-image -PDF-place-image -pdf-place-pdi-page -PDF-place-pdi-page -pdf-process-pdi -PDF-process-pdi -pdf-rect -PDF-rect -pdf-restore -PDF-restore -pdf-resume-page -PDF-resume-page -pdf-rotate -PDF-rotate -pdf-save -PDF-save -pdf-scale -PDF-scale -pdf-set-border-color -PDF-set-border-color -pdf-set-border-dash -PDF-set-border-dash -pdf-set-border-style -PDF-set-border-style -pdf-set-char-spacing -PDF-set-char-spacing -pdf-setcolor -PDF-setcolor -pdf-setdash -PDF-setdash -pdf-setdashpattern -PDF-setdashpattern -pdf-set-duration -PDF-set-duration -pdf-setflat -PDF-setflat -pdf-setfont -PDF-setfont -pdf-setgray -PDF-setgray -pdf-setgray-fill -PDF-setgray-fill -pdf-setgray-stroke -PDF-setgray-stroke -pdf-set-gstate -PDF-set-gstate -pdf-set-horiz-scaling -PDF-set-horiz-scaling -pdf-set-info -PDF-set-info -pdf-set-info-author -PDF-set-info-author -pdf-set-info-creator -PDF-set-info-creator -pdf-set-info-keywords -PDF-set-info-keywords -pdf-set-info-subject -PDF-set-info-subject -pdf-set-info-title -PDF-set-info-title -pdf-set-layer-dependency -PDF-set-layer-dependency -pdf-set-leading -PDF-set-leading -pdf-setlinecap -PDF-setlinecap -pdf-setlinejoin -PDF-setlinejoin -pdf-setlinewidth -PDF-setlinewidth -pdf-setmatrix -PDF-setmatrix -pdf-setmiterlimit -PDF-setmiterlimit -pdf-set-parameter -PDF-set-parameter -pdf-setpolydash -PDF-setpolydash -pdf-setrgbcolor -PDF-setrgbcolor -pdf-setrgbcolor-fill -PDF-setrgbcolor-fill -pdf-setrgbcolor-stroke -PDF-setrgbcolor-stroke -pdf-set-text-matrix -PDF-set-text-matrix -pdf-set-text-pos -PDF-set-text-pos -pdf-set-text-rendering -PDF-set-text-rendering -pdf-set-text-rise -PDF-set-text-rise -pdf-set-value -PDF-set-value -pdf-set-word-spacing -PDF-set-word-spacing -pdf-shading -PDF-shading -pdf-shading-pattern -PDF-shading-pattern -pdf-shfill -PDF-shfill -pdf-show -PDF-show -pdf-show-boxed -PDF-show-boxed -pdf-show-xy -PDF-show-xy -pdf-skew -PDF-skew -pdf-stringwidth -PDF-stringwidth -pdf-stroke -PDF-stroke -pdf-suspend-page -PDF-suspend-page -pdf-translate -PDF-translate -pdf-utf16-to-utf8 -PDF-utf16-to-utf8 -pdf-utf32-to-utf16 -PDF-utf32-to-utf16 -pdf-utf8-to-utf16 -PDF-utf8-to-utf16 -pdo-drivers -pfsockopen -pg-affected-rows -pg-async-connect -pg-cancel-query -pg-client-encoding -pg-close -pg-cmdtuples -pg-connect -pg-connection-busy -pg-connection-pool-stat -pg-connection-pool-sweep-free -pg-connection-reset -pg-connection-status -pg-connect-poll -pg-consume-input -pg-convert -pg-copy-from -pg-copy-to -pg-dbname -pg-delete -pg-end-copy -pg-errormessage -pg-escape-bytea -pg-escape-identifier -pg-escape-literal -pg-escape-string -pg-exec -pg-execute -pg-fetch-all -pg-fetch-all-columns -pg-fetch-array -pg-fetch-assoc -pg-fetch-object -pg-fetch-result -pg-fetch-row -pg-field-is-null -pg-fieldname -pg-field-name -pg-field-num -pg-field-prtlen -pg-fieldsize -pg-field-size -pg-field-table -pg-fieldtype -pg-field-type -pg-field-type-oid -pg-flush -pg-freeresult -pg-free-result -pg-getlastoid -pg-get-notify -pg-get-pid -pg-get-result -pg-host -pg-insert -pg-last-error -pg-last-notice -pg-last-oid -pg-lo-close -pg-lo-create -pg-lo-export -pg-lo-import -pg-lo-open -pg-lo-read -pg-lo-read-all -pg-lo-seek -pg-lo-tell -pg-lo-truncate -pg-lo-unlink -pg-lo-write -pg-meta-data -pg-numfields -pg-num-fields -pg-numrows -pg-num-rows -pg-options -pg-parameter-status -pg-pconnect -pg-ping -pg-port -pg-prepare -pg-put-line -pg-query -pg-query-params -pg-result-error -pg-result-error-field -pg-result-seek -pg-result-status -pg-select -pg-send-execute -pg-send-prepare -pg-send-query -pg-send-query-params -pg-set-client-encoding -pg-set-error-verbosity -pg-socket -pg-trace -pg-transaction-status -pg-tty -pg-unescape-bytea -pg-untrace -pg-update -pg-version -php-check-syntax -phpcredits -phpdbg-break-file -phpdbg-break-function -phpdbg-break-method -phpdbg-break-next -phpdbg-clear -phpdbg-color -phpdbg-end-oplog -phpdbg-exec -phpdbg-get-executable -phpdbg-prompt -phpdbg-start-oplog -phpinfo -php-ini-loaded-file -php-ini-scanned-files -php-logo-guid -php-sapi-name -php-strip-whitespace -php-uname -phpversion -pi -pixelgetalpha -pixelgetalphaquantum -pixelgetblack -pixelgetblackquantum -pixelgetblue -pixelgetbluequantum -pixelgetcolorasstring -pixelgetcolorcount -pixelgetcyan -pixelgetcyanquantum -pixelgetexception -pixelgetexceptionstring -pixelgetexceptiontype -pixelgetgreen -pixelgetgreenquantum -pixelgetindex -pixelgetiteratorexception -pixelgetiteratorexceptionstring -pixelgetiteratorexceptiontype -pixelgetmagenta -pixelgetmagentaquantum -pixelgetnextiteratorrow -pixelgetopacity -pixelgetopacityquantum -pixelgetpreviousiteratorrow -pixelgetquantumcolor -pixelgetred -pixelgetredquantum -pixelgetyellow -pixelgetyellowquantum -pixelresetiterator -pixelsetalpha -pixelsetalphaquantum -pixelsetblack -pixelsetblackquantum -pixelsetblue -pixelsetbluequantum -pixelsetcolor -pixelsetcolorcount -pixelsetcyan -pixelsetcyanquantum -pixelsetfirstiteratorrow -pixelsetgreen -pixelsetgreenquantum -pixelsetindex -pixelsetiteratorrow -pixelsetlastiteratorrow -pixelsetmagenta -pixelsetmagentaquantum -pixelsetopacity -pixelsetopacityquantum -pixelsetquantumcolor -pixelsetred -pixelsetredquantum -pixelsetyellow -pixelsetyellowquantum -pixelsynciterator -png2wbmp -popdrawingwand -popen -pos -posix-access -posix-ctermid -posix-errno -posix-getcwd -posix-getegid -posix-geteuid -posix-getgid -posix-getgrgid -posix-getgrnam -posix-getgroups -posix-get-last-error -posix-getlogin -posix-getpgid -posix-getpgrp -posix-getpid -posix-getppid -posix-getpwnam -posix-getpwuid -posix-getrlimit -posix-getsid -posix-getuid -posix-initgroups -posix-isatty -posix-kill -posix-mkfifo -posix-mknod -posix-setegid -posix-seteuid -posix-setgid -posix-setpgid -posix-setrlimit -posix-setsid -posix-setuid -posix-strerror -posix-times -posix-ttyname -posix-uname -pow -preg-filter -preg-grep -preg-last-error -preg-match -preg-match-all -preg-quote -preg-replace -preg-replace-callback -preg-replace-callback-array -preg-split -prev -print -printer-abort -printer-close -printer-create-brush -printer-create-dc -printer-create-font -printer-create-pen -printer-delete-brush -printer-delete-dc -printer-delete-font -printer-delete-pen -printer-draw-bmp -printer-draw-chord -printer-draw-elipse -printer-draw-line -printer-draw-pie -printer-draw-rectangle -printer-draw-roundrect -printer-draw-text -printer-end-doc -printer-end-page -printer-get-option -printer-list -printer-logical-fontheight -printer-open -printer-select-brush -printer-select-font -printer-select-pen -printer-set-option -printer-start-doc -printer-start-page -printer-write -printf -print-r -proc-close -proc-get-status -proc-nice -proc-open -proc-terminate -property-exists -ps-add-bookmark -ps-add-launchlink -ps-add-locallink -ps-add-note -ps-add-pdflink -ps-add-weblink -ps-arc -ps-arcn -ps-begin-page -ps-begin-pattern -ps-begin-template -ps-circle -ps-clip -ps-close -ps-close-image -ps-closepath -ps-closepath-stroke -ps-continue-text -ps-curveto -ps-delete -ps-end-page -ps-end-pattern -ps-end-template -ps-fill -ps-fill-stroke -ps-findfont -ps-get-buffer -ps-get-parameter -ps-get-value -ps-hyphenate -ps-include-file -ps-lineto -ps-makespotcolor -ps-moveto -ps-new -ps-open-file -ps-open-image -ps-open-image-file -ps-open-memory-image -pspell-add-to-personal -pspell-add-to-session -pspell-check -pspell-clear-session -pspell-config-create -pspell-config-data-dir -pspell-config-dict-dir -pspell-config-ignore -pspell-config-mode -pspell-config-personal -pspell-config-repl -pspell-config-runtogether -pspell-config-save-repl -pspell-new -pspell-new-config -pspell-new-personal -pspell-save-wordlist -pspell-store-replacement -pspell-suggest -ps-place-image -ps-rect -ps-restore -ps-rotate -ps-save -ps-scale -ps-set-border-color -ps-set-border-dash -ps-set-border-style -ps-setcolor -ps-setdash -ps-setflat -ps-setfont -ps-setgray -ps-set-info -ps-setlinecap -ps-setlinejoin -ps-setlinewidth -ps-setmiterlimit -ps-setoverprintmode -ps-set-parameter -ps-setpolydash -ps-set-text-pos -ps-set-value -ps-shading -ps-shading-pattern -ps-shfill -ps-show -ps-show2 -ps-show-boxed -ps-show-xy -ps-show-xy2 -ps-string-geometry -ps-stringwidth -ps-stroke -ps-symbol -ps-symbol-name -ps-symbol-width -ps-translate -pushdrawingwand -putenv -px-close -px-create-fp -px-date2string -px-delete -px-delete-record -px-get-field -px-get-info -px-get-parameter -px-get-record -px-get-schema -px-get-value -px-insert-record -px-new -px-numfields -px-numrecords -px-open-fp -px-put-record -px-retrieve-record -px-set-blob-file -px-set-parameter -px-set-tablename -px-set-targetencoding -px-set-value -px-timestamp2string -px-update-record -qdom-error -qdom-tree -quoted-printable-decode -quoted-printable-encode -quotemeta -rad2deg -radius-acct-open -radius-add-server -radius-auth-open -radius-close -radius-config -radius-create-request -radius-cvt-addr -radius-cvt-int -radius-cvt-string -radius-demangle -radius-demangle-mppe-key -radius-get-attr -radius-get-tagged-attr-data -radius-get-tagged-attr-tag -radius-get-vendor-attr -radius-put-addr -radius-put-attr -radius-put-int -radius-put-string -radius-put-vendor-addr -radius-put-vendor-attr -radius-put-vendor-int -radius-put-vendor-string -radius-request-authenticator -radius-salt-encrypt-attr -radius-send-request -radius-server-secret -radius-strerror -rand -random-bytes -random-int -range -rar-broken-is -rar-close -rar-comment-get -rar-entry-get -rar-list -rar-open -rar-solid-is -rar-wrapper-cache-stats -rawurldecode -rawurlencode -readdir -read-exif-data -readfile -readgzfile -readline -readline-add-history -readline-callback-handler-install -readline-callback-handler-remove -readline-callback-read-char -readline-clear-history -readline-completion-function -readline-info -readline-list-history -readline-on-new-line -readline-read-history -readline-redisplay -readline-write-history -readlink -realpath -realpath-cache-get -realpath-cache-size -recode -recode-file -recode-string -register-shutdown-function -register-tick-function -rename -rename-function -require -require-once -reset -resourcebundle-count -resourcebundle-create -resourcebundle-get -resourcebundle-get-error-code -resourcebundle-get-error-message -resourcebundle-locales -restore-error-handler -restore-exception-handler -restore-include-path -return -rewind -rewinddir -rmdir -round -rpm-close -rpm-get-tag -rpm-is-valid -rpm-open -rpm-version -rrdc-disconnect -rrd-create -rrd-error -rrd-fetch -rrd-first -rrd-graph -rrd-info -rrd-last -rrd-lastupdate -rrd-restore -rrd-tune -rrd-update -rrd-version -rrd-xport -rsort -rtrim -runkit-class-adopt -runkit-class-emancipate -runkit-constant-add -runkit-constant-redefine -runkit-constant-remove -runkit-function-add -runkit-function-copy -runkit-function-redefine -runkit-function-remove -runkit-function-rename -runkit-import -runkit-lint -runkit-lint-file -runkit-method-add -runkit-method-copy -runkit-method-redefine -runkit-method-remove -runkit-method-rename -runkit-return-value-used -Runkit-Sandbox -runkit-sandbox-output-handler -Runkit-Sandbox-Parent -runkit-superglobals -sapi-windows-cp-conv -sapi-windows-cp-get -sapi-windows-cp-is-utf8 -sapi-windows-cp-set -sapi-windows-vt100-support -scandir -seaslog-get-author -seaslog-get-version -sem-acquire -sem-get -sem-release -sem-remove -serialize -session-abort -session-cache-expire -session-cache-limiter -session-commit -session-create-id -session-decode -session-destroy -session-encode -session-gc -session-get-cookie-params -session-id -session-is-registered -session-module-name -session-name -session-pgsql-add-error -session-pgsql-get-error -session-pgsql-get-field -session-pgsql-reset -session-pgsql-set-field -session-pgsql-status -session-regenerate-id -session-register -session-register-shutdown -session-reset -session-save-path -session-set-cookie-params -session-set-save-handler -session-start -session-status -session-unregister -session-unset -session-write-close -setcookie -set-error-handler -set-exception-handler -set-file-buffer -set-include-path -setlocale -set-magic-quotes-runtime -setproctitle -setrawcookie -set-socket-blocking -setthreadtitle -set-time-limit -settype -sha1 -sha1-file -shell-exec -shm-attach -shm-detach -shm-get-var -shm-has-var -shmop-close -shmop-delete -shmop-open -shmop-read -shmop-size -shmop-write -shm-put-var -shm-remove -shm-remove-var -show-source -shuffle -signeurlpaiement -similar-text -simplexml-import-dom -simplexml-load-file -simplexml-load-string -sin -sinh -sizeof -sleep -snmp2-get -snmp2-getnext -snmp2-real-walk -snmp2-set -snmp2-walk -snmp3-get -snmp3-getnext -snmp3-real-walk -snmp3-set -snmp3-walk -snmpget -snmpgetnext -snmp-get-quick-print -snmp-get-valueretrieval -snmp-read-mib -snmprealwalk -snmpset -snmp-set-enum-print -snmp-set-oid-numeric-print -snmp-set-oid-output-format -snmp-set-quick-print -snmp-set-valueretrieval -snmpwalk -snmpwalkoid -socket-accept -socket-addrinfo-bind -socket-addrinfo-connect -socket-addrinfo-explain -socket-addrinfo-lookup -socket-bind -socket-clear-error -socket-close -socket-cmsg-space -socket-connect -socket-create -socket-create-listen -socket-create-pair -socket-export-stream -socket-getopt -socket-get-option -socket-getpeername -socket-getsockname -socket-get-status -socket-import-stream -socket-last-error -socket-listen -socket-read -socket-recv -socket-recvfrom -socket-recvmsg -socket-select -socket-send -socket-sendmsg -socket-sendto -socket-set-block -socket-set-blocking -socket-set-nonblock -socket-setopt -socket-set-option -socket-set-timeout -socket-shutdown -socket-strerror -socket-write -socket-wsaprotocol-info-export -socket-wsaprotocol-info-import -socket-wsaprotocol-info-release -sodium-add -sodium-base642bin -sodium-bin2base64 -sodium-bin2hex -sodium-compare -sodium-crypto-aead-aes256gcm-decrypt -sodium-crypto-aead-aes256gcm-encrypt -sodium-crypto-aead-aes256gcm-is-available -sodium-crypto-aead-aes256gcm-keygen -sodium-crypto-aead-chacha20poly1305-decrypt -sodium-crypto-aead-chacha20poly1305-encrypt -sodium-crypto-aead-chacha20poly1305-ietf-decrypt -sodium-crypto-aead-chacha20poly1305-ietf-encrypt -sodium-crypto-aead-chacha20poly1305-ietf-keygen -sodium-crypto-aead-chacha20poly1305-keygen -sodium-crypto-aead-xchacha20poly1305-ietf-decrypt -sodium-crypto-aead-xchacha20poly1305-ietf-encrypt -sodium-crypto-aead-xchacha20poly1305-ietf-keygen -sodium-crypto-auth -sodium-crypto-auth-keygen -sodium-crypto-auth-verify -sodium-crypto-box -sodium-crypto-box-keypair -sodium-crypto-box-keypair-from-secretkey-and-publickey -sodium-crypto-box-open -sodium-crypto-box-publickey -sodium-crypto-box-publickey-from-secretkey -sodium-crypto-box-seal -sodium-crypto-box-seal-open -sodium-crypto-box-secretkey -sodium-crypto-box-seed-keypair -sodium-crypto-generichash -sodium-crypto-generichash-final -sodium-crypto-generichash-init -sodium-crypto-generichash-keygen -sodium-crypto-generichash-update -sodium-crypto-kdf-derive-from-key -sodium-crypto-kdf-keygen -sodium-crypto-kx-client-session-keys -sodium-crypto-kx-keypair -sodium-crypto-kx-publickey -sodium-crypto-kx-secretkey -sodium-crypto-kx-seed-keypair -sodium-crypto-kx-server-session-keys -sodium-crypto-pwhash -sodium-crypto-pwhash-scryptsalsa208sha256 -sodium-crypto-pwhash-scryptsalsa208sha256-str -sodium-crypto-pwhash-scryptsalsa208sha256-str-verify -sodium-crypto-pwhash-str -sodium-crypto-pwhash-str-needs-rehash -sodium-crypto-pwhash-str-verify -sodium-crypto-scalarmult -sodium-crypto-scalarmult-base -sodium-crypto-secretbox -sodium-crypto-secretbox-keygen -sodium-crypto-secretbox-open -sodium-crypto-secretstream-xchacha20poly1305-init-pull -sodium-crypto-secretstream-xchacha20poly1305-init-push -sodium-crypto-secretstream-xchacha20poly1305-keygen -sodium-crypto-secretstream-xchacha20poly1305-pull -sodium-crypto-secretstream-xchacha20poly1305-push -sodium-crypto-secretstream-xchacha20poly1305-rekey -sodium-crypto-shorthash -sodium-crypto-shorthash-keygen -sodium-crypto-sign -sodium-crypto-sign-detached -sodium-crypto-sign-ed25519-pk-to-curve25519 -sodium-crypto-sign-ed25519-sk-to-curve25519 -sodium-crypto-sign-keypair -sodium-crypto-sign-keypair-from-secretkey-and-publickey -sodium-crypto-sign-open -sodium-crypto-sign-publickey -sodium-crypto-sign-publickey-from-secretkey -sodium-crypto-sign-secretkey -sodium-crypto-sign-seed-keypair -sodium-crypto-sign-verify-detached -sodium-crypto-stream -sodium-crypto-stream-keygen -sodium-crypto-stream-xor -sodium-hex2bin -sodium-increment -sodium-memcmp -sodium-memzero -sodium-pad -sodium-unpad -solr-get-version -sort -soundex -spl-autoload -spl-autoload-call -spl-autoload-extensions -spl-autoload-functions -spl-autoload-register -spl-autoload-unregister -spl-classes -split -spliti -spl-object-hash -spl-object-id -sprintf -sqlite-array-query -sqlite-busy-timeout -sqlite-changes -sqlite-close -sqlite-column -sqlite-create-aggregate -sqlite-create-function -sqlite-current -sqlite-error-string -sqlite-escape-string -sqlite-exec -sqlite-factory -sqlite-fetch-all -sqlite-fetch-array -sqlite-fetch-column-types -sqlite-fetch-object -sqlite-fetch-single -sqlite-fetch-string -sqlite-field-name -sqlite-has-more -sqlite-has-prev -sqlite-key -sqlite-last-error -sqlite-last-insert-rowid -sqlite-libencoding -sqlite-libversion -sqlite-next -sqlite-num-fields -sqlite-num-rows -sqlite-open -sqlite-popen -sqlite-prev -sqlite-query -sqlite-rewind -sqlite-seek -sqlite-single-query -sqlite-udf-decode-binary -sqlite-udf-encode-binary -sqlite-unbuffered-query -sqlite-valid -sql-regcase -sqlsrv-begin-transaction -sqlsrv-cancel -sqlsrv-client-info -sqlsrv-close -sqlsrv-commit -sqlsrv-configure -sqlsrv-connect -sqlsrv-errors -sqlsrv-execute -sqlsrv-fetch -sqlsrv-fetch-array -sqlsrv-fetch-object -sqlsrv-field-metadata -sqlsrv-free-stmt -sqlsrv-get-config -sqlsrv-get-field -sqlsrv-has-rows -sqlsrv-next-result -sqlsrv-num-fields -sqlsrv-num-rows -sqlsrv-prepare -sqlsrv-query -sqlsrv-rollback -sqlsrv-rows-affected -sqlsrv-send-stream-data -sqlsrv-server-info -sqrt -srand -sscanf -ssdeep-fuzzy-compare -ssdeep-fuzzy-hash -ssdeep-fuzzy-hash-filename -ssh2-auth-agent -ssh2-auth-hostbased-file -ssh2-auth-none -ssh2-auth-password -ssh2-auth-pubkey-file -ssh2-connect -ssh2-disconnect -ssh2-exec -ssh2-fetch-stream -ssh2-fingerprint -ssh2-methods-negotiated -ssh2-publickey-add -ssh2-publickey-init -ssh2-publickey-list -ssh2-publickey-remove -ssh2-scp-recv -ssh2-scp-send -ssh2-sftp -ssh2-sftp-chmod -ssh2-sftp-lstat -ssh2-sftp-mkdir -ssh2-sftp-readlink -ssh2-sftp-realpath -ssh2-sftp-rename -ssh2-sftp-rmdir -ssh2-sftp-stat -ssh2-sftp-symlink -ssh2-sftp-unlink -ssh2-shell -ssh2-tunnel -stat -stats-absolute-deviation -stats-cdf-beta -stats-cdf-binomial -stats-cdf-cauchy -stats-cdf-chisquare -stats-cdf-exponential -stats-cdf-f -stats-cdf-gamma -stats-cdf-laplace -stats-cdf-logistic -stats-cdf-negative-binomial -stats-cdf-noncentral-chisquare -stats-cdf-noncentral-f -stats-cdf-noncentral-t -stats-cdf-normal -stats-cdf-poisson -stats-cdf-t -stats-cdf-uniform -stats-cdf-weibull -stats-covariance -stats-dens-beta -stats-dens-cauchy -stats-dens-chisquare -stats-dens-exponential -stats-dens-f -stats-dens-gamma -stats-dens-laplace -stats-dens-logistic -stats-dens-negative-binomial -stats-dens-normal -stats-dens-pmf-binomial -stats-dens-pmf-hypergeometric -stats-dens-pmf-negative-binomial -stats-dens-pmf-poisson -stats-dens-t -stats-dens-uniform -stats-dens-weibull -stats-den-uniform -stats-harmonic-mean -stats-kurtosis -stats-rand-gen-beta -stats-rand-gen-chisquare -stats-rand-gen-exponential -stats-rand-gen-f -stats-rand-gen-funiform -stats-rand-gen-gamma -stats-rand-gen-ibinomial -stats-rand-gen-ibinomial-negative -stats-rand-gen-int -stats-rand-gen-ipoisson -stats-rand-gen-iuniform -stats-rand-gen-noncenral-chisquare -stats-rand-gen-noncentral-chisquare -stats-rand-gen-noncentral-f -stats-rand-gen-noncentral-t -stats-rand-gen-normal -stats-rand-gen-t -stats-rand-get-seeds -stats-rand-phrase-to-seeds -stats-rand-ranf -stats-rand-setall -stats-skew -stats-standard-deviation -stats-stat-binomial-coef -stats-stat-correlation -stats-stat-factorial -stats-stat-gennch -stats-stat-independent-t -stats-stat-innerproduct -stats-stat-noncentral-t -stats-stat-paired-t -stats-stat-percentile -stats-stat-powersum -stats-variance -stomp-abort -stomp-ack -stomp-begin -stomp-close -stomp-commit -stomp-connect -stomp-connect-error -stomp-error -stomp-get-read-timeout -stomp-get-session-id -stomp-has-frame -stomp-read-frame -stomp-send -stomp-set-read-timeout -stomp-subscribe -stomp-unsubscribe -stomp-version -strcasecmp -strchr -strcmp -strcoll -strcspn -stream-bucket-append -stream-bucket-make-writeable -stream-bucket-new -stream-bucket-prepend -stream-context-create -stream-context-get-default -stream-context-get-options -stream-context-get-params -stream-context-set-default -stream-context-set-option -stream-context-set-params -stream-copy-to-stream -stream-encoding -stream-filter-append -stream-filter-prepend -stream-filter-register -stream-filter-remove -stream-get-contents -stream-get-filters -stream-get-line -stream-get-meta-data -stream-get-transports -stream-get-wrappers -stream-isatty -stream-is-local -stream-notification-callback -stream-register-wrapper -stream-resolve-include-path -stream-select -stream-set-blocking -stream-set-chunk-size -stream-set-read-buffer -stream-set-timeout -stream-set-write-buffer -stream-socket-accept -stream-socket-client -stream-socket-enable-crypto -stream-socket-get-name -stream-socket-pair -stream-socket-recvfrom -stream-socket-sendto -stream-socket-server -stream-socket-shutdown -stream-supports-lock -stream-wrapper-register -stream-wrapper-restore -stream-wrapper-unregister -strftime -str-getcsv -stripcslashes -stripos -stripslashes -strip-tags -str-ireplace -stristr -strlen -strnatcasecmp -strnatcmp -strncasecmp -strncmp -str-pad -strpbrk -strpos -strptime -strrchr -str-repeat -str-replace -strrev -strripos -str-rot13 -strrpos -str-shuffle -str-split -strspn -strstr -strtok -strtolower -strtotime -strtoupper -strtr -strval -str-word-count -substr -substr-compare -substr-count -substr-replace -Superglobals -svn-add -svn-auth-get-parameter -svn-auth-set-parameter -svn-blame -svn-cat -svn-checkout -svn-cleanup -svn-client-version -svn-commit -svn-delete -svn-diff -svn-export -svn-fs-abort-txn -svn-fs-apply-text -svn-fs-begin-txn2 -svn-fs-change-node-prop -svn-fs-check-path -svn-fs-contents-changed -svn-fs-copy -svn-fs-delete -svn-fs-dir-entries -svn-fs-file-contents -svn-fs-file-length -svn-fs-is-dir -svn-fs-is-file -svn-fs-make-dir -svn-fs-make-file -svn-fs-node-created-rev -svn-fs-node-prop -svn-fs-props-changed -svn-fs-revision-prop -svn-fs-revision-root -svn-fs-txn-root -svn-fs-youngest-rev -svn-import -svn-log -svn-ls -svn-mkdir -svn-repos-create -svn-repos-fs -svn-repos-fs-begin-txn-for-commit -svn-repos-fs-commit-txn -svn-repos-hotcopy -svn-repos-open -svn-repos-recover -svn-revert -svn-status -svn-update -swf-actiongeturl -swf-actiongotoframe -swf-actiongotolabel -swf-actionnextframe -swf-actionplay -swf-actionprevframe -swf-actionsettarget -swf-actionstop -swf-actiontogglequality -swf-actionwaitforframe -swf-addbuttonrecord -swf-addcolor -swf-closefile -swf-definebitmap -swf-definefont -swf-defineline -swf-definepoly -swf-definerect -swf-definetext -swf-endbutton -swf-enddoaction -swf-endshape -swf-endsymbol -swf-fontsize -swf-fontslant -swf-fonttracking -swf-getbitmapinfo -swf-getfontinfo -swf-getframe -swf-labelframe -swf-lookat -swf-modifyobject -swf-mulcolor -swf-nextid -swf-oncondition -swf-openfile -swf-ortho -swf-ortho2 -swf-perspective -swf-placeobject -swf-polarview -swf-popmatrix -swf-posround -swf-pushmatrix -swf-removeobject -swf-rotate -swf-scale -swf-setfont -swf-setframe -swf-shapearc -swf-shapecurveto -swf-shapecurveto3 -swf-shapefillbitmapclip -swf-shapefillbitmaptile -swf-shapefilloff -swf-shapefillsolid -swf-shapelinesolid -swf-shapelineto -swf-shapemoveto -swf-showframe -swf-startbutton -swf-startdoaction -swf-startshape -swf-startsymbol -swf-textwidth -swf-translate -swf-viewport -swoole-async-dns-lookup -swoole-async-read -swoole-async-readfile -swoole-async-set -swoole-async-write -swoole-async-writefile -swoole-client-select -swoole-cpu-num -swoole-errno -swoole-event-add -swoole-event-defer -swoole-event-del -swoole-event-exit -swoole-event-set -swoole-event-wait -swoole-event-write -swoole-get-local-ip -swoole-last-error -swoole-load-module -swoole-select -swoole-set-process-name -swoole-strerror -swoole-timer-after -swoole-timer-clear -swoole-timer-exists -swoole-timer-tick -swoole-version -sybase-affected-rows -sybase-close -sybase-connect -sybase-data-seek -sybase-deadlock-retry-count -sybase-fetch-array -sybase-fetch-assoc -sybase-fetch-field -sybase-fetch-object -sybase-fetch-row -sybase-field-seek -sybase-free-result -sybase-get-last-message -sybase-min-client-severity -sybase-min-error-severity -sybase-min-message-severity -sybase-min-server-severity -sybase-num-fields -sybase-num-rows -sybase-pconnect -sybase-query -sybase-result -sybase-select-db -sybase-set-message-handler -sybase-unbuffered-query -symlink -sys-getloadavg -sys-get-temp-dir -syslog -system -taint -tan -tanh -tcpwrap-check -tempnam -textdomain -tidy-access-count -tidy-clean-repair -tidy-config-count -tidy-diagnose -tidy-error-count -tidy-get-body -tidy-get-config -tidy-get-error-buffer -tidy-get-head -tidy-get-html -tidy-get-html-ver -tidy-getopt -tidy-get-opt-doc -tidy-get-output -tidy-get-release -tidy-get-root -tidy-get-status -tidy-is-xhtml -tidy-is-xml -tidy-load-config -tidy-parse-file -tidy-parse-string -tidy-repair-file -tidy-repair-string -tidy-reset-config -tidy-save-config -tidy-set-encoding -tidy-setopt -tidy-warning-count -time -time-nanosleep -time-sleep-until -timezone-abbreviations-list -timezone-identifiers-list -timezone-location-get -timezone-name-from-abbr -timezone-name-get -timezone-offset-get -timezone-open -timezone-transitions-get -timezone-version-get -tmpfile -token-get-all -token-name -touch -trader-acos -trader-ad -trader-add -trader-adosc -trader-adx -trader-adxr -trader-apo -trader-aroon -trader-aroonosc -trader-asin -trader-atan -trader-atr -trader-avgprice -trader-bbands -trader-beta -trader-bop -trader-cci -trader-cdl2crows -trader-cdl3blackcrows -trader-cdl3inside -trader-cdl3linestrike -trader-cdl3outside -trader-cdl3starsinsouth -trader-cdl3whitesoldiers -trader-cdlabandonedbaby -trader-cdladvanceblock -trader-cdlbelthold -trader-cdlbreakaway -trader-cdlclosingmarubozu -trader-cdlconcealbabyswall -trader-cdlcounterattack -trader-cdldarkcloudcover -trader-cdldoji -trader-cdldojistar -trader-cdldragonflydoji -trader-cdlengulfing -trader-cdleveningdojistar -trader-cdleveningstar -trader-cdlgapsidesidewhite -trader-cdlgravestonedoji -trader-cdlhammer -trader-cdlhangingman -trader-cdlharami -trader-cdlharamicross -trader-cdlhighwave -trader-cdlhikkake -trader-cdlhikkakemod -trader-cdlhomingpigeon -trader-cdlidentical3crows -trader-cdlinneck -trader-cdlinvertedhammer -trader-cdlkicking -trader-cdlkickingbylength -trader-cdlladderbottom -trader-cdllongleggeddoji -trader-cdllongline -trader-cdlmarubozu -trader-cdlmatchinglow -trader-cdlmathold -trader-cdlmorningdojistar -trader-cdlmorningstar -trader-cdlonneck -trader-cdlpiercing -trader-cdlrickshawman -trader-cdlrisefall3methods -trader-cdlseparatinglines -trader-cdlshootingstar -trader-cdlshortline -trader-cdlspinningtop -trader-cdlstalledpattern -trader-cdlsticksandwich -trader-cdltakuri -trader-cdltasukigap -trader-cdlthrusting -trader-cdltristar -trader-cdlunique3river -trader-cdlupsidegap2crows -trader-cdlxsidegap3methods -trader-ceil -trader-cmo -trader-correl -trader-cos -trader-cosh -trader-dema -trader-div -trader-dx -trader-ema -trader-errno -trader-exp -trader-floor -trader-get-compat -trader-get-unstable-period -trader-ht-dcperiod -trader-ht-dcphase -trader-ht-phasor -trader-ht-sine -trader-ht-trendline -trader-ht-trendmode -trader-kama -trader-linearreg -trader-linearreg-angle -trader-linearreg-intercept -trader-linearreg-slope -trader-ln -trader-log10 -trader-ma -trader-macd -trader-macdext -trader-macdfix -trader-mama -trader-mavp -trader-max -trader-maxindex -trader-medprice -trader-mfi -trader-midpoint -trader-midprice -trader-min -trader-minindex -trader-minmax -trader-minmaxindex -trader-minus-di -trader-minus-dm -trader-mom -trader-mult -trader-natr -trader-obv -trader-plus-di -trader-plus-dm -trader-ppo -trader-roc -trader-rocp -trader-rocr -trader-rocr100 -trader-rsi -trader-sar -trader-sarext -trader-set-compat -trader-set-unstable-period -trader-sin -trader-sinh -trader-sma -trader-sqrt -trader-stddev -trader-stoch -trader-stochf -trader-stochrsi -trader-sub -trader-sum -trader-t3 -trader-tan -trader-tanh -trader-tema -trader-trange -trader-trima -trader-trix -trader-tsf -trader-typprice -trader-ultosc -trader-var -trader-wclprice -trader-willr -trader-wma -trait-exists -transliterator-create -transliterator-create-from-rules -transliterator-create-inverse -transliterator-get-error-code -transliterator-get-error-message -transliterator-list-ids -transliterator-transliterate -trigger-error -trim -uasort -ucfirst -ucwords -udm-add-search-limit -udm-alloc-agent -udm-alloc-agent-array -udm-api-version -udm-cat-list -udm-cat-path -udm-check-charset -udm-check-stored -udm-clear-search-limits -udm-close-stored -udm-crc32 -udm-errno -udm-error -udm-find -udm-free-agent -udm-free-ispell-data -udm-free-res -udm-get-doc-count -udm-get-res-field -udm-get-res-param -udm-hash32 -udm-load-ispell-data -udm-open-stored -udm-set-agent-param -ui-draw-text-font-fontfamilies -ui-quit -ui-run -uksort -umask -uniqid -unixtojd -unlink -unpack -unregister-tick-function -unserialize -unset -untaint -uopz-add-function -uopz-allow-exit -uopz-backup -uopz-compose -uopz-copy -uopz-delete -uopz-del-function -uopz-extend -uopz-flags -uopz-function -uopz-get-exit-status -uopz-get-hook -uopz-get-mock -uopz-get-property -uopz-get-return -uopz-get-static -uopz-implement -uopz-overload -uopz-redefine -uopz-rename -uopz-restore -uopz-set-hook -uopz-set-mock -uopz-set-property -uopz-set-return -uopz-set-static -uopz-undefine -uopz-unset-hook -uopz-unset-mock -uopz-unset-return -urldecode -urlencode -user-error -use-soap-error-handler -usleep -usort -utf8-decode -utf8-encode -var-dump -var-export -variant-abs -variant-add -variant-and -variant-cast -variant-cat -variant-cmp -variant-date-from-timestamp -variant-date-to-timestamp -variant-div -variant-eqv -variant-fix -variant-get-type -variant-idiv -variant-imp -variant-int -variant-mod -variant-mul -variant-neg -variant-not -variant-or -variant-pow -variant-round -variant-set -variant-set-type -variant-sub -variant-xor -version-compare -vfprintf -virtual -vpopmail-add-alias-domain -vpopmail-add-alias-domain-ex -vpopmail-add-domain -vpopmail-add-domain-ex -vpopmail-add-user -vpopmail-alias-add -vpopmail-alias-del -vpopmail-alias-del-domain -vpopmail-alias-get -vpopmail-alias-get-all -vpopmail-auth-user -vpopmail-del-domain -vpopmail-del-domain-ex -vpopmail-del-user -vpopmail-error -vpopmail-passwd -vpopmail-set-user-quota -vprintf -vsprintf -w32api-deftype -w32api-init-dtype -w32api-invoke-function -w32api-register-function -w32api-set-call-method -wandgetexception -wandgetexceptionstring -wandgetexceptiontype -wandhasexception -wddx-add-vars -wddx-deserialize -wddx-packet-end -wddx-packet-start -wddx-serialize-value -wddx-serialize-vars -win32-continue-service -win32-create-service -win32-delete-service -win32-get-last-control-message -win32-pause-service -win32-ps-list-procs -win32-ps-stat-mem -win32-ps-stat-proc -win32-query-service-status -win32-send-custom-control -win32-set-service-exit-code -win32-set-service-exit-mode -win32-set-service-status -win32-start-service -win32-start-service-ctrl-dispatcher -win32-stop-service -wincache-fcache-fileinfo -wincache-fcache-meminfo -wincache-lock -wincache-ocache-fileinfo -wincache-ocache-meminfo -wincache-refresh-if-changed -wincache-rplist-fileinfo -wincache-rplist-meminfo -wincache-scache-info -wincache-scache-meminfo -wincache-ucache-add -wincache-ucache-cas -wincache-ucache-clear -wincache-ucache-dec -wincache-ucache-delete -wincache-ucache-exists -wincache-ucache-get -wincache-ucache-inc -wincache-ucache-info -wincache-ucache-meminfo -wincache-ucache-set -wincache-unlock -wordwrap -xattr-get -xattr-list -xattr-remove -xattr-set -xattr-supported -xdiff-file-bdiff -xdiff-file-bdiff-size -xdiff-file-bpatch -xdiff-file-diff -xdiff-file-diff-binary -xdiff-file-merge3 -xdiff-file-patch -xdiff-file-patch-binary -xdiff-file-rabdiff -xdiff-string-bdiff -xdiff-string-bdiff-size -xdiff-string-bpatch -xdiff-string-diff -xdiff-string-diff-binary -xdiff-string-merge3 -xdiff-string-patch -xdiff-string-patch-binary -xdiff-string-rabdiff -xhprof-disable -xhprof-enable -xhprof-sample-disable -xhprof-sample-enable -xml-error-string -xml-get-current-byte-index -xml-get-current-column-number -xml-get-current-line-number -xml-get-error-code -xml-parse -xml-parse-into-struct -xml-parser-create -xml-parser-create-ns -xml-parser-free -xml-parser-get-option -xml-parser-set-option -xmlrpc-decode -xmlrpc-decode-request -xmlrpc-encode -xmlrpc-encode-request -xmlrpc-get-type -xmlrpc-is-fault -xmlrpc-parse-method-descriptions -xmlrpc-server-add-introspection-data -xmlrpc-server-call-method -xmlrpc-server-create -xmlrpc-server-destroy -xmlrpc-server-register-introspection-callback -xmlrpc-server-register-method -xmlrpc-set-type -xml-set-character-data-handler -xml-set-default-handler -xml-set-element-handler -xml-set-end-namespace-decl-handler -xml-set-external-entity-ref-handler -xml-set-notation-decl-handler -xml-set-object -xml-set-processing-instruction-handler -xml-set-start-namespace-decl-handler -xml-set-unparsed-entity-decl-handler -xmlwriter-end-attribute -xmlwriter-end-cdata -xmlwriter-end-comment -xmlwriter-end-document -xmlwriter-end-dtd -xmlwriter-end-dtd-attlist -xmlwriter-end-dtd-element -xmlwriter-end-dtd-entity -xmlwriter-end-element -xmlwriter-end-pi -xmlwriter-flush -xmlwriter-full-end-element -xmlwriter-open-memory -xmlwriter-open-uri -xmlwriter-output-memory -xmlwriter-set-indent -xmlwriter-set-indent-string -xmlwriter-start-attribute -xmlwriter-start-attribute-ns -xmlwriter-start-cdata -xmlwriter-start-comment -xmlwriter-start-document -xmlwriter-start-dtd -xmlwriter-start-dtd-attlist -xmlwriter-start-dtd-element -xmlwriter-start-dtd-entity -xmlwriter-start-element -xmlwriter-start-element-ns -xmlwriter-start-pi -xmlwriter-text -xmlwriter-write-attribute -xmlwriter-write-attribute-ns -xmlwriter-write-cdata -xmlwriter-write-comment -xmlwriter-write-dtd -xmlwriter-write-dtd-attlist -xmlwriter-write-dtd-element -xmlwriter-write-dtd-entity -xmlwriter-write-element -xmlwriter-write-element-ns -xmlwriter-write-pi -xmlwriter-write-raw -xpath-eval -xpath-eval-expression -xpath-new-context -xpath-register-ns -xpath-register-ns-auto -xptr-eval -xptr-new-context -xslt-backend-info -xslt-backend-name -xslt-backend-version -xslt-create -xslt-errno -xslt-error -xslt-free -xslt-getopt -xslt-process -xslt-set-base -xslt-set-encoding -xslt-set-error-handler -xslt-set-log -xslt-set-object -xslt-setopt -xslt-set-sax-handler -xslt-set-sax-handlers -xslt-set-scheme-handler -xslt-set-scheme-handlers -yaml-emit -yaml-emit-file -yaml-parse -yaml-parse-file -yaml-parse-url -yaz-addinfo -yaz-ccl-conf -yaz-ccl-parse -yaz-close -yaz-connect -yaz-database -yaz-element -yaz-errno -yaz-error -yaz-es -yaz-es-result -yaz-get-option -yaz-hits -yaz-itemorder -yaz-present -yaz-range -yaz-record -yaz-scan -yaz-scan-result -yaz-schema -yaz-search -yaz-set-option -yaz-sort -yaz-syntax -yaz-wait -yp-all -yp-cat -yp-errno -yp-err-string -yp-first -yp-get-default-domain -yp-master -yp-match -yp-next -yp-order -zend-logo-guid -zend-thread-id -zend-version -zip-close -zip-entry-close -zip-entry-compressedsize -zip-entry-compressionmethod -zip-entry-filesize -zip-entry-name -zip-entry-open -zip-entry-read -zip-open -zip-read -zlib-decode -zlib-encode -zlib-get-coding-type -zookeeper-dispatch diff --git a/.deploy/terraform/backend.tf b/backend.tf similarity index 100% rename from .deploy/terraform/backend.tf rename to backend.tf diff --git a/bin/build.php b/bin/build.php deleted file mode 100644 index 49637fa93..000000000 --- a/bin/build.php +++ /dev/null @@ -1,100 +0,0 @@ -> -function build_site(): void { - require_once(__DIR__.'/../vendor/autoload.hack'); - \Facebook\AutoloadMap\initialize(); - - $argv = \HH\global_get('argv') as KeyedContainer<_, _> - |> Vec\drop($$, 1); - - $filters = keyset[]; - $flags = keyset[]; - foreach ($argv as $arg) { - if ($arg is BuildFlags) { - $flags[] = $arg; - } else { - $filters[] = $arg as string; - } - } - - if (!\is_dir(BuildPaths::SCRATCH_DIR)) { - \mkdir(BuildPaths::SCRATCH_DIR, 0755, /* recursive = */ true); - } - if (!\is_dir(BuildPaths::FINAL_DIR)) { - \mkdir(BuildPaths::FINAL_DIR, 0755, /* recursive = */ true); - } - - $steps = vec[ - // No Dependencies - APISourcesBuildStep::class, - PHPIniSupportInHHVMBuildStep::class, - FacebookIPRangesBuildStep::class, - // Just the API Sources - HHAPIDocBuildStep::class, - - // Needs getting the PHP ini settings HHVM supports - PHPIniSupportInHHVMMarkdownBuildStep::class, - - // Needs the YAML - GuidesIndexBuildStep::class, - - // Needs the previous indices - UnifiedAPIIndexBuildStep::class, - SiteMapBuildStep::class, - APILegacyRedirectsBuildStep::class, - - // This needs to be able to invoke static methods on the controllers; - // some of the controller files require_once() generated indicies, so the - // indices must be built before codegen can be updated. - RoutingCodegenBuildStep::class, - - // Needed by SASS - SASSDependenciesBuildStep::class, - - // Static Resources - SASSBuildStep::class, - StaticResourceMapBuildStep::class, - - // Needs the Markdown - GuidesHTMLBuildStep::class, - APIHTMLBuildStep::class, - - // Needs to be done after all Hack codegen - UpdateAutoloaderBuildStep::class, - ]; - - if (!C\is_empty($filters)) { - $steps = Vec\filter( - $steps, - $step ==> { - foreach ($filters as $filter) { - if (\stripos($step, $filter) !== false) { - return true; - } - } - return false; - }, - ); - } - - $steps = Vec\concat(vec[BuildIDBuildStep::class], $steps); - - foreach ($steps as $step) { - (new $step($flags))->buildAll(); - } - - echo "\n"; // Make the bash prompt nice after :p -} diff --git a/bin/changelog.sh b/bin/changelog.sh deleted file mode 100755 index d37471176..000000000 --- a/bin/changelog.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/sh - -RELEASES=$(git log --oneline | awk '/\[autocommit\] AWS deploy/{print $1}') - -cat <> -function dump_composer_github_oauth_token(): void { - $config = getenv('HOME').'/.composer/auth.json'; - if (!file_exists($config)) { - return; - } - $auth = json_decode( - file_get_contents($config), - /* as array = */ true, - ); - $token = @$auth['github-oauth']['github.com']; - if (is_string($token)) { - print $token."\n"; - } -} \ No newline at end of file diff --git a/bin/docs-markdown.php b/bin/docs-markdown.php deleted file mode 100755 index af2b3535a..000000000 --- a/bin/docs-markdown.php +++ /dev/null @@ -1,24 +0,0 @@ -> -function cli_markdown_render(): string { - require_once(__DIR__.'/../vendor/hh_autoload.hack'); - \Facebook\AutoloadMap\initialize(); - - $file = \HH\global_get('ARGV') as dict<_, _>['1'] ?as string ?? '/dev/stdin'; - return (new MarkdownRenderer())->renderMarkdownToHTML( - $file, - \file_get_contents($file), - ); -} \ No newline at end of file diff --git a/bin/fb-markdown.php b/bin/fb-markdown.php deleted file mode 100755 index 37475bb10..000000000 --- a/bin/fb-markdown.php +++ /dev/null @@ -1,30 +0,0 @@ -enableHTML_UNSAFE(); - $ast = parse($parser_ctx, $in); - if ((bool)\getenv('FB_GFM_DUMP_AST')) { - \var_dump($ast); - } - $render_ctx = new RenderContext(); - return (new HTMLRenderer($render_ctx))->render($ast); -} - -<<__EntryPoint>> -function cli_gfm_render_main(): void { - require_once(__DIR__.'/../vendor/hh_autoload.hack'); - \Facebook\AutoloadMap\initialize(); - print(cli_gfm_render(\file_get_contents('/dev/stdin'))); -} diff --git a/bin/rename-sections.sh b/bin/rename-sections.sh deleted file mode 100755 index 25fd6c5cf..000000000 --- a/bin/rename-sections.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh - -FROM=$1 -TO=$2 - -if [ -z "$FROM" -o -z "$TO" ]; then - cat < - -e.g. $0 4 7 would rename sections 04 through 07 to 05 through 08 -EOF - exit 1 -fi - -for i in $(seq $TO -1 $FROM); do - if [ $i -lt 10 ]; then - NAME_PREFIX=0$i - else - NAME_PREFIX=$i - fi - for file in $NAME_PREFIX*; do - git mv $file $(echo $file | sed "s/$i/$(($i + 1))/"); - done; -done diff --git a/bin/update-versions b/bin/update-versions deleted file mode 100755 index 787d3a793..000000000 --- a/bin/update-versions +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env hhvm -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -// As this file does not have an extension, it is not typechecked. Delegate -// to the typechecked one. -<<__EntryPoint>> -async function update_versions_main_async_UNSAFE(): Awaitable { - require_once(__DIR__.'/update-versions.hack'); - await update_versions_main_async(); -} diff --git a/bin/update-versions.hack b/bin/update-versions.hack deleted file mode 100755 index 7989772a4..000000000 --- a/bin/update-versions.hack +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env hhvm -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -<<__EntryPoint>> -async function update_versions_main_async(): Awaitable { - $root = \realpath(__DIR__.'/..'); - $found_autoloader = false; - while (true) { - $autoloader = $root.'/vendor/autoload.hack'; - if (\file_exists($autoloader)) { - $found_autoloader = true; - require_once($autoloader); - \Facebook\AutoloadMap\initialize(); - break; - } - if ($root === '') { - break; - } - $parts = \explode('/', $root); - \array_pop(inout $parts); - $root = \implode('/', $parts); - } - - if (!$found_autoloader) { - \fprintf(\STDERR, "Failed to find autoloader.\n"); - exit(1); - } - - $result = await UpdateTagsCLI::runAsync(); - exit($result); -} diff --git a/build/final/codegen/.gitkeep b/build/final/codegen/.gitkeep deleted file mode 100644 index 584feef27..000000000 --- a/build/final/codegen/.gitkeep +++ /dev/null @@ -1 +0,0 @@ -Needed for autoloader diff --git a/composer.json b/composer.json deleted file mode 100644 index fcd867f6f..000000000 --- a/composer.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "require": { - "facebook/xhp-lib": "^4.0", - "hhvm": "4.164.*", - "usox/hackttp": "~0.5.3", - "hhvm/hhvm-autoload": "^3.0", - "hhvm/type-assert": "^4.0", - "facebook/hack-codegen": "^4.0", - "facebook/hack-router-codegen": ">=0.14 <1.0", - "facebook/hack-router": ">= 0.18 <1.0", - "hhvm/hsl": "^4.25", - "hhvm/hsl-experimental": "^4.93", - "facebook/fbmarkdown": "^1.0", - "facebook/hh-apidoc": "^0.8" - }, - "require-dev": { - "hhvm/hhast": "^4.0", - "facebook/definition-finder": "^2.0.0", - "hhvm/hacktest": "^2.0", - "facebook/fbexpect": "^2.6.1" - }, - "scripts": { - "post-install-cmd": "patch --dry-run -Rf -p1 -i hackttp.patch || patch -p1 -i hackttp.patch", - "post-update-cmd": "patch --dry-run -Rf -p1 -i hackttp.patch || patch -p1 -i hackttp.patch" - }, - "config": { - "allow-plugins": { - "hhvm/hhvm-autoload": true - } - } -} diff --git a/composer.lock b/composer.lock deleted file mode 100644 index 1bea45e8a..000000000 --- a/composer.lock +++ /dev/null @@ -1,922 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "e3eeab008cf9fa37ad524894c7f2372c", - "packages": [ - { - "name": "facebook/definition-finder", - "version": "v2.16.0", - "source": { - "type": "git", - "url": "https://github.com/hhvm/definition-finder.git", - "reference": "c26866aed73922c3657f5faebb0dfc2d36b519b2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hhvm/definition-finder/zipball/c26866aed73922c3657f5faebb0dfc2d36b519b2", - "reference": "c26866aed73922c3657f5faebb0dfc2d36b519b2", - "shasum": "" - }, - "require": { - "hhvm": "^4.158", - "hhvm/hhast": "^4.158", - "hhvm/type-assert": "^3.2|^4.0" - }, - "require-dev": { - "facebook/fbexpect": "^2.6.1", - "hhvm/hacktest": "^2.0", - "hhvm/hhvm-autoload": "^2.0|^3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev", - "dev-main": "2.x-dev" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Find definitions in PHP or Hack files. Useful for autoloaders.", - "homepage": "https://github.com/hhvm/definitions-finder", - "keywords": [ - "autoload", - "definitions", - "hack", - "hhvm" - ], - "support": { - "issues": "https://github.com/hhvm/definition-finder/issues", - "source": "https://github.com/hhvm/definition-finder/tree/v2.16.0" - }, - "time": "2022-04-21T18:51:47+00:00" - }, - { - "name": "facebook/difflib", - "version": "v1.3.0", - "source": { - "type": "git", - "url": "https://github.com/hhvm/difflib.git", - "reference": "97bb1df49ac7b6fe14a5da75a08a52ec59dcd77f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hhvm/difflib/zipball/97bb1df49ac7b6fe14a5da75a08a52ec59dcd77f", - "reference": "97bb1df49ac7b6fe14a5da75a08a52ec59dcd77f", - "shasum": "" - }, - "require": { - "hhvm": "^4.56", - "hhvm/hsl": "^4.0" - }, - "require-dev": { - "facebook/fbexpect": "^2.1.2", - "hhvm/hacktest": "^2.0", - "hhvm/hhast": "^4.0", - "hhvm/hhvm-autoload": "^2.0|^3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev", - "dev-CI_current_pull_request": "1.x-dev" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "support": { - "issues": "https://github.com/hhvm/difflib/issues", - "source": "https://github.com/hhvm/difflib/tree/v1.3.0" - }, - "time": "2021-09-27T22:08:35+00:00" - }, - { - "name": "facebook/fbmarkdown", - "version": "v1.6.6", - "source": { - "type": "git", - "url": "https://github.com/hhvm/fbmarkdown.git", - "reference": "306614c26cfcb00425c17c7a20af7831784826b9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hhvm/fbmarkdown/zipball/306614c26cfcb00425c17c7a20af7831784826b9", - "reference": "306614c26cfcb00425c17c7a20af7831784826b9", - "shasum": "" - }, - "require": { - "hhvm": "^4.128", - "hhvm/type-assert": "^3.1|^4.0" - }, - "require-dev": { - "facebook/fbexpect": "^2.1.0", - "hhvm/hacktest": "^2.0", - "hhvm/hhast": "^4.0", - "hhvm/hhvm-autoload": "^2.0|^3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev", - "dev-main": "1.x-dev" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Markdown parser and renderer for Hack", - "keywords": [ - "facebook", - "gfm", - "hack", - "markdown" - ], - "support": { - "issues": "https://github.com/hhvm/fbmarkdown/issues", - "source": "https://github.com/hhvm/fbmarkdown/tree/v1.6.6" - }, - "time": "2022-05-06T22:33:19+00:00" - }, - { - "name": "facebook/hack-codegen", - "version": "v4.5.1", - "source": { - "type": "git", - "url": "https://github.com/hhvm/hack-codegen.git", - "reference": "8a67f08a0a729fa4aa16d6bb183955055a4bde6f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hhvm/hack-codegen/zipball/8a67f08a0a729fa4aa16d6bb183955055a4bde6f", - "reference": "8a67f08a0a729fa4aa16d6bb183955055a4bde6f", - "shasum": "" - }, - "require": { - "hhvm": "^4.128" - }, - "require-dev": { - "facebook/difflib": "^1.0", - "facebook/fbexpect": "^2.6.1", - "hhvm/hacktest": "^2.0", - "hhvm/hhast": "^4.80", - "hhvm/hhvm-autoload": "^2.0|^3.0", - "hhvm/hsl-experimental": "^4.53", - "hhvm/type-assert": "^3.1|^4.0" - }, - "bin": [ - "bin/hh-codegen-verify-signatures", - "bin/hh-codegen-verify-signatures.hack" - ], - "type": "library", - "notification-url": "https://packagist.org/downloads/", - "authors": [ - { - "name": "Fred Emmott", - "role": "Developer" - }, - { - "name": "Drew Hoskins", - "role": "Developer" - }, - { - "name": "Gaurav Kumar", - "role": "Developer" - }, - { - "name": "Alejandro Marcu", - "role": "Developer" - }, - { - "name": "Matthieu Martin", - "role": "Developer" - } - ], - "description": "Hack Codegen is a library for programmatically generating Hack code", - "keywords": [ - "code generation", - "hack" - ], - "support": { - "issues": "https://github.com/hhvm/hack-codegen/issues", - "source": "https://github.com/hhvm/hack-codegen/tree/v4.5.1" - }, - "time": "2022-06-06T17:05:49+00:00" - }, - { - "name": "facebook/hack-http-request-response-interfaces", - "version": "v0.3", - "source": { - "type": "git", - "url": "https://github.com/hhvm/hack-http-request-response-interfaces.git", - "reference": "29f976830af6b2fdb716037ee1fd10bb2e57c6cd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hhvm/hack-http-request-response-interfaces/zipball/29f976830af6b2fdb716037ee1fd10bb2e57c6cd", - "reference": "29f976830af6b2fdb716037ee1fd10bb2e57c6cd", - "shasum": "" - }, - "require": { - "hhvm/hsl-experimental": "^4.50" - }, - "require-dev": { - "hhvm/hhast": "^4.0" - }, - "type": "library", - "notification-url": "https://packagist.org/downloads/", - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/facebookexperimental/hack-http-request-response-interfaces", - "support": { - "issues": "https://github.com/hhvm/hack-http-request-response-interfaces/issues", - "source": "https://github.com/hhvm/hack-http-request-response-interfaces/tree/master" - }, - "time": "2020-03-30T21:06:56+00:00" - }, - { - "name": "facebook/hack-router", - "version": "v0.19.9", - "source": { - "type": "git", - "url": "https://github.com/hhvm/hack-router.git", - "reference": "7d6c10190a89746eb39d8ae8ce9a142edd1eef73" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hhvm/hack-router/zipball/7d6c10190a89746eb39d8ae8ce9a142edd1eef73", - "reference": "7d6c10190a89746eb39d8ae8ce9a142edd1eef73", - "shasum": "" - }, - "require": { - "facebook/hack-http-request-response-interfaces": "^0.2|^0.3", - "hhvm": "^4.25", - "hhvm/hsl": "^4.0" - }, - "require-dev": { - "facebook/fbexpect": "^2.0", - "hhvm/hacktest": "^2.0", - "hhvm/hhast": "^4.0", - "hhvm/hhvm-autoload": "^2.0.8|^3.0", - "usox/hackttp": "^0.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev", - "dev-main": "1.x-dev" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "URI routing for Hack", - "homepage": "https://github.com/hhvm/hack-router", - "keywords": [ - "hack", - "hhvm", - "router", - "routing" - ], - "support": { - "issues": "https://github.com/hhvm/hack-router/issues", - "source": "https://github.com/hhvm/hack-router/tree/v0.19.9" - }, - "time": "2021-11-18T21:02:38+00:00" - }, - { - "name": "facebook/hack-router-codegen", - "version": "v0.18.0", - "source": { - "type": "git", - "url": "https://github.com/hhvm/hack-router-codegen.git", - "reference": "1bab745d158f14535fc73ad801f4b135f07c2af7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hhvm/hack-router-codegen/zipball/1bab745d158f14535fc73ad801f4b135f07c2af7", - "reference": "1bab745d158f14535fc73ad801f4b135f07c2af7", - "shasum": "" - }, - "require": { - "facebook/definition-finder": "^2.7", - "facebook/hack-codegen": "^4.5.0", - "facebook/hack-http-request-response-interfaces": "^0.2|^0.3", - "facebook/hack-router": "^0.19", - "hhvm": "^4.93", - "hhvm/type-assert": "^3.0|^4.0" - }, - "require-dev": { - "facebook/fbexpect": "^2.6.1", - "hhvm/hacktest": "^2.0", - "hhvm/hhast": "^4.6", - "hhvm/hhvm-autoload": "^2.0|^3.0", - "usox/hackttp": "^0.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev", - "dev-main": "1.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "description": "URI routing for Hack with codegen", - "homepage": "https://github.com/hhvm/hack-router-codegen", - "keywords": [ - "hack", - "hhvm", - "router", - "routing" - ], - "support": { - "issues": "https://github.com/hhvm/hack-router-codegen/issues", - "source": "https://github.com/hhvm/hack-router-codegen/tree/v0.18.0" - }, - "time": "2021-12-14T17:39:51+00:00" - }, - { - "name": "facebook/hh-apidoc", - "version": "v0.8.0", - "source": { - "type": "git", - "url": "https://github.com/hhvm/hh-apidoc.git", - "reference": "217c451d3079179c6ecaa787de896f74011fd93f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hhvm/hh-apidoc/zipball/217c451d3079179c6ecaa787de896f74011fd93f", - "reference": "217c451d3079179c6ecaa787de896f74011fd93f", - "shasum": "" - }, - "require": { - "facebook/definition-finder": "^2.13.0", - "facebook/fbmarkdown": "^1.6.5", - "facebook/hh-clilib": "^2.1.0", - "hhvm": "^4.102", - "hhvm/hhast": "^4.80", - "hhvm/hsl": "^4.0", - "hhvm/hsl-experimental": "^4.53", - "hhvm/hsl-io": "^0.2.1|^0.3" - }, - "require-dev": { - "hhvm/hhvm-autoload": "^2.0|^3.0" - }, - "bin": [ - "bin/hh-apidoc", - "bin/hh-apidoc.hack" - ], - "type": "library", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "support": { - "issues": "https://github.com/hhvm/hh-apidoc/issues", - "source": "https://github.com/hhvm/hh-apidoc/tree/v0.8.0" - }, - "time": "2022-01-10T18:47:38+00:00" - }, - { - "name": "facebook/hh-clilib", - "version": "v2.6.0", - "source": { - "type": "git", - "url": "https://github.com/hhvm/hh-clilib.git", - "reference": "a275f2fe7e5c1144c09793fcb2a8f57533f2eb68" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hhvm/hh-clilib/zipball/a275f2fe7e5c1144c09793fcb2a8f57533f2eb68", - "reference": "a275f2fe7e5c1144c09793fcb2a8f57533f2eb68", - "shasum": "" - }, - "require": { - "hhvm": "^4.76", - "hhvm/hsl": "^4.0", - "hhvm/hsl-experimental": "^4.58.0rc1", - "hhvm/hsl-io": "^0.3.0", - "hhvm/type-assert": "^4.0" - }, - "require-dev": { - "facebook/fbexpect": "^2.6.1", - "hhvm/hacktest": "^2.2.0rc1", - "hhvm/hhvm-autoload": "^3.1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "support": { - "issues": "https://github.com/hhvm/hh-clilib/issues", - "source": "https://github.com/hhvm/hh-clilib/tree/v2.6.0" - }, - "time": "2020-12-14T21:29:15+00:00" - }, - { - "name": "facebook/xhp-lib", - "version": "v4.1.1", - "source": { - "type": "git", - "url": "https://github.com/hhvm/xhp-lib.git", - "reference": "d6893af6ae916dbf5e657cfc10d6d9b44bed7678" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hhvm/xhp-lib/zipball/d6893af6ae916dbf5e657cfc10d6d9b44bed7678", - "reference": "d6893af6ae916dbf5e657cfc10d6d9b44bed7678", - "shasum": "" - }, - "require": { - "hhvm": "^4.102", - "hhvm/hsl": "^4.36.0" - }, - "require-dev": { - "facebook/fbexpect": "^2.0.0", - "hhvm/hacktest": "^2.0", - "hhvm/hhast": "^4.0", - "hhvm/hhvm-autoload": "^2.0|^3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.x-dev", - "dev-main": "4.x-dev" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Class library for XHP", - "homepage": "https://github.com/facebook/xhp-lib", - "keywords": [ - "facebook", - "hack", - "hhvm", - "xhp" - ], - "support": { - "issues": "https://github.com/hhvm/xhp-lib/issues", - "source": "https://github.com/hhvm/xhp-lib/tree/v4.1.1" - }, - "time": "2021-11-18T18:56:01+00:00" - }, - { - "name": "hhvm/hhast", - "version": "v4.161.2", - "source": { - "type": "git", - "url": "https://github.com/hhvm/hhast.git", - "reference": "0a9ffc51a94188c0c1cc6f5389ea8ebf596d8475" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hhvm/hhast/zipball/0a9ffc51a94188c0c1cc6f5389ea8ebf596d8475", - "reference": "0a9ffc51a94188c0c1cc6f5389ea8ebf596d8475", - "shasum": "" - }, - "require": { - "facebook/difflib": "^1.0.0", - "facebook/hh-clilib": "^2.5.0rc1", - "hhvm": "^4.161", - "hhvm/type-assert": "^4.2.2" - }, - "require-dev": { - "facebook/fbexpect": "^2.8.1", - "facebook/hack-codegen": "^4.0", - "hhvm/hacktest": "^2.3.0", - "hhvm/hhvm-autoload": "^2.0.4|^3.0" - }, - "bin": [ - "bin/hhast-lint", - "bin/hhast-lint.hack", - "bin/hhast-migrate", - "bin/hhast-migrate.hack" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.x-dev", - "dev-main": "4.x-dev" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A mutable AST library for Hack with linting and code migrations", - "support": { - "issues": "https://github.com/hhvm/hhast/issues", - "source": "https://github.com/hhvm/hhast/tree/v4.161.2" - }, - "time": "2022-07-09T17:27:26+00:00" - }, - { - "name": "hhvm/hhvm-autoload", - "version": "v3.3.2", - "source": { - "type": "git", - "url": "https://github.com/hhvm/hhvm-autoload.git", - "reference": "186d1fc5d5bf69caebaacac5c80a69e3c08f50d4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hhvm/hhvm-autoload/zipball/186d1fc5d5bf69caebaacac5c80a69e3c08f50d4", - "reference": "186d1fc5d5bf69caebaacac5c80a69e3c08f50d4", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.0|^2.0", - "hhvm": "^4.153" - }, - "replace": { - "facebook/hhvm-autoload": "1.*" - }, - "require-dev": { - "facebook/fbexpect": "^2.1", - "hhvm/hacktest": "^2.0" - }, - "bin": [ - "bin/hh-autoload", - "bin/hh-autoload.hack" - ], - "type": "composer-plugin", - "extra": { - "class": [ - "Facebook\\AutoloadMap\\ComposerPlugin" - ], - "branch-alias": { - "dev-master": "3.x-dev", - "dev-main": "3.x-dev", - "dev-CI_current_pull_request": "3.x-dev" - } - }, - "autoload": { - "classmap": [ - "ComposerPlugin.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "support": { - "issues": "https://github.com/hhvm/hhvm-autoload/issues", - "source": "https://github.com/hhvm/hhvm-autoload/tree/v3.3.2" - }, - "time": "2022-05-30T18:49:17+00:00" - }, - { - "name": "hhvm/hsl", - "version": "v4.108.1", - "source": { - "type": "git", - "url": "https://github.com/hhvm/hsl.git", - "reference": "3b4375e6adf63ac9171721b031b662dd3524c5bb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hhvm/hsl/zipball/3b4375e6adf63ac9171721b031b662dd3524c5bb", - "reference": "3b4375e6adf63ac9171721b031b662dd3524c5bb", - "shasum": "" - }, - "require": { - "hhvm": "^4.108" - }, - "require-dev": { - "facebook/fbexpect": "^2.5.1", - "hhvm/hacktest": "^1.0|^2.0", - "hhvm/hhvm-autoload": "^2.0|^3.0", - "hhvm/hsl-experimental": "^4.37|dev-master" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.x-dev", - "dev-CI_current_pull_request": "4.x-dev" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "The Hack Standard Library", - "support": { - "issues": "https://github.com/hhvm/hsl/issues", - "source": "https://github.com/hhvm/hsl/tree/v4.108.1" - }, - "time": "2021-05-04T14:32:06+00:00" - }, - { - "name": "hhvm/hsl-experimental", - "version": "v4.108.0", - "source": { - "type": "git", - "url": "https://github.com/hhvm/hsl-experimental.git", - "reference": "c145eda4344a3668119fde743e9d224bae7efe98" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hhvm/hsl-experimental/zipball/c145eda4344a3668119fde743e9d224bae7efe98", - "reference": "c145eda4344a3668119fde743e9d224bae7efe98", - "shasum": "" - }, - "require": { - "hhvm": "^4.108", - "hhvm/hsl": "^4.15" - }, - "provide": { - "hhvm/hsl-io": "0.3.0" - }, - "require-dev": { - "facebook/fbexpect": "^2.7.0", - "hhvm/hacktest": "^2.0", - "hhvm/hhvm-autoload": "^2.0|^3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.x-dev" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "The Hack Standard Library - Experimental Additions", - "support": { - "issues": "https://github.com/hhvm/hsl-experimental/issues", - "source": "https://github.com/hhvm/hsl-experimental/tree/v4.108.0" - }, - "time": "2021-05-04T18:41:22+00:00" - }, - { - "name": "hhvm/type-assert", - "version": "v4.2.2", - "source": { - "type": "git", - "url": "https://github.com/hhvm/type-assert.git", - "reference": "7106e783dc43724efa5d4147456025a2316480f0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hhvm/type-assert/zipball/7106e783dc43724efa5d4147456025a2316480f0", - "reference": "7106e783dc43724efa5d4147456025a2316480f0", - "shasum": "" - }, - "require": { - "hhvm": "^4.115", - "hhvm/hsl": "^4.0" - }, - "require-dev": { - "facebook/fbexpect": "^2.0.0", - "hhvm/hacktest": "^2.0", - "hhvm/hhast": "^4.0", - "hhvm/hhvm-autoload": "^2.0|^3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.x-dev" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Convert untyped data to typed data", - "keywords": [ - "TypeAssert", - "hack" - ], - "support": { - "issues": "https://github.com/hhvm/type-assert/issues", - "source": "https://github.com/hhvm/type-assert/tree/v4.2.2" - }, - "time": "2021-09-13T15:44:05+00:00" - }, - { - "name": "usox/hack-http-factory-interfaces", - "version": "v0.2.2", - "source": { - "type": "git", - "url": "https://github.com/usox/hack-http-factory-interfaces.git", - "reference": "412fdeb8d85c83bef558223bf5ed25e5e7e37692" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/usox/hack-http-factory-interfaces/zipball/412fdeb8d85c83bef558223bf5ed25e5e7e37692", - "reference": "412fdeb8d85c83bef558223bf5ed25e5e7e37692", - "shasum": "" - }, - "require": { - "facebook/hack-http-request-response-interfaces": "^0.2|^0.3", - "hhvm": "^4.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Usox\\HackHttpFactory\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Daniel Jakob", - "email": "dev@usox.org" - } - ], - "description": "PSR-17 like http factory interfaces", - "homepage": "https://github.com/usox/hack-http-factory-interfaces", - "keywords": [ - "factory", - "hack", - "hhvm", - "http" - ], - "support": { - "issues": "https://github.com/usox/hack-http-factory-interfaces/issues", - "source": "https://github.com/usox/hack-http-factory-interfaces/tree/master" - }, - "time": "2020-04-08T16:17:10+00:00" - }, - { - "name": "usox/hackttp", - "version": "v0.5.4", - "source": { - "type": "git", - "url": "https://github.com/usox/hackttp.git", - "reference": "a5ba0a2c4dc31f06b4907026b3bc0bd208a07a24" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/usox/hackttp/zipball/a5ba0a2c4dc31f06b4907026b3bc0bd208a07a24", - "reference": "a5ba0a2c4dc31f06b4907026b3bc0bd208a07a24", - "shasum": "" - }, - "require": { - "facebook/hack-http-request-response-interfaces": "^0.3", - "hhvm": "^4.93", - "hhvm/hsl": "^4.25", - "hhvm/hsl-experimental": "^4.58", - "hhvm/hsl-io": "^0.3.0", - "hhvm/type-assert": "^3.3|^4.0", - "usox/hack-http-factory-interfaces": "^0.2" - }, - "require-dev": { - "hhvm/hacktest": "^1.4|^2.0", - "hhvm/hhast": "^4.1", - "usox/hackmock": "^1.3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Usox\\HackTTP\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Daniel Jakob", - "email": "dev@usox.org", - "role": "Developer" - } - ], - "description": "Work in progress demo implementation of facebookexperimental/hack-http-request-response-interfaces", - "homepage": "https://github.com/usox/hackttp", - "keywords": [ - "hack", - "hacklang", - "hhvm", - "http", - "message", - "request", - "response", - "stream" - ], - "support": { - "issues": "https://github.com/usox/hackttp/issues", - "source": "https://github.com/usox/hackttp/tree/v0.5.4" - }, - "time": "2021-04-12T06:06:05+00:00" - } - ], - "packages-dev": [ - { - "name": "facebook/fbexpect", - "version": "v2.9.1", - "source": { - "type": "git", - "url": "https://github.com/hhvm/fbexpect.git", - "reference": "5ad14d4f6e6e57a468f9b415d97ab6050630e144" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hhvm/fbexpect/zipball/5ad14d4f6e6e57a468f9b415d97ab6050630e144", - "reference": "5ad14d4f6e6e57a468f9b415d97ab6050630e144", - "shasum": "" - }, - "require": { - "facebook/difflib": "^1.3.0", - "hhvm": "^4.128", - "hhvm/hacktest": "^1.0|^2.0" - }, - "require-dev": { - "hhvm/hhast": "^4.0", - "hhvm/hhvm-autoload": "^2.0|^3.0" - }, - "type": "library", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Unit test helpers for Facebook projects", - "support": { - "issues": "https://github.com/hhvm/fbexpect/issues", - "source": "https://github.com/hhvm/fbexpect/tree/v2.9.1" - }, - "time": "2022-06-06T19:39:09+00:00" - }, - { - "name": "hhvm/hacktest", - "version": "v2.4.0", - "source": { - "type": "git", - "url": "https://github.com/hhvm/hacktest.git", - "reference": "84b7a0094f59329dc41ac29ad77d09f85a9b1c91" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hhvm/hacktest/zipball/84b7a0094f59329dc41ac29ad77d09f85a9b1c91", - "reference": "84b7a0094f59329dc41ac29ad77d09f85a9b1c91", - "shasum": "" - }, - "require": { - "facebook/hh-clilib": "^2.5.0rc1", - "hhvm": "^4.128", - "hhvm/type-assert": "^3.0|^4.0" - }, - "require-dev": { - "facebook/fbexpect": "^2.8.1", - "hhvm/hhast": "^4.0", - "hhvm/hhvm-autoload": "^2.0.2|^3.0" - }, - "bin": [ - "bin/hacktest", - "bin/hacktest.hack" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev", - "dev-main": "2.x-dev", - "dev-CI_current_pull_request": "2.x-dev" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "The Hack Test Library", - "support": { - "issues": "https://github.com/hhvm/hacktest/issues", - "source": "https://github.com/hhvm/hacktest/tree/v2.4.0" - }, - "time": "2022-06-06T18:42:25+00:00" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "hhvm": "4.164.*" - }, - "platform-dev": [], - "plugin-api-version": "2.3.0" -} diff --git a/guides/hack/01-getting-started/01-getting-started.md b/guides/hack/01-getting-started/01-getting-started.md deleted file mode 100644 index 02147152c..000000000 --- a/guides/hack/01-getting-started/01-getting-started.md +++ /dev/null @@ -1,75 +0,0 @@ -```yamlmeta -{ - "fbonly messages": [ - "Unless you are specifically working on open source Hack code, you want [Facebook's internal documentation](https://our.internmc.facebook.com/intern/wiki/First-app/) instead for dev environment setup. If you're just looking to [learn the Hack language itself](https://docs.hhvm.com/hack/source-code-fundamentals/introduction), skip this Getting Started section." - ] -} -``` - -### 1. Installation - -The HHVM package includes everything you need to work with Hack, -including the runtime and typechecker. - -See the [HHVM installation page](/hhvm/installation/introduction) to -find the package relevant for your platform. - -### 2. Initialize A Project - -Create a directory with a `.hhconfig` file in it. This will be the -root of your project. - -``` -$ mkdir my_project -$ cd my_project -$ touch .hhconfig -``` - -### 3. Write Your First Hack Program - -Create a file called `my_project/hello.hack` with the following code: - -```Hack -use namespace HH\Lib\IO; - -<<__EntryPoint>> -async function main(): Awaitable { - await IO\request_output()->writeAllAsync("Hello World!\n"); -} -``` - -### 4. Run The Typechecker - -Normally you'll get type errors and hover information from within your -IDE. You can also run the typechecker directly to confirm that you -have no type errors in any files in your project. - -``` -$ cd my_project -$ hh_client -No errors! -``` - -### 5. Run Your Program - -HHVM provides the Hack runtime. You can run your program as follows: - -``` -$ cd my_project -$ hhvm hello.hack -Hello World! -``` - -### 6. Run A Website - -Normally you'll start HHVM as a webserver, and it will automatically -pick up any changes to files you make. - - -``` -$ cd my_project -$ hhvm -m server -p 8080 -``` - -You can now visit to see "Hello -World!" in your browser. diff --git a/guides/hack/01-getting-started/02-tools.md b/guides/hack/01-getting-started/02-tools.md deleted file mode 100644 index b00b38ad7..000000000 --- a/guides/hack/01-getting-started/02-tools.md +++ /dev/null @@ -1,50 +0,0 @@ -The core tools are: - -- `hh_client`: this is the command line interface for Hack's static analysis; it - is needed to verify that a project is valid Hack, and is used to find errors - in your programs -- `hhvm`: this is used to execute your Hack code, and can either be used for - CLI (e.g. `hhvm foo.hack`) or as a server, and has - [its own documentation](/hhvm/) - -### Editors and IDEs - -We primarily recommend using [Visual Studio Code] with the -[VSCode-Hack] extension; this provides IDE features such as syntax -highlighting, go-to-definition, and inline display of Hack errors. - -For Vim users, [vim-hack] provides syntax highlighting and language detection, -and the [ALE] project provides enhanced support for Hack. - -[hack-mode] provides a major mode for Emacs users. - -If you use a different editor or IDE with [LSP support], configure it -to use `hh_client lsp`; if you use [HHAST], you might want to configure it to -use `vendor/bin/hhast-lint --mode lsp`, but keep in mind this will lead to your -editor automatically executing code from a project when that project is opened; -for this reason, the ALE integration has HHAST disabled by default, and Visual -Studio Code prompts to confirm before executing it. - -### Dependency Management - -Hack dependencies are currently managed using [Composer], which must be executed -with PHP. Composer can be thought of as an equivalent to `npm` or `yarn`. - -### Other Common Tools - -- `hackfmt` is a CLI code formatter included with HHVM and Hack, and is also - used by the various editor and IDE integrations -- [HHAST] provides code style linting, and the ability to automatically - modify code to adapt to some changes in the language or libraries -- [hacktest] and [fbexpect] are commonly used together for writing unit tests - -[ALE]: https://github.com/w0rp/ale -[Composer]: https://getcomposer.org -[HHAST]: https://github.com/hhvm/hhast -[VSCode-Hack]: https://github.com/slackhq/vscode-hack/ -[Visual Studio Code]: https://code.visualstudio.com -[LSP support]: https://microsoft.github.io/language-server-protocol/ -[fbexpect]: https://github.com/hhvm/fbexpect -[hack-mode]: https://github.com/hhvm/hack-mode -[hacktest]: https://github.com/hhvm/hacktest -[vim-hack]: https://github.com/hhvm/vim-hack diff --git a/guides/hack/01-getting-started/03-starting-a-real-project.md b/guides/hack/01-getting-started/03-starting-a-real-project.md deleted file mode 100644 index 6e0579639..000000000 --- a/guides/hack/01-getting-started/03-starting-a-real-project.md +++ /dev/null @@ -1,383 +0,0 @@ -## Starting A Real Project - -Real projects generally aren't a single file in isolation; they tend to have -dependencies such as the [Hack Standard Library], and various optional tools. - -A good starting point is to: -- [install Composer] -- create an `.hhconfig` file -- create `src/` and `tests/` subdirectories -- configure autoloading -- use Composer to install the common dependencies and tools - -### Autoloading - -In HHVM, there is no 'build' step as such; each file is processed as needed. -Currently, HHVM needs to be given a map of what files define which classes, -functions and so on - for example, to execute the code `new Foo()`, HHVM needs -to know that the class `Foo` is defined in `src/Foo.hack`. - -[hhvm-autoload] generates this map. To add it to your project, run: - -``` -$ php /path/to/composer.phar require hhvm/hhvm-autoload -``` - -hhvm-autoload needs an `hh_autoload.json` configuration -file. For most projects, a minimal example is: - -```JSON -{ - "roots": [ - "src/" - ], - "devRoots": [ - "tests/" - ], - "devFailureHandler": "Facebook\\AutoloadMap\\HHClientFallbackHandler" -} -``` - -The "roots" key provides folders that need to be loadable in a production environment. - -The "devRoots" key is for folders that you want to be autoloaded during -development or testing, but not when you are running your code in production. - -The "devFailureHandler" key is the fully qualified name of a fallback strategy. -When you add a new class or function and don't run `hh-autoload`, the autoloadmap is not automatically updated. -The fallback is called when hhvm can't find your type, constant or function in the autoloadmap. - -The fallback then may attempt to load the type, constant or function at runtime. -(This process will slow down your execution considerably and should therefore not used in production.) -Not all constants and functions can / will be found by HHClientFallbackHandler, see the [repository](https://github.com/hhvm/hhvm-autoload) for more details. - -Once this configuration file is created, `vendor/bin/hh-autoload` can be executed -to generate or update the map, which is created as `vendor/autoload.hack` - -### An Example - -The following sequence of commands could be used to fully initialize a Hack -project with the most common dependencies: - -``` -$ curl https://raw.githubusercontent.com/hhvm/hhast/master/.hhconfig > .hhconfig -$ mkdir bin src tests -$ cat > hh_autoload.json -{ - "roots": [ - "src/" - ], - "devRoots": [ - "tests/" - ], - "devFailureHandler": "Facebook\\AutoloadMap\\HHClientFallbackHandler" -} -$ composer require hhvm/hsl hhvm/hhvm-autoload -$ composer require --dev hhvm/hhast hhvm/hacktest facebook/fbexpect -``` - -You may need to use the full path to Composer, depending on how it's installed. - -We curl an existing hhconfig from hhast from github. The reason for this is that starting with hhvm version [4.62](https://hhvm.com/blog/2020/06/16/hhvm-4.62.html), it is no longer enough for projects that use external dependencies. Almost all packages you pull in using composer will have a suppression comment in them somewhere. You must whitelist these suppression comments in order to use these packages. - -The hhast `.hhconfig` file whitelists all suppression comments used by hsl, hhvm-autoload, hacktest, fbexpect, hhast. Hhast depends on these packages itself, so this should stay up to date. If the result of `hh_client restart && hh_client` does not end with `No errors!` after the last step, please refer to the [error suppression docs](https://docs.hhvm.com/hack/silencing-errors/introduction). - -The same commands with their expected output: - -``` -$ curl https://raw.githubusercontent.com/hhvm/hhast/master/.hhconfig > .hhconfig - % Total % Received % Xferd Average Speed Time Time Time Current - Dload Upload Total Spent Left Speed -xxx xxx xxx xxx x x xxxx x --:--:-- --:--:-- --:--:-- xxxx -$ mkdir bin src tests -$ cat > hh_autoload.json -{ - "roots": [ - "src/" - ], - "devRoots": [ - "tests/" - ], - "devFailureHandler": "Facebook\\AutoloadMap\\HHClientFallbackHandler" -} -$ composer require hhvm/hsl hhvm/hhvm-autoload -Using version ^4.0 for hhvm/hsl -Using version ^2.0 for hhvm/hhvm-autoload -./composer.json has been created -Loading composer repositories with package information -Updating dependencies (including require-dev) -Package operations: 2 installs, 0 updates, 0 removals - - Installing hhvm/hsl (v4.0.0): Loading from cache - - Installing hhvm/hhvm-autoload (v2.0.3): Loading from cache -Writing lock file -Generating autoload files -/var/folders/3l/2yk1tgkn7xdd76bs547d9j90fcbt87/T/tmp.xaQwE1xE/vendor/autoload.hack -$ composer require --dev hhvm/hhast hhvm/hacktest facebook/fbexpect -Using version ^4.0 for hhvm/hhast -Using version ^1.4 for hhvm/hacktest -Using version ^2.5 for facebook/fbexpect -./composer.json has been updated -Loading composer repositories with package information -Updating dependencies (including require-dev) -Package operations: 7 installs, 0 updates, 0 removals - - Installing facebook/difflib (v1.1): Loading from cache - - Installing hhvm/hsl-experimental (v4.0.1): Loading from cache - - Installing hhvm/type-assert (v3.3.1): Loading from cache - - Installing facebook/hh-clilib (v2.1.0): Loading from cache - - Installing hhvm/hhast (v4.0.4): Loading from cache - - Installing hhvm/hacktest (v1.4): Loading from cache - - Installing facebook/fbexpect (v2.5.1): Loading from cache -Writing lock file -Generating autoload files -/private/var/folders/3l/2yk1tgkn7xdd76bs547d9j90fcbt87/T/tmp.xaQwE1xE/vendor/autoload.hack -``` - -### Adding Functions or Classes - -As a toy example, we're going to create a function that squares a vector of -numbers; save the following as `src/square_vec.hack`: - -```Hack error -use namespace HH\Lib\Vec; - -function square_vec(vec $numbers): vec { - return Vec\map($numbers, $number ==> $number * $number); -} -``` - -If you then run `hh_client`, it will tell you of a mistake: - -``` -src/square_vec.hack:4:10,57: Invalid return type (Typing[4110]) - src/square_vec.hack:3:53,55: This is an int - src/square_vec.hack:4:40,56: It is incompatible with a num (int/float) because this is the result of an arithmetic operation with a num as the first argument, and no floats. - src/square_vec.hack:3:35,35: Here is why I think the argument is a num: this is a num -``` - -To fix this, change the return type of the function from `vec` to `vec`. - -We now have a function that is valid Hack, but it's not tested, and nothing calls it. - -### Adding an Executable - -Save the following as `bin/square_some_things.hack`: - -```Hack no-extract -#!/usr/bin/env hhvm - -<<__EntryPoint>> -async function main(): Awaitable { - require_once(__DIR__.'/../vendor/autoload.hack'); - \Facebook\AutoloadMap\initialize(); - - $squared = square_vec(vec[1, 2, 3, 4, 5]); - foreach ($squared as $square) { - printf("%d\n", $square); - } -} -``` - -This program: - - requires and initializes the autoloader so that the function we just defined - can be found - - calls the function - - prints the results - -You can now execute your new program, either explicitly with HHVM, or by -marking it as executable: - -``` -$ hhvm bin/square_some_things.hack -1 -4 -9 -16 -25 -$ chmod +x bin/square_some_things.hack -$ bin/square_some_things.hack -1 -4 -9 -16 -25 -``` - -### Linting - -Most projects use a linter to enforce some stylistic choices that are not -required by the language, but help make the project consistent; [HHAST] is the -recommended linter for Hack code. HHAST's linter is enabled by an -`hhast-lint.json` file in the project root. A good starting project is to enable -all linters for all directories that contain source code - to do this, save -the following as `hhast-lint.json`: - -```json -{ - "roots": [ "bin/", "src/", "tests/" ], - "builtinLinters": "all" -} -``` - -When you ran `composer require` earlier, HHAST was installed into the `vendor/` -subdirectory, and can be executed from there: - -``` -$ vendor/bin/hhast-lint -Function "main()" does not match conventions; consider renaming to "main_async" - Linter: Facebook\HHAST\Linters\AsyncFunctionAndMethodLinter - Location: /private/var/folders/3l/2yk1tgkn7xdd76bs547d9j90fcbt87/T/tmp.xaQwE1xE/bin/square_some_things.hack:5:0 - Code: - > - ><<__EntryPoint>> - >async function main(): Awaitable -``` - -### Unit Testing - -[HackTest] is used to create unit test classes, and [fbexpect] is used to -express assertions. Let's create a basic test as `tests/MyTest.hack`: - -```hack no-extract -use function Facebook\FBExpect\expect; -use type Facebook\HackTest\{DataProvider, HackTest}; - -final class MyTest extends HackTest { - public function provideSquaresExamples(): vec<(vec, vec)> { - return vec[ - tuple(vec[1, 2, 3], vec[1, 4, 9]), - tuple(vec[1.1, 2.2, 3.3], vec[1.1 * 1.1, 2.2 * 2.2, 3.3 * 3.3]), - ]; - } - - <> - public function testSquares(vec $in, vec $expected_output): void { - expect(square_vec($in))->toBeSame($expected_output); - } -} -``` - -We can then use HackTest to run the tests: - -``` -$ vendor/bin/hh-autoload -$ vendor/bin/hacktest tests/ -.. - -Summary: 2 test(s), 2 passed, 0 failed, 0 skipped, 0 error(s). -``` - -Regenerating the autoloadmap (with hh-autoload) is not always required, -but if classes are not in the autoloadmap, -you may get exceptions about reflected classes not existing. -It is generally recommended to make sure that the autoloadmap is complete, -before running the test suite. - -If we intentionally add a failure, such as `tuple(vec[1, 2, 3], vec[1, 2, 3])`, -HackTest reports this: - -``` -$ vendor/bin/hacktest tests/ -..F - -1) MyTest::testSquares with data set #3 (vec [ - 1, - 2, - 3, -], vec [ - 1, - 2, - 3, -]) - -Failed asserting that vec [ - 1, - 4, - 9, -] is the same as vec [ - 1, - 2, - 3, -] - -/private/var/folders/3l/2yk1tgkn7xdd76bs547d9j90fcbt87/T/tmp.xaQwE1xE/tests/MyTest.hack(15): Facebook\FBExpect\ExpectObj->toBeSame() - - -Summary: 3 test(s), 2 passed, 1 failed, 0 skipped, 0 error(s). -``` - -## Configuring Git - -The `vendor/` directory should not be committed; to make dependencies available -on another system or checkout, use `composer install`. This will use the -generated `composer.lock` file (which should generally be committed) to install -the exact same versions. - -``` -$ echo vendor/ > .gitignore -``` - -If you're creating a library, users of your library probably don't want your -unit tests - and if they have them, they will need to have `fbexpect` and -`hacktest` installed in compatible versions to not get Hack errors. - -As Composer uses GitHub releases which are automatically generated via -`git export`, the simplest solution is to configure `git export` to ignore -the `tests/` directory: - -``` -$ echo 'tests/ export-ignore' > .gitattributes -``` - -## Configuring TravisCI - -We recommend using Docker on TravisCI for continuous integration of Hack -projects. This is usually done by creating a separate `.travis.sh` which -executes in the container. For example, a `.travis.yml` might look like this: - -``` -sudo: required -language: generic -services: docker -env: -- HHVM_VERSION=latest -- HHVM_VERSION=nightly -install: -- docker pull hhvm/hhvm:$HHVM_VERSION -script: -- docker run --rm -w /var/source -v $(pwd):/var/source hhvm/hhvm:$HHVM_VERSION ./.travis.sh -``` - -... and a corresponding `.travis.sh`: - -``` -#!/bin/sh -set -ex -apt update -y -DEBIAN_FRONTEND=noninteractive apt install -y php-cli zip unzip -hhvm --version -php --version - -( - cd $(mktemp -d) - curl https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer -) -composer install - -hh_client -vendor/bin/hacktest tests/ -if !(hhvm --version | grep -q -- -dev); then - vendor/bin/hhast-lint -fi -``` - -With this configuration, TravisCI runs will check for hack errors, unit test -failures - and on release builds, run `hhast-lint`. We do not run `hhast-lint` -on `-dev` builds as `hhast-lint` depends on implementation details of HHVM and -Hack which change frequently. - -[fbexpect]: https://github.com/hhvm/fbexpect -[HackTest]: https://github.com/hhvm/hacktest -[HHAST]: https://github.com/hhvm/hhast -[Hack Standard Library]: https://github.com/hhvm/hsl/ -[hhvm-autoload]: https://github.com/hhvm/hhvm-autoload -[install Composer]: https://getcomposer.org/doc/00-intro.md#installation-linux-unix-macos diff --git a/guides/hack/01-getting-started/04-the-hack-standard-library.md b/guides/hack/01-getting-started/04-the-hack-standard-library.md deleted file mode 100644 index ce1ae4507..000000000 --- a/guides/hack/01-getting-started/04-the-hack-standard-library.md +++ /dev/null @@ -1,73 +0,0 @@ -# About the Hack Standard Library (HSL) -HHVM is distributed with a growing set of functions and classes -collectively called the [Hack Standard Library (HSL)](/hsl/reference/). -These are intended to complement, or in some cases replace previous -[built-in APIs](/hack/reference/). - -There are two related GitHub projects/Composer packages: -- [hhvm/hsl](https://github.com/hhvm/hsl/): The Hack Standard Library for users - of HHVM < 4.108 -- [hhvm/hsl-experimental](https://github.com/hhvm/hsl-experimental/): - Experimental features, which may be added to the Hack Standard Library in the - future - -**Note:** Before HHVM 4.108, the Hack Standard Library was distributed -in a [separate repository](https://github.com/hhvm/hsl/) from HHVM. - -# HSL Namespaces -The Hack Standard Library is grouped by namespace. For a full list, see [HSL Reference](/hsl/reference/). - -Also included is the static class `Ref`, with `Ref::get` and `Ref::set`, which is useful for setting reference values with [anonymous functions](/hack/functions/anonymous-functions). - -## Containers and Hack Arrays -A collection of functions for working with Hack Arrays and other types of containers. - -| Namespace | Description | -|-------------------|-------------------------------------------------------------------------------------------------------------------------------------------------| -| `C\` | Functions that operate on containers, but do not return or require a specific kind of container, such as `C\contains()`. | -| `Vec\` | Functions that return, create, or operate on [the vec type](/hack/arrays-and-collections/vec-keyset-and-dict#vec), such as `Vec\drop()`. | -| `Keyset\` | Functions that return, create, or operate on [the keyset type](/hack/arrays-and-collections/vec-keyset-and-dict#keyset), such as `Keyset\map()`.| -| `Dict\` | Functions that return, create, or operate on [the dict type](/hack/arrays-and-collections/vec-keyset-and-dict#dict), such as `Dict\sort()`. | - -## Strings and Regular Expressions -A collection of functions for working with strings. - -| Namespace | Description | -|-------------------|-------------------------------------------------------------------------------------------------------------------------------------------------| -| `Str\` | Functions for interacting with [the string type](/hack/built-in-types/string), such as `Str\contains()`. | -| `Regex\` | Functions that perform [regular expression matching](/hack/built-in-types/string#working-with-regex) on `string`, such as `Regex\replace`. | -| `Locale\` | Functions for retrieving and creating `Locale` objects, for example: `en_US.UTF-8`. | - -## Math and Random Number Generation -A collection of functions for math operations and types of randomization. - -| Namespace | Description | -|-------------------|-------------------------------------------------------------------------------------------------------------------------------------------------| -| `Math\` | Functions for common math operations, like `Math\sqrt`, `Math\min`, and `Math\max`. | -| `PseudoRandom\` | Functions for pseudo-randomization, focusing on performance. | -| `SecureRandom\` | Functions for secure randomization, focusing on security. | - -## HSL IO -A standard API for input and output. - -| Namespace | Description | -|-------------------|-------------------------------------------------------------------------------------------------------------------------------------------------| -| `File\` | A library for reading, writing, and creating files, such as `File\temporary_file`. | -| `IO\` | A library for working with asynchronous [input/output streams](/hack/getting-started/input-and-output). | - -### HSL IO Low-Level APIs -Other low-level APIs used by HSL IO. - -| Namespace | Description | -|-------------------|-------------------------------------------------------------------------------------------------------------------------------------------------| -| `OS\` | APIs for creating, opening, and operating on file descriptors, like `OS\open` or `OS\pipe`. | -| `Unix\` | APIs for Unix-based client and server interaction. | -| `TCP\` | APIs for client and server interaction that uses the Transmission Control Protocol (TCP). | -| `Network\` | APIs for client and server interaction. | - -## Async -In addition to the content outlined in [Asynchronous Operations](/hack/asynchronous-operations/introduction), there are a few utility classes in the `Async\` namespace. - -| Namespace | Description | -|-------------------|-------------------------------------------------------------------------------------------------------------------------------------------------| -| `Async\` | A library for controlling asynchronous behavior, with classes like `Async\Semaphore`, `Async\Poll`, and `Async\KeyedPoll`. | diff --git a/guides/hack/01-getting-started/05-input-and-output.md b/guides/hack/01-getting-started/05-input-and-output.md deleted file mode 100644 index cdc223800..000000000 --- a/guides/hack/01-getting-started/05-input-and-output.md +++ /dev/null @@ -1,48 +0,0 @@ -## Input and Output - -A standard API for input and output, known as "HSL IO", is included in the -[Hack Standard Library (HSL)](the-standard-library). - -HSL IO should not yet be used in Facebook www; you want -the Facebook-specific `Filesystem` class instead. Post in the usual groups -if you can't find a suitable alternative for HSL IO. - -HSL IO differs from most other language's standard IO libraries in two particularly significant ways: -- provide as much safety as possible through the type system instead of runtime checking. For example, - files opened read-only are a different type to those opened write-only; read-write files are a supertype - of both read-only- and write-only- files. -- designed primarily for asynchronous IO; blocking operations are not generally exposed. - -Additional design goals include: -- be internally consistent -- reduce end-user boilerplate. For example, automatically retry calls that fail with `EAGAIN` -- make the most obvious way to do things as safe as possible -- /support/ all reasonable behavior even if unsafe -- be convenient for common cases, but not at the cost of consistency or safety - -For a more detailed overview, see the documentation for `IO\Handle`; basic operations include: - -```Hack -use namespace HH\Lib\{File, IO}; - -async function main_async(): Awaitable { - // STDIN for CLI, or HTTP POST data - $_in = IO\request_input(); - // STDOUT for CLI, or HTTP response - $out = IO\request_output(); - - $message = "Hello, world\n"; - await $out->writeAllAsync($message); - - // copy to a temporary file, automatically closed at scope exit - using ($tf = File\temporary_file()) { - $f = $tf->getHandle(); - - await $f->writeAllAsync($message); - - $f->seek(0); - $content = await $f->readAllAsync(); - await $out->writeAllAsync($content); - } -} -``` diff --git a/guides/hack/01-getting-started/getting-started-category.txt b/guides/hack/01-getting-started/getting-started-category.txt deleted file mode 100644 index 263beb086..000000000 --- a/guides/hack/01-getting-started/getting-started-category.txt +++ /dev/null @@ -1 +0,0 @@ -Getting Started diff --git a/guides/hack/01-getting-started/getting-started-summary.txt b/guides/hack/01-getting-started/getting-started-summary.txt deleted file mode 100644 index e8e1227cd..000000000 --- a/guides/hack/01-getting-started/getting-started-summary.txt +++ /dev/null @@ -1 +0,0 @@ -Installing Hack, running your first program, and introducing the tools. diff --git a/guides/hack/02-source-code-fundamentals/01-introduction.md b/guides/hack/02-source-code-fundamentals/01-introduction.md deleted file mode 100644 index 65d169abd..000000000 --- a/guides/hack/02-source-code-fundamentals/01-introduction.md +++ /dev/null @@ -1,12 +0,0 @@ -**Topics covered in this section** - -* [program structure](/hack/source-code-fundamentals/program-structure) -* [comments](/hack/source-code-fundamentals/comments) -* [constants](/hack/source-code-fundamentals/constants) -* [keywords](/hack/source-code-fundamentals/keywords) -* [literals](/hack/source-code-fundamentals/literals) -* [names, user-defined](/hack/source-code-fundamentals/names) -* [namespaces](/hack/source-code-fundamentals/namespaces) -* [scope](/hack/source-code-fundamentals/scope) -* [script inclusion](/hack/source-code-fundamentals/script-inclusion) -* [variables](/hack/source-code-fundamentals/variables) diff --git a/guides/hack/02-source-code-fundamentals/04-program-structure.md b/guides/hack/02-source-code-fundamentals/04-program-structure.md deleted file mode 100644 index bb16fb707..000000000 --- a/guides/hack/02-source-code-fundamentals/04-program-structure.md +++ /dev/null @@ -1,61 +0,0 @@ -A Hack program consists of one or more source files; these source files should -have the extension `.hack`, and contain one or more declarations of the following kind, -in any order: - -* alias declaration -* class -* enumerated type -* function -* inclusion directive -* interface -* namespace -* trait -* use - -Consider the following file: - -```hack -#!/usr/bin/env hhvm - -<<__EntryPoint>> -function main(): void { - print("Hello, World!\n"); -} -``` - -In this example, the start-up function is called `main`; however, that was an arbitrary choice of name; it could just as easily -have been `run`, `do_it`, or `make_magic`. (What makes `main` the start-up function is the presence of the [attribute `__EntryPoint`](../attributes/predefined-attributes#__entrypoint).) - -## Including Other Files - -A file can import another file via [inclusion](script-inclusion.md). - -## Legacy Files -```yamlmeta -{ - "fbonly messages": [ - "All Hack source code at Meta should use the .php file extension and Hack strict mode (plain > -function main(): void { - print("Hello, World!\n"); - exit(0); -} -``` diff --git a/guides/hack/02-source-code-fundamentals/10-comments.md b/guides/hack/02-source-code-fundamentals/10-comments.md deleted file mode 100644 index b3d3ec6c3..000000000 --- a/guides/hack/02-source-code-fundamentals/10-comments.md +++ /dev/null @@ -1,42 +0,0 @@ -```yamlmeta -{ - "note": [ - "Hash comments (`#`) are no longer supported, and are a parse error since [HHVM 4.133](https://hhvm.com/blog/2021/10/26/hhvm-4.133.html)." - ] -} -``` - -Hack has three comment syntaxes. - -```hack -// A single line comment. - -/* A multi line comment. - * - */ - -/** - * A doc comment starts with two asterisks. - * - * It summarises the purpose of a definition, such as a - * function, class or method. - */ -function foo(): void {} -``` - -Multi-line comments start with `/*` and end with `*/`. Comments starting `/**` -are also used for documentation. - -Single-line comments start with `//` and end with a newline. - -`#` is not a valid comment character, as it is used to represent an -[Enum Class Label](/hack/built-in-types/enum-class-label). - -A number of special comments are recognized; they are: - -- `// FALLTHROUGH` in [switch statements](/hack/statements/switch) -- `// strict` and `// partial` in - [headers](/hack/source-code-fundamentals/program-structure) -- `/* HH_FIXME[1234] */` or `/* HH_IGNORE_ERROR[1234] */`, which suppresses - typechecker error reporting for error 1234. -- `/* HH_FIXME[12001] */`, which suppresses warning for code 12001 diff --git a/guides/hack/02-source-code-fundamentals/13-names.md b/guides/hack/02-source-code-fundamentals/13-names.md deleted file mode 100644 index 1132d5191..000000000 --- a/guides/hack/02-source-code-fundamentals/13-names.md +++ /dev/null @@ -1,39 +0,0 @@ -Names are used to label variables, constants, functions, and user-defined types, among other things. A name *must* begin -with an upper- or lowercase letter or underscore, which can optionally be followed by those same characters or decimal digits. - -Local variable names, function parameter names and property names *must* be preceded by `$`. For example: - -```hack -class Data { - const int MAX_VALUE = 100; - private int $value = 0; - /* ... */ -} -interface ICollection { /* ... */ } -enum Position: int { - Top = 0; - Bottom = 1; - Left = 2; - Right = 3; - Center = 4; -} -function compute(int $val): void { - $count = $val + 1; - /* ... */ -} -``` - -## Placeholder Variables -Variables beginning with `$_` are referred to as *placeholder variables*, and should be used where an assignment is structurally required but the value is unused. This is frequently used for the -[list intrinsic function](../expressions-and-operators/list.md) and the [foreach statement](../statements/foreach.md) - for example: - -* `list($foo, $_, $bar) = baz();` if `baz()` returns a 3-element tuple but the middle element is unused -* `foreach ($container as $key => $_) { /* ... */ }` when iterating a keyed container and the values are unneeded - -## The Current Instance Variable -The name `$this` is predefined inside any instance method or constructor when that method is called from within an object context. -`$this` is read-only and designates the object on which the method is being called, or the object being constructed. The type of -`$this` is [`this`](../built-in-types/this.md). - -## Reserved Names -Names beginning with two underscores (__) are reserved by the Hack language. diff --git a/guides/hack/02-source-code-fundamentals/16-keywords.md b/guides/hack/02-source-code-fundamentals/16-keywords.md deleted file mode 100644 index 35646c51b..000000000 --- a/guides/hack/02-source-code-fundamentals/16-keywords.md +++ /dev/null @@ -1,19 +0,0 @@ -Keywords are reserved; they should not and usually *cannot* be used as names. Other words that shouldn't be used for names are the [built-in types](https://docs.hhvm.com/hack/built-in-types/introduction). - -## Keywords -```Hack no-extract -abstract as async attribute await break case catch category children class classname -clone const continue default do echo else enum eval exit extends final -finally for foreach function if implements include include_once inout interface invariant -isset list namespace new newtype noreturn parent print private protected public -require required require_once return self shape super static switch throw trait try tuple -type unset use using where while yield -``` - -## Deprecated Keywords -In addition, the following keywords are reserved for historical / future usage: - -```Hack no-extract -and declare die elseif empty enddeclare endfor endforeach endif endswitch -endwhile global goto instanceof insteadof or record var xor -``` diff --git a/guides/hack/02-source-code-fundamentals/19-literals.md b/guides/hack/02-source-code-fundamentals/19-literals.md deleted file mode 100644 index 6ab2a196d..000000000 --- a/guides/hack/02-source-code-fundamentals/19-literals.md +++ /dev/null @@ -1,200 +0,0 @@ -## Boolean Literals - -The literals `true` and `false` represent the Boolean values True and False, respectively. The type of a Boolean -literal is `bool`. For example: - -```Hack -$val = true; -if ($val === false) { - // ... -} -``` - -## Integer Literals - -Integer literals can be written as decimal; hexadecimal (with prefix `0x` or `0X`, and including letters A-F or a-f); -octal (with prefix `0`); or binary (with prefix `0b` or `0B`). The type of an integer literal is `int`. For example: - -```Hack -$count = 10; // decimal 10 -0b101010 >> 4; // binary 101010 and decimal 4 -0XAf << 012; // hexadecimal Af and octal 12 -``` - -Integer literals can also contain underscores as digit separators. They function only as visual aids, they have no -actual meaning. For example: - -```Hack -$amount = 394_493_392; // completely equivalent to 394493392 -$address = 0x49AD_DF30; -$permission = 012_212_001; -``` - -## Floating-Point Literals - -Floating-point literals typically have an integer part, a decimal point, and a fractional part. They may also have an -exponent part. They are written using decimal digits. The type of a floating-point literal is `float`. For example: - -```Hack -123.456 + 0.6E27 + 2.34e-3; -``` - -The predefined constants `INF` and `NAN` provide access to the floating- point values for infinity and Not-a-Number, respectively. - -Floating-point literals may also contain underscores as digit separators in the integer part, the fractional part, and the exponent part. For example: - -```Hack -123_456.49_30e-30_30; -``` - -## String Literals - -A string literal can have one of the following forms: -* [single-quoted string](#string-literals__single-quoted-string-literals) -* [double-quoted string](#string-literals__double-quoted-string-literals) -* [heredoc string](#string-literals__heredoc-string-literals) -* [nowdoc string](#string-literals__nowdoc-string-literals) - -A string literal is a sequence of zero or more characters delimited in some fashion. The delimiters are not part of -the literal's content. The type of a string literal is `string`. - -### Single-Quoted String Literals - -A single-quoted string literal is a string literal delimited by single-quotes ('). The literal can contain any source -character except single-quote (') and backslash (\\), which can only be represented by their corresponding escape sequence, \\' and \\\\. For example: - -```Hack -'Welcome to Hack!'; -'Can embed a single quote (\') and a backslash (\\) like this'; -``` - -### Double-Quoted String Literals - -A double-quoted string literal is a string literal delimited by double-quotes ("). The literal can contain any source -character except double-quote (") and backslash (\\), which can only be represented by their corresponding escape sequence, \\" and \\\\. For example: - -```Hack -"Welcome to Hack!"; -"Can embed a double quote (\") and a backslash (\\) like this"; -``` - -Certain other (and sometimes non-printable) characters can also be expressed as escape sequences. An *escape sequence* -represents a single-character encoding. For example: - -```Hack -"First line 1\nSecond line 2\n\nFourth line\n"; -"Can embed a double quote (\") and a backslash (\\) like this"; -``` - -Here are the supported escape sequences: - -Escape sequence | Character name | Unicode character ---------------- | --------------| ------ -\\\$ | Dollar sign | U+0024 -\\\" | Double quote | U+0022 -\\\\ | Backslash | U+005C -\e | Escape | U+001B -\f | Form feed | U+000C -\n | New line | U+000A -\r | Carriage Return | U+000D -\t | Horizontal Tab | U+0009 -\v | Vertical Tab | U+000B -\ooo | 1-3-digit octal digit value ooo | -\xhh or \Xhh | 1-2-digit hexadecimal digit value hh | U+00hh -\u{xxxxxx} | UTF-8 encoding of Unicode codepoint U+xxxxxx | U+xxxxxx - -Within a double-quoted string literal a dollar ($) character *not* escaped by a backslash (\\) is handled using *[variable -substitution rules](#variable-substitution)*. - -### Heredoc String Literals - -A heredoc string literal is a string literal delimited by `<<< id` and `id`. The literal can contain any source character. -Certain other (and sometimes non-printable) characters can also be expressed as [escape sequences](#string-literals__double-quoted-string-literals). - -For example: - -``` -$var = 42; -$s = <<< ID -Wow, look at this text! -We can even have a semicolon here! ; or '' or ""! -Variable substitution: $var -ID; -echo ">$s<\n"; -``` - -Heredoc literals also support [variable substitution](#variable-substitution). - -When working with heredoc literals, keep the following rules in mind: -* The start and end `id` must be the same. -* Only horizontal white space is permitted between `<<<` and the start `id`. -* No white space is permitted between the start `id` and the new-line that follows. -* No white space is permitted between the new-line and the end `id` that follows. -* Except for an optional semicolon (`;`), no characters—not even comments or white space—are permitted between the end `id` and the new-line that terminates that source line. - -### Nowdoc String Literals - -A nowdoc string literal looks like a [heredoc string literal](#string-literals__heredoc-string-literals) except that in the former the start -`id` is enclosed in single quotes (`'`). - -For example: - -``` -$var = 42; -$s = <<< 'ID' -Wow, look at this text! -We can even have a semicolon here! ; or '' or ""! -Variable substitution: $var -ID; -echo ">$s<\n"; -``` -The two forms of string literal (heredoc, nowdoc) have the same semantics and constraints except that **nowdoc literals do not support variable substitution.** - -Remember: White space is not permitted between the start `id` and its enclosing single quotes (`'`). - -## Variable Substitution -When a variable name is seen inside a double-quoted string, after that variable is evaluated, its value is converted to `string` -and is substituted into the string in place of the variable-substitution expression. Subscript or property accesses are resolved -according to the rules of the [subscript operator](../expressions-and-operators/subscript.md) and -[member selection operator](../expressions-and-operators/member-selection.md), respectively. If the character sequence following -the `$` does not parse as a recognized name, then the `$` character is instead interpreted verbatim and no variable substitution -is performed. - -Consider the following example: - -```hack -class C { - public int $p1 = 2; -} - -<<__EntryPoint>> -function main(): void { - $x = 123; - echo ">\$x.$x"."<\n"; - - $myC = new C(); - echo "\$myC->p1 = >$myC->p1<\n"; -} -``` - -## The Null Literal - -There is one null-literal value, `null`, which has type `null`. For example: - -```Hack -function has_default_arg(num $arg, ?num $base = null): void {} -``` - -Here, `null` is used as a default argument value in the function `has_default_arg`. - -In the following example: - -```hack -type IdSet = shape('id' => ?string, 'url' => ?string, 'count' => int); - -function get_IdSet(): IdSet { - return shape('id' => null, 'url' => null, 'count' => 0); -} -``` - -`null` is used to initialize two data fields in a shape. diff --git a/guides/hack/02-source-code-fundamentals/25-scope.md b/guides/hack/02-source-code-fundamentals/25-scope.md deleted file mode 100644 index 8ce45d95b..000000000 --- a/guides/hack/02-source-code-fundamentals/25-scope.md +++ /dev/null @@ -1,28 +0,0 @@ -The same name can designate different things at different places in a program. For each different thing that a name -designates, that name is visible only within a part of the program called that name's *scope*. The following distinct scopes exist: -- Script, which means from the point of declaration/first initialization through to the end of that script, -including any [included scripts](script-inclusion.md). -- Function, which means from the point of declaration/first initialization through to the end of that -[function](../functions/defining-a-function). -- Class, which means the body of that class and any classes derived from it ([defining a class](../classes/defining-a-basic-class.md)). -- Interface, which means the body of that interface, any interfaces derived from it, and any classes that implement it -([implementing an interface](../classes/implementing-an-interface.md)). -- Namespace, which means from the point of declaration/first initialization through to the end of that -[namespace](../source-code-fundamentals/namespaces.md). - -A variable declared or first initialized inside a function has function scope. - -Each function has its own function scope. An [anonymous function](../functions/anonymous-functions.md) has its own scope -separate from that of any function inside which that anonymous function is defined. - -The scope of a parameter is the body of the function in which the parameter is declared. For the purposes of scope, a -[catch-block](../statements/try.md) is treated like a function body. - -The scope of a class member ([defining a class](../classes/defining-a-basic-class.md)) declared in, or inherited by, a class type `C` is -the body of `C`. - -The scope of an interface member ([implementing an interface](../classes/implementing-an-interface.md)) declared in, or inherited by, an interface -type `I` is the body of `I`. - -When a [trait](../classes/using-a-trait.md) is used by a class or an interface, the trait's members take on the scope of a -member of that class or interface. diff --git a/guides/hack/02-source-code-fundamentals/28-constants.md b/guides/hack/02-source-code-fundamentals/28-constants.md deleted file mode 100644 index 04b05e958..000000000 --- a/guides/hack/02-source-code-fundamentals/28-constants.md +++ /dev/null @@ -1,37 +0,0 @@ -A constant is a named value. Once defined, the value of the constant *cannot* be changed. A constant can be defined in one -of two ways: using the `const` keyword at the top level, or inside a class or -interface. For example: - -```hack -const int MAX_COUNT = 123; -class C { - const float MAX_HEIGHT = 10.5; - const float UPPER_LIMIT = C::MAX_HEIGHT; -} - -<<__EntryPoint>> -function main(): void { - echo "MAX_COUNT = ".MAX_COUNT."\n"; - echo "MAX_HEIGHT = ".(string)C::MAX_HEIGHT."\n"; -} -``` - -## Context-Dependent Constants - -The following constants --- sometimes referred to as *magic constants* --- are automatically available to all scripts; their values -are not fixed: - - Constant Name | Description - ----------------- | --------- -`__CLASS__` | `string`; The name of the current class. From within a trait method, the name of the class in which that trait is used. If the current namespace is a defined, named namespace (not in root), the namespace name and "\\" are prepended, in that order. If used outside all classes, the value is the empty string. -`__DIR__` | `string`; The directory name of the script. A directory separator is only appended for the root directory. -`__FILE__` | `string`; The full name of the script. -`__FUNCTION__` | `string`; Inside a function, the name of the current function exactly as it was declared, with the following prepended: If a named namespace exists, that namespace name followed by "\". If used outside all functions, the result is the empty string. For a method, no parent-class prefix is present. (See `__METHOD__` and [anonymous functions](../functions/anonymous-functions.md).) -`__LINE__` | `int`; the number of the current source line -`__METHOD__` | `string`; Inside a method, the name of the current method exactly as it was declared, with the following prepended, in order: If a named namespace exists, that namespace name followed by "\"; the parent class name or trait name followed by `::`. If used outside all methods, the result is the same as for `__FUNCTION__`. -`__NAMESPACE__` | `string`; The name of the current namespace exactly as it was declared. For the root namespace, the result is the empty string. -`__TRAIT__` | `string`; The name of the current trait. From within a trait method, the name of the current trait. If used outside all traits, the result is the empty string. - -## Core Predefined Constants - -Namespace HH\Lib\Math contains a number of integer-related constants (such as `INT64_MAX` and `INT64_MIN`). diff --git a/guides/hack/02-source-code-fundamentals/31-variables.md b/guides/hack/02-source-code-fundamentals/31-variables.md deleted file mode 100644 index a7c481280..000000000 --- a/guides/hack/02-source-code-fundamentals/31-variables.md +++ /dev/null @@ -1,86 +0,0 @@ -A variable is a named area of data storage that has a type and a value. Distinct variables may have the same name provided -they are in different [scopes](scope.md). A [constant](constants.md) is a variable that, once initialized, its value cannot -be changed. Based on the context in which it is declared, a variable has a scope. - -The following kinds of variable may exist in a script: -- [Local variable](#local-variables) -- [Array element](#array-elements) -- [Instance property](#instance-properties) -- [Static property](#static-properties) -- [Class and interface constant](#class-and-interface-constants) - -## Local Variables - -Except for function parameters, a local variable is never defined explicitly; instead, it is created when it is first -assigned a value. A local variable can be assigned to as a parameter in the parameter list of a function definition or -inside any compound statement. It has function scope. - -Consider the following example: - -```Hack -function do_it(bool $p1): void { - $count = 10; - // ... - if ($p1) { - $message = "Can't open file."; - // ... - } - // ... -} - -function call_it(): void { - do_it(true); -} -``` - -Here, the parameter `$p1` (which is a local variable) takes on the value `true` when `do_it` is called. The local -variables `$count` and `$message` take on the type of the respective value being assigned to them. - -Consider the following example: - -```hack -function f(): void { - $lv = 1; - echo "\$lv = $lv\n"; - ++$lv; -} - -<<__EntryPoint>> -function main(): void { - for ($i = 1; $i <= 3; ++$i) - f(); -} -``` - -In this example, the value of the local variable `$lv` is not preserved between -the function calls, so this function `f` outputs "`$lv = 1`" each time. - -## Array Elements - -An array is created via a vec-literal, a dict-literal, a -keyset-literal. At the same time, one or more elements may be created -for that array. New elements are inserted into an existing array via -the [simple-assignment](../expressions-and-operators/assignment.md) -operator in conjunction with the [subscript -`[]`](../expressions-and-operators/subscript.md) operator. - -The scope of an array element is the same as the scope of that array's name. - -```Hack -$colors1 = vec["green", "yellow"]; // create a vec of two elements -$colors1[] = "blue"; // add element 2 with value "blue" -$colors2 = dict[]; // create an empty dict -$colors2[4] = "black"; // create element 4 with value "black" -``` - -## Instance Properties - -These are described in the [class instance properties](../classes/properties.md) section. They have class scope. - -## Static Properties - -These are described in the [class static properties](../classes/properties.md) section. They have class scope. - -## Class and Interface Constants - -These are described in the [class constants](../classes/constants.md) section. They have class or interface scope. diff --git a/guides/hack/02-source-code-fundamentals/34-script-inclusion.md b/guides/hack/02-source-code-fundamentals/34-script-inclusion.md deleted file mode 100644 index 03f0f5cbe..000000000 --- a/guides/hack/02-source-code-fundamentals/34-script-inclusion.md +++ /dev/null @@ -1,46 +0,0 @@ -When creating large applications or building component libraries, it is useful to be able to break up the source code into small, -manageable pieces each of which performs some specific task, and which can be shared somehow, and tested, maintained, and -deployed individually. For example, a programmer might define a series of useful constants and use them in numerous and -possibly unrelated applications. Likewise, a set of class definitions can be shared among numerous applications needing to create objects of those types. - -An *include file* is a file that is suitable for *inclusion* by another file. The file doing the including is -the *including file*, while the one being included is the *included file*. A file can be either an including file or -an included file, both, or neither. - -The recommended way to approach this is to [use an autoloader](/hack/getting-started/starting-a-real-project#starting-a-real-project__autoloading) - however, first you need to include -the autoloader itself. - -The `require_once()` directive is used for this: - -``` -namespace MyProject; - -require_once(__DIR__.'/../vendor/autoload.hack'); - -<<__EntryPoint>> -function main(): void { - \Facebook\AutoloadMap\initialize(); - someFunction(); -} -``` - -The name used to specify an include file may contain an absolute or relative path; absolute paths are *strongly* recommended, using the `__DIR__` constant to resolve paths relative to the current file. - -`require_once()` will raise an error if the file can not be loaded (e.g. if it is inaccessible or does not exist) , and will only load the file once, even if `require_once()` is used multiple times with the same file. - -## Future Changes - -We expect to make autoloading fully-automatic, and remove inclusion directives from the language. - -## Legacy Issues - -For relative paths, the configuration directive [`include_path`](https://docs.hhvm.com/hhvm/configuration/INI-settings#supported-php-ini-settings) is used to resolve the include file's location. - -It is currently possible (though strongly discoraged) for top-level code to exist in a file, without -being in a function. In this cases, including a file may execute code, not just import definitions. - -Several additional directives exist, but are strongly discouraged: - -- `require()`: like `require_once()`, but will potentially include a file multiple times -- `include()`: like `require()`, but does not raise an error if the file is inaccessible -- `include_once()`: like `require_once()`, but does not raise an error if the file is inaccessible. diff --git a/guides/hack/02-source-code-fundamentals/37-namespaces.md b/guides/hack/02-source-code-fundamentals/37-namespaces.md deleted file mode 100644 index 9a5468769..000000000 --- a/guides/hack/02-source-code-fundamentals/37-namespaces.md +++ /dev/null @@ -1,108 +0,0 @@ -A ***namespace*** is a container for a set of (typically related) definitions of classes, interfaces, traits, functions, and constants. - -When the same namespace is declared across multiple scripts, and those scripts are combined into the same program, the resulting namespace -is the union of all of the namespaces' individual components. - -## The Root Namespace -In the absence of any namespace definition, the names of subsequent classes, interfaces, traits, functions, and constants are in -the ***root namespace***, which is not named. - -Some types, such as `Exception`, and constants, and library functions (such as `sqrt`) are inherited from PHP and, as such, are also defined outside a namespace. Prefix a backslash (`\`) to refer to these types or functions; for example: `\Exception`, `\sqrt`. - -## Sub-Namespaces -A namespace can have ***sub-namespaces***, where a sub-namespace name shares a common prefix with another namespace. - -For example, the namespace `Graphics` can have sub-namespaces `Graphics\TwoD` and `Graphics\ThreeD`, for two- and three-dimensional facilities, -respectively. - -Apart from their common prefix, a namespace and its sub-namespaces have no special relationship. For example, `NS1\Sub` can exist without `NS1`. A named top-level namespace does not need to exist for a sub-namespace to exist. - -## Reserved Namespaces -The namespaces `HH`, `PHP`, `php`, and sub-namespaces beginning with those prefixes are reserved for use by Hack. - -## XHP and the `HTML` Namespace -As of HHVM 4.73 and XHP-Lib v4, standard XHP elements like `

` are defined in `Facebook\XHP\HTML` (for this example, specifically `Facebook\XHP\HTML\p`). - -For more information, see [XHP Namespace Syntax](/hack/XHP/basic-usage#namespace-syntax). - -## Special Constants -When debugging, use the predefined constant [`__NAMESPACE__`](/hack/source-code-fundamentals/constants#context-dependent-constants) to access the name of the current namespace. - -## Declaring a Namespace -Namespace declarations can be file-scoped with `namespace MyNS;`, or block-scoped with `namespace MyNS { ... }`. - -With semicolons, a namespace extends until the end of the script, or until the next namespace declaration, whichever is first. - -```Hack -namespace NS1; -// ... // __NAMESPACE__ is "NS1" -namespace NS3\Sub1; -// ... // __NAMESPACE__ is "NS3\Sub1" -``` - -With brace delimiters, a namespace extends from the opening brace to the closing brace. - -```Hack -namespace NS1 { - // __NAMESPACE__ is "NS1" -} -namespace { - // __NAMESPACE__ is "" -} -namespace NS3\Sub1 { - // __NAMESPACE__ is "NS3\Sub1" -} -``` -## Importing from other Namespaces -With the `use` keyword, a namespace can import one or more member names into a scope, optionally giving them each an alias. - -When importing many names, use `{ ... }`. - -```Hack no-extract -use namespace NS1\{C, I, T}; // instead of `NS1\C, NS1\I, NS1\T` -``` - -Imported names can designate a namespace, a sub-namespace, a class or interface or trait, a function, or any built-in type. - -If an imported name introduces ambiguity, you can refer to name `foo` with `namespace\foo`—using the the actual word `namespace`. For example, if you're importing a function `bar()`, but also want to call the `bar()` function from within your own namespace, refer to the one native to your namespace with `namespace\bar()`. - - -```Hack -namespace NS1 { - const int CON1 = 100; - function f(): void { - echo "In ".__FUNCTION__."\n"; - } - - class C { - const int C_CON = 200; - public function f(): void { - echo "In ".__NAMESPACE__."...".__METHOD__."\n"; - } - } - - interface I { - const int I_CON = 300; - } - - trait T { - public function f(): void { - echo "In ".__TRAIT__."...".__NAMESPACE__."...".__METHOD__."\n"; - } - } -} - -namespace NS2 { - use type NS1\{C, I, T}; - - class D extends C implements I { - use T; - } - - function f(): void { - $d = new D(); - echo "CON1 = ".\NS1\CON1."\n"; - \NS1\f(); - } -} -``` diff --git a/guides/hack/02-source-code-fundamentals/source-code-fundamentals-category.txt b/guides/hack/02-source-code-fundamentals/source-code-fundamentals-category.txt deleted file mode 100644 index 263beb086..000000000 --- a/guides/hack/02-source-code-fundamentals/source-code-fundamentals-category.txt +++ /dev/null @@ -1 +0,0 @@ -Getting Started diff --git a/guides/hack/02-source-code-fundamentals/source-code-fundamentals-summary.txt b/guides/hack/02-source-code-fundamentals/source-code-fundamentals-summary.txt deleted file mode 100644 index 62e10cc88..000000000 --- a/guides/hack/02-source-code-fundamentals/source-code-fundamentals-summary.txt +++ /dev/null @@ -1 +0,0 @@ -Basic syntax, namespaces, and the autoloader. diff --git a/guides/hack/03-expressions-and-operators/01-introduction.md b/guides/hack/03-expressions-and-operators/01-introduction.md deleted file mode 100644 index 0c1c9c4f7..000000000 --- a/guides/hack/03-expressions-and-operators/01-introduction.md +++ /dev/null @@ -1,47 +0,0 @@ -When combined, operators evaluate according to their associativity. For more information, see [Operator Precedence](/hack/expressions-and-operators/operator-precedence). - -## Assignment Operators -* [Assignment](/hack/expressions-and-operators/assignment) (`=`, `+=`, and more) -* [Coalescing Assignment](/hack/expressions-and-operators/coalesce#coalescing-assignment-operator) (`??=`) - -## Comparison Operators -* [Comparison](/hack/expressions-and-operators/comparisons) (`>`, `>=`,`<`,`<=`) -* [Equality Comparison](/hack/expressions-and-operators/equality) (`==`, `!=`, `===`,`!==`) -* [Logical Comparison](/hack/expressions-and-operators/logical-operators) (`&&`, `||`, `!`) -* [Spaceship Comparator](/hack/expressions-and-operators/comparisons#the-spaceship-operator) (`<=>`) - -## Arithmetic Operators -* [Arithmetic](/hack/expressions-and-operators/arithmetic) (`+`, `-`, `*`, `/`, and more) -* [Increment](/hack/expressions-and-operators/incrementing-and-decrementing) (`++`) -* [Decrement](/hack/expressions-and-operators/incrementing-and-decrementing) (`--`) - -## Bitwise and Bit Shift Operators -* [Bitwise](/hack/expressions-and-operators/bitwise-operators) (`&`, `|`, `^`, `<<`, `>>`, `~`) - -## Class and Member Operators -* [Access Instance Properties and Methods](/hack/expressions-and-operators/member-selection) (`->`, `?->`) -* [Access Static Properties and Methods](/hack/expressions-and-operators/scope-resolution) (`::`) -* [Access XHP Attributes](/hack/expressions-and-operators/XHP-attribute-selection) (`->:`) -* [Create an Object](/hack/expressions-and-operators/new) (`new`) -* [Get the name of a class](/hack/expressions-and-operators/nameof) (`nameof`) - -## Built-in Type Operators -* [Cast/Convert Types](/hack/expressions-and-operators/casting) (`(int)`, `(string)`, and more) -* [Check Types](/hack/expressions-and-operators/type-assertions#checking-types-with-is) (`is`) -* [Enforce Types](/hack/expressions-and-operators/type-assertions#enforcing-types-with-as-and-as) (`as`, `?as`) -* [Index into Hack Arrays and Strings](/hack/expressions-and-operators/subscript) (`[]`) -* [String Concatenation](/hack/expressions-and-operators/string-concatenation) (`.`) -* [Unpack Types](/hack/expressions-and-operators/list) (`list`) - -## Error Control Operators -* [Check / Assert an invariant](/hack/expressions-and-operators/invariant) (`invariant`) -* [Suppress Errors](/hack/expressions-and-operators/error-control) (`@`) - -## Other Function Operators -* [Async: Suspend Execution](/hack/expressions-and-operators/await) (`await`) -* [Coalesce: Non-Null Evaluation](/hack/expressions-and-operators/coalesce) (`??`) -* [Echo: Write to Standard Output](/hack/expressions-and-operators/echo) (`echo`) -* [Exit: Terminate a Function](/hack/expressions-and-operators/exit) (`exit`) -* [Pipe: Chain Function Calls](/hack/expressions-and-operators/pipe) (`|>` then stored in `$$`) -* [Ternary: Alternative `If` Evaluation](/hack/expressions-and-operators/ternary) (`? :`, `?:`) -* [Yield: Define a Generator](/hack/expressions-and-operators/yield) (`yield`) diff --git a/guides/hack/03-expressions-and-operators/07-operator-precedence.md b/guides/hack/03-expressions-and-operators/07-operator-precedence.md deleted file mode 100644 index cc3f225a3..000000000 --- a/guides/hack/03-expressions-and-operators/07-operator-precedence.md +++ /dev/null @@ -1,35 +0,0 @@ -The precedence of Hack operators is shown in the table below. - -Operators higher in the table have a higher precedence (binding more -tightly). Binary operators on the same row are evaluated according to their -associativity. - -Operator | Description | Associativity ------------- | --------- | --------- -`\` | [Namespace separator](/hack/source-code-fundamentals/namespaces) | Left -`::` | [Scope resolution](/hack/expressions-and-operators/scope-resolution) | Left -`[]` | [Index resolution](/hack/expressions-and-operators/subscript) for Hack Arrays and Strings | Left -`->`, `?->` | [Property selection](/hack/expressions-and-operators/member-selection) and [null-safe property selection](/hack/expressions-and-operators/member-selection#null-safe-member-access) | Left -`new` | [Object creation & Memory allocation](/hack/expressions-and-operators/new) | None -`#`, `()` | [Enum class labels](/hack/built-in-types/enum-class-label) and [Function calling](/hack/functions/introduction) | Left -`clone` | Object cloning (shallowly, not deeply) | None -`readonly`, `await`, `++` `--` (postfix) | [Using readonly](/hack/readonly/explicit-readonly-keywords), [Suspending an async function](/hack/expressions-and-operators/await), and [Incrementing / Decrementing](/hack/expressions-and-operators/incrementing-and-decrementing) (postfix) | Right -`(int)` `(float)` `(string)`, `**`, `@`, `++` `--` (prefix) | [Casting](/hack/expressions-and-operators/casting), [Exponentiation](/hack/expressions-and-operators/arithmetic#exponent), [Suppressing errors](/hack/expressions-and-operators/error-control), and [Incrementing / Decrementing](/hack/expressions-and-operators/incrementing-and-decrementing) (prefix) | Right -`is`, `as` `?as` |[Type checks / Type assertions](/hack/expressions-and-operators/type-assertions) | Left -`!`, `~`, `+` `-` (one argument) | [Logical negation](/hack/expressions-and-operators/logical-operators), [Bitwise negation](/hack/expressions-and-operators/bitwise-operators#bitwise-negation), and [Unary Addition / Subtraction](/hack/expressions-and-operators/arithmetic) | Right -`*` `/` `%` | [Multiplication, Division, and Modulo](/hack/expressions-and-operators/arithmetic) | Left -`.`, `+` `-` (two arguments) | [String concatenation](/hack/expressions-and-operators/string-concatenation) and [Addition / Subtraction](/hack/expressions-and-operators/arithmetic) | Left -`<<` `>>` | [Bitwise shifting](/hack/expressions-and-operators/bitwise-operators) (left and right) | Left -`<` `<=` `>` `>=`, `<=>` | [Comparison operators](/hack/expressions-and-operators/comparisons) and [Spaceship operator](/hack/expressions-and-operators/equality#the-spaceship-operator) | None -`===` `!==` `==` `!=` | [Equality operators](/hack/expressions-and-operators/equality) | None -`&` | [Bitwise AND](/hack/expressions-and-operators/bitwise-operators) | Left -`^` | [Bitwise XOR](/hack/expressions-and-operators/bitwise-operators) | Left -`\|` | [Bitwise OR](/hack/expressions-and-operators/bitwise-operators) | Left -`&&` | [Logical AND](/hack/expressions-and-operators/logical-operators) | Left -`\|\|` | [Logical OR](/hack/expressions-and-operators/logical-operators) | Left -`??` | [Coalesce operator](/hack/expressions-and-operators/coalesce) | Right -`?` `:`, `?:` | [Ternary evaluation](/hack/expressions-and-operators/ternary) and [Elvis operator](/hack/expressions-and-operators/ternary#elvis-operator) | Left -`\|>` | [Pipe / Chain function calls](/hack/expressions-and-operators/pipe) | Left -`=` `+=` `-=` `.=` `*=` `/=` `%=` `<<=` `>>=` `&=` `^=` `\|=`, `??=` | [Assignment operators](/hack/expressions-and-operators/assignment) and [Coalescing assignment operator](/hack/expressions-and-operators/coalesce#coalescing-assignment-operator) | Right -`echo` | [Write to standard output](/hack/expressions-and-operators/echo) | Right -`include` `require` | [Include or Require a script](/hack/source-code-fundamentals/script-inclusion)| Left diff --git a/guides/hack/03-expressions-and-operators/09-echo.md b/guides/hack/03-expressions-and-operators/09-echo.md deleted file mode 100644 index be68c4fe8..000000000 --- a/guides/hack/03-expressions-and-operators/09-echo.md +++ /dev/null @@ -1,12 +0,0 @@ -This intrinsic function converts the value of an expression to `string` (if necessary) and writes the string to standard output. For example: - -```Hack -$v1 = 23; -echo '>>'.$v1."<<\n"; // outputs ">>23<<" - -$v3 = "abc{$v1}xyz"; -echo "$v3\n"; -``` - -For a discussion of value substitution in strings, see [string literals](../source-code-fundamentals/literals.md#string-literals__double-quoted-string-literals). -For conversion to strings, see [type conversion](../types/type-conversion.md#converting-to-string). diff --git a/guides/hack/03-expressions-and-operators/10-exit.md b/guides/hack/03-expressions-and-operators/10-exit.md deleted file mode 100644 index c9dfead5f..000000000 --- a/guides/hack/03-expressions-and-operators/10-exit.md +++ /dev/null @@ -1,14 +0,0 @@ -This intrinsic function terminates the current script, optionally specifying an *exit value* that is returned to the execution environment. For example: - -```Hack -exit ("Closing down\n"); -exit (1); -``` - -If the exit value is a string, that string is written out. If the exit value is an integer, that represents the script's *exit status code*, -which must be in range 0-254. Value 255 is reserved by Hack. Value 0 represents *success*. - -`exit` performs the following operations, in order: -- Writes an optional string to standard output. -- Calls any functions registered via the library function [`register_shutdown_function`](http://www.php.net/register_shutdown_function) -in their order of registration. diff --git a/guides/hack/03-expressions-and-operators/12-invariant.md b/guides/hack/03-expressions-and-operators/12-invariant.md deleted file mode 100644 index a43a7849c..000000000 --- a/guides/hack/03-expressions-and-operators/12-invariant.md +++ /dev/null @@ -1,18 +0,0 @@ -This intrinsic function behaves like a function with a `void` return type. It is intended to indicate a programmer error for a condition that -should never occur. For example: - -```Hack no-extract -invariant($obj is B, "Object must have type B"); -invariant(!$p is null, "Value can't be null"); -$max = 100; -invariant(!$p is null && $p <= $max, "\$p's value %d must be <= %d", $p, $max); -``` - -If the first argument value tests true, the program continues execution; otherwise, the library function -`invariant_violation` is called. That function does not return; instead, it either throws an -exception of type `\HH\InvariantException`, or calls the handler previously registered by the library function -`invariant_callback_register`. - -The first argument is a boolean expression. The second argument is a string that can contain -text and/or optional formatting information as understood by the library function `Str\format`. The optional -comma-separated list of values following the string must match the set of types expected by the optional formatting information inside that string. diff --git a/guides/hack/03-expressions-and-operators/13-list.md b/guides/hack/03-expressions-and-operators/13-list.md deleted file mode 100644 index 33a2afd11..000000000 --- a/guides/hack/03-expressions-and-operators/13-list.md +++ /dev/null @@ -1,66 +0,0 @@ -`list()` is special syntax for unpacking tuples. It looks like a function, but it isn't one. It can be used in positions that you would assign into. - -```Hack -$tuple = tuple('one', 'two', 'three'); -list($one, $two, $three) = $tuple; -echo "1 -> {$one}, 2 -> {$two}, 3 -> {$three}\n"; -``` - -The `list()` will consume the `tuple` on the right and assign the variables inside of itself in turn. -If the types of the tuple elements differ, the `list()` syntax will make sure that the type information is preserved. - -```Hack -<<__EntryPoint>> -function main(): void { - $tuple = tuple('string', 1, false); - list($string, $int, $bool) = $tuple; - takes_string($string); - takes_int($int); - takes_bool($bool); - echo 'The typechecker understands the types of list().'; -} - -function takes_string(string $_): void {} -function takes_int(int $_): void {} -function takes_bool(bool $_): void {} -``` - -You can use the special `$_` variable to ignore certain elements of the `tuple`. You can use `$_` multiple times in one assignment and have the types be different. You **MUST** use `$_` if you want to ignore the elements at the end. You are not allowed to use a `list()` with fewer elements than the length of the `tuple`. - -```Hack -$tuple = tuple('a', 'b', 'c', 1, 2, 3); -list($_, $b, $c, $_, $two, $_) = $tuple; -echo "b -> {$b}, c -> {$c}, two -> {$two}\n"; -``` - -If the RHS and the LHS of a `list()` are referring to the same variables, the behavior is undefined. As of hhvm 4.46, the typechecker will **NOT** warn you when you make this mistake! HHVM will also not understand what you mean. Do **NOT** do this. - -```Hack -$a = tuple(1, 2); -// BAD, since $a is used on the right and on the left! -list($a, $b) = $a; -``` - -You may also use `list()` on a `vec`, but it is not recommended. - -`list()` can be nested inside of another `list()` to unpack `tuples` from within `tuples`. - -```Hack -$tuple = tuple('top level', tuple('inner', 'nested')); -list($top_level, list($inner, $nested)) = $tuple; -echo "top level -> {$top_level}, inner -> {$inner}, nested -> {$nested}\n"; -``` - -My personal favorite place to put a `list()` is inside a `foreach($vec_of_tuples as list($one, $two, $three))`. - -```Hack -$vec_of_tuples = vec[ - tuple('A', 'B', 'C'), - tuple('a', 'b', 'c'), - tuple('X', 'Y', 'Z'), -]; - -foreach ($vec_of_tuples as list($first, $second, $third)) { - echo "{$first} {$second} {$third}\n"; -} -``` diff --git a/guides/hack/03-expressions-and-operators/21-new.md b/guides/hack/03-expressions-and-operators/21-new.md deleted file mode 100644 index 78e52ff5b..000000000 --- a/guides/hack/03-expressions-and-operators/21-new.md +++ /dev/null @@ -1,39 +0,0 @@ -The `new` operator allocates memory for an object that is an instance of the specified class. The object is initialized by calling the -class's [constructor](../classes/constructors.md) passing it the optional argument list, just like a function call. If the class has no -constructor, the constructor that class inherits (if any) is used. For example: - -```Hack -class Point { - private static int $pointCount = 0; // static property with initializer - private float $x; // instance property - private float $y; // instance property - - public function __construct(num $x = 0, num $y = 0) { // instance method - $this->x = (float)$x; // access instance property - $this->y = (float)$y; // access instance property - ++Point::$pointCount; // include new Point in Point count - } -} - -function main(): void { - $p1 = new Point(); // create Point(0.0, 0.0) - $p2 = new Point(5, 6.7); // create Point(5.0, 6.7) -} -``` - -The result is an object of the type specified. - -The `new` operator may also be used to allocate memory for an instance of a [classname](../built-in-types/classname.md) type; for example: - -```Hack -final class C {} -function f(classname $clsname): void { - $w = new $clsname(); -} -``` - -Any one of the keywords `parent`, `self`, and `static` can be used between the `new` and the constructor call, as follows. From within a -method, the use of `static` corresponds to the class in the inheritance context in which the method is called. The type of the object -created by an expression of the form `new static` is -[`this`](../built-in-types/this.md). See [scope resolution](scope-resolution.md) for a discussion of `parent`, -`self`, and `static` in this context. diff --git a/guides/hack/03-expressions-and-operators/25-subscript.md b/guides/hack/03-expressions-and-operators/25-subscript.md deleted file mode 100644 index 751863e06..000000000 --- a/guides/hack/03-expressions-and-operators/25-subscript.md +++ /dev/null @@ -1,25 +0,0 @@ -The subscript operator, `[...]` is used to designate an element of a string, a vec, a dict, or a keyset. The element key is -designated by the expression contained inside the brackets. For a string or vec, the key must have type `int`, while dict and -keyset also allow `string`. The type and value of the result is the type and value of the designated element. For example: - -```Hack -$text = "Hello"; -$e = $text[4]; // designates the element with key 4 value "o" -$text[1] = "?"; // changes the element with key 1 from "e" to "?" - -$v = vec[10, 25, -6]; -$e = $v[1]; // designates the element with key 1 value 25 -$v[2] = 44; // changes the element with key 2 from -6 to 44 - -$d = dict["red" => 4, "white" =>12, "blue" => 3]; -$e = $d["white"]; // designates the element with key "white" value 12 -$d["red"] = 9; // changes the element with key "red" from 4 to 9 -``` - -For a vec, the brackets can be empty, provided the subscript expression is the destination of an assignment. This results in a -new element being inserted at the right-hand end. The type and value of the result is the type and value of the new element. For example: - -```Hack -$v = vec[10, 25, -6]; -$v[] = 99; // creates new element with key 3, value 99 -``` diff --git a/guides/hack/03-expressions-and-operators/29-member-selection.md b/guides/hack/03-expressions-and-operators/29-member-selection.md deleted file mode 100644 index 53bbd3309..000000000 --- a/guides/hack/03-expressions-and-operators/29-member-selection.md +++ /dev/null @@ -1,42 +0,0 @@ -The operator `->` is used to access instance properties and instance -methods on objects. - -```Hack file:intbox.hack -class IntBox { - private int $x; - - public function __construct(int $x) { - $this->x = $x; // Assigning to property. - } - - public function getX(): int { - return $this->x; // Accessing property. - } -} - -<<__EntryPoint>> -function main(): void { - $ib = new IntBox(42); - $x = $ib->getX(); // Calling instance method. -} -``` - -## Null Safe Member Access - -The operator `?->` allows access to objects that [may be null](../types/nullable-types.md). - -If the value is null, the result is null. Otherwise, `?->` behaves -like `->`. - -```Hack file:intbox.hack -function my_example(?IntBox $ib): ?int { - return $ib?->getX(); -} -``` - -Note that arguments are always evaluated, even if the object is -null. `$x?->foo(bar())` will call `bar()` even if `$x` is null. - -## XHP Attribute Access - -The [operator `->:`](/hack/expressions-and-operators/XHP-attribute-selection) is used for accessing XHP attributes. diff --git a/guides/hack/03-expressions-and-operators/33-scope-resolution.md b/guides/hack/03-expressions-and-operators/33-scope-resolution.md deleted file mode 100644 index c80a63c12..000000000 --- a/guides/hack/03-expressions-and-operators/33-scope-resolution.md +++ /dev/null @@ -1,108 +0,0 @@ -When the left-hand operand of operator `::` is an enumerated type, the right-hand operand must be the name of an enumeration constant -within that type. For example: - -```Hack -enum ControlStatus: int { - Stopped = 0; - Stopping = 1; - Starting = 2; - Started = 3; -} - -function main(ControlStatus $p1): void { - switch ($p1) { - case ControlStatus::Stopped: - // ... - break; - case ControlStatus::Stopping: - // ... - break; - default: - break; - } -} -``` - -From inside or outside a class or interface, operator `::` allows the selection of a constant. From inside or outside a class, this -operator allows the selection of a static property, static method, or instance method. For example: - -```Hack -final class MathLibrary { - const PI = 3.1415926; - public static function sin(float $val): float { - return 0.0; // stub - } -} - -function use_it(): void { - $radius = 3.4; - $area = MathLibrary::PI * $radius * $radius; - $v = MathLibrary::sin(2.34); -} -``` - -From within a class, `::` also allows the selection of an overridden property or method. - -From within a class, `self::m` refers to the member `m` in that class. For example: - -```Hack -class Point { - private static int $pointCount = 0; - public static function getPointCount(): int { - return self::$pointCount; - } -} -``` - -From within a class, `parent::m` refers to the closest member `m` in the base-class hierarchy, not including the current class. For example: - -```Hack -class MyRangeException extends Exception { - public function __construct(string $message) { - parent::__construct('MyRangeException: '.$message); - } -} -``` - -From within a method, `static::m` refers to the static member `m` in the class that corresponds to the class inheritance context in -which the method is called. This allows *late static binding*. Consider the following scenario: - -```Hack -class Base { - public function b(): void { - static::f(); // calls the most appropriate f() - } - public static function f(): void { - //... - } -} - -class Derived extends Base { - public static function f(): void { - // ... - } -} - -function demo(): void { - $b1 = new Base(); - $b1->b(); // as $b1 is an instance of Base, Base::b() calls Base::f() - $d1 = new Derived(); - $d1->b(); // as $d1 is an instance of Derived, Base::b() calls Derived::f() -} -``` - -The value of a scope-resolution expression ending in `::class` is a string containing the fully qualified name of the current -class, which for a static qualifier, means the current class context. A class identifier followed by `::class` results in a -constant whose value has the [`classname` type](../built-in-types/classname.md) parameterized by the class. For example: - -```Hack -namespace NS_cn; -class C1 { - // ... -} -class C2 { - public static classname $p1 = C1::class; - public static function f(?classname $p): void {} - public static vec> $p2 = vec[C1::class]; -} -``` diff --git a/guides/hack/03-expressions-and-operators/34-nameof.md b/guides/hack/03-expressions-and-operators/34-nameof.md deleted file mode 100644 index b6dc01b76..000000000 --- a/guides/hack/03-expressions-and-operators/34-nameof.md +++ /dev/null @@ -1,47 +0,0 @@ -An expression to get the name of a class as a string, replacement for -[`::class` expressions](/hack/expressions-and-operators/scope-resolution) in -string positions. - -## Quickstart - -```Hack -class C {} -function expect_string(string $s): void {} -function test(): void { - expect_string(nameof C); - $d = dict[]; - $d[nameof C] = 4; -} -``` - -## Full Example - -`nameof` supports direct class names, traits and interfaces, enums, and type aliases. -It also supports the special class identifiers `self`, `static`, and `parent` where -they are valid. - -```Hack -class B {} -class C extends B {} -trait T { - require extends B; - public static function f(): void { - var_dump(nameof T); // "T" - var_dump(nameof self); // "D" (user of trait) - var_dump(nameof parent); // "C" (parent of trait user, not B) - var_dump(nameof static); // "E", receiver for ::f() in main - } -} -class D extends C { use T; } -class E extends D {} - -<<__EntryPoint>> -function main(): void { - E::f(); -} -``` - -The type of a `nameof Target` expression is -[`classname`](/hack/built-in-types/classname) and `typename` when `Target` -is a type alias. [Reified generics](/hack/reified-generics/reified-generics) are not -supported targets for `nameof`. diff --git a/guides/hack/03-expressions-and-operators/37-incrementing-and-decrementing.md b/guides/hack/03-expressions-and-operators/37-incrementing-and-decrementing.md deleted file mode 100644 index 263116c4f..000000000 --- a/guides/hack/03-expressions-and-operators/37-incrementing-and-decrementing.md +++ /dev/null @@ -1,44 +0,0 @@ -Hack provides `++` and `--` syntax for incrementing and decrementing -numbers. - -The following are equivalent: - -```Hack no-extract -$i = $i + 1; -$i += 1; -$i++; -++$i; -``` - -Similarly for decrement: - -```Hack no-extract -$i = $i - 1; -$i -= 1; -$i--; ---$i; -``` - -This is typically used in for loops: - -```Hack -for ($i = 1; $i <= 10; $i++) { - // ... -} -``` - -Note that `++` and `--` are statements, not expressions. They cannot -be used in larger expressions. - -```Hack error -$x = 0; -$y = $x++; // Parse error. -``` - -Instead, the above code must be written as statements. - -```Hack -$x = 0; -$y = $x + 1; -$x++; -``` diff --git a/guides/hack/03-expressions-and-operators/47-error-control.md b/guides/hack/03-expressions-and-operators/47-error-control.md deleted file mode 100644 index f45294239..000000000 --- a/guides/hack/03-expressions-and-operators/47-error-control.md +++ /dev/null @@ -1,13 +0,0 @@ -The operator `@` suppresses any error messages generated by the evaluation of the expression that follows it. For example: - -```Hack -$infile = @fopen("NoSuchFile.txt", 'r'); -``` - -On open failure, the value returned by `fopen` is `false`, which you can use to handle the error. There is no need to -have any error message displayed. - -If a custom error-handler has been established using the library function -[`set_error_handler`](https://www.php.net/manual/en/function.set-error-handler.php) that handler is still called. - -This syntax can be disabled with the `disallow_silence` option in `.hhconfig`. diff --git a/guides/hack/03-expressions-and-operators/49-casting.md b/guides/hack/03-expressions-and-operators/49-casting.md deleted file mode 100644 index bd17b80aa..000000000 --- a/guides/hack/03-expressions-and-operators/49-casting.md +++ /dev/null @@ -1,15 +0,0 @@ -Casts in Hack convert values to different types. To assert a type -without changing its value, see [type assertions](type-assertions.md). - -``` Hack -(float)1; // 1.0 -(int)3.14; // 3, rounds towards zero - -(bool)0; // false - -(string)false; // "" -``` - -Casts are only supported for `bool`, `int`, `float` and `string`. See -[type conversions](../types/type-conversion.md) to understand what -value will be produced. diff --git a/guides/hack/03-expressions-and-operators/51-await.md b/guides/hack/03-expressions-and-operators/51-await.md deleted file mode 100644 index fbc94f249..000000000 --- a/guides/hack/03-expressions-and-operators/51-await.md +++ /dev/null @@ -1,5 +0,0 @@ -`await` suspends the execution of an async function until the result of the asynchronous operation represented by the expression -that follows this keyword, is available. - -See [awaitables](../asynchronous-operations/awaitables.md) for details of `await`, and [async](../asynchronous-operations/introduction.md) for a -general discussion of asynchronous operations. diff --git a/guides/hack/03-expressions-and-operators/52-type-assertions.md b/guides/hack/03-expressions-and-operators/52-type-assertions.md deleted file mode 100644 index c79ec17a5..000000000 --- a/guides/hack/03-expressions-and-operators/52-type-assertions.md +++ /dev/null @@ -1,155 +0,0 @@ -Hack provides the `is` and `as` operators for inspecting types at -runtime. To convert primitive types, see [casting](casting.md). - -The type checker also understands `is` and `as`, so it will infer -precise types. - -## Checking Types with `is` - -The `is` operator checks whether a value has the type specified, and -returns a boolean result. - -```Hack -1 is int; // true -'foo' is int; // false - -1 is num; // true -1.5 is num; // true -'foo' is num; // false -``` - -The type checker understands `is` and [refines -values](../types/type-refinement.md) inside conditionals or after -`invariant` calls. - -```Hack no-extract -function transport(Vehicle $v): void { - if ($v is Car) { - $v->drive(); - } else if ($v is Plane) { - $v->fly(); - } else { - invariant($v is Boat, "Expected a boat"); - $v->sail(); - } -} -``` - -A common pattern with `is` refinement is to use `nonnull` rather than -an explicit type. - -``` Hack no-extract -function transport(?Car $c): void { - if ($c is nonnull) { - // Infers that $c is Car, but saves us - // repeating the name of the type. - $c->drive(); - } -} -``` - -### Enums - -For enums, `is` also checks that the value is valid. - -```Hack -enum MyEnum: int { - FOO = 1; -} - -function demo(): void { - 1 is MyEnum; // true - 42 is MyEnum; // false - 'foo' is MyEnum; // false -} -``` - -### Generics - -Since `is` provides a runtime check, it cannot be used with erased -generics. For generic types, you must use `_` placeholders for type -parameters. - -``` -$v = vec[1, 2, 3]; - -// We can't use `is vec` here. -$v is vec<_>; // true -``` - -If you need to check inner types at runtime, consider using reified -generics instead. - -### Tuples - -For tuples and shapes, `is` validates the size and recursively validates every field in the value. - -```Hack -$x = tuple(1, 2.0, null); -$x is (int, float, ?bool); // true - -$y = shape('foo' => 1); -$y is shape('foo' => int); // true -``` - -### Aliases - -`is` also works with type aliases and type constants, by testing -against the underlying runtime type. - -``` Hack -type myint = int; - -function demo(): void { - 1 is myint; // true -} -``` - -## Enforcing Types with `as` and `?as` - -`as` performs the same checks as `is`. - -However, it throws `TypeAssertionException` if the value has a -different type. The type checker understands that the value must have -the type specified afterwards, so it -[refines](../types/type-refinement.md) the value. - -```Hack -1 as int; // 1 -'foo' as int; // TypeAssertionException -``` - -`as` enables you to narrow a type. - -```Hack no-extract -// Normally you'd want to make transport take a Vehicle -// directly, so you can check when you call the function. -function transport(mixed $m): void { - // Exception if not a Vehicle. - $v = $m as Vehicle; - - if ($v is Car) { - $v->drive(); - } else { - // Exception if $v is not a Boat. - $v as Boat; - $v->sail(); - } -} -``` - -Hack also provides `?as`, which returns `null` if the type does not match. - - -```Hack -1 ?as int; // 1 -'foo' ?as int; // null -``` - -Note that `as` can also be used in type signatures when using -generics. - -## Legacy Type Predicates - -Hack also provides type predicate functions `is_int`, `is_bool` and so -on. You should use `is` instead. diff --git a/guides/hack/03-expressions-and-operators/58-arithmetic.md b/guides/hack/03-expressions-and-operators/58-arithmetic.md deleted file mode 100644 index ef90865e1..000000000 --- a/guides/hack/03-expressions-and-operators/58-arithmetic.md +++ /dev/null @@ -1,105 +0,0 @@ -Hack provides the standard arithmetic operators. These only operate on numeric types: `int` or `float`. - -## Addition - -The operator `+` produces the sum of its operands. - -If both operands have type `int`, the result is `int`. Otherwise, the -operands are converted to `float` and the result is `float`. - -```Hack --10 + 100; // int with value 90 -100 + -3.4e2; // float with value -240 -9.5 + 23.444; // float with value 32.944 -``` - -## Subtraction - -The operator `-` produces the difference of its operands. - - -If both operands have type `int`, the result is `int`. Otherwise, the -operands are converted to `float` and the result is `float`. - -```Hack --10 - 100; // int with value -110 -100 - -3.4e2; // float with value 440 -9.5 - 23.444; // float with value -13.944 -``` - -## Multiplication - -The operator `*` produces the product of its operands. - -If both operands have type `int`, the result is `int`. Otherwise, the -operands are converted to `float` and the result is `float`. - -```Hack --10 * 100; // int result with value -1000 -100 * -3.4e10; // float result with value -3400000000000.0 -``` - -## Division - -The operator `/` produces the quotient from dividing the -left-hand operand by the right-hand one. Dividing by `0` will produce -an exception. - -If both operands have type `int`, and the result can be represented -exactly as an `int`, then the result is an `int`. Otherwise, the result is `float`. - -```Hack -300 / 100; // int result with value 3 -100 / 123; // float result with value 0.8130081300813 -12.34 / 2.3; // float result with value 5.3652173913043 -``` - -## Modulo - -The operator `%` produces the `int` remainder from dividing the -left-hand `int` operand by the right-hand `int` operand. If the right -hand side is 0, an exception is thrown. - -```Hack -5 % 2; // int result with value 1 -``` - -## Exponent - -The operator `**` produces the result of raising the value of its -left-hand operand to the power of the right-hand one. - - -If both operands have non-negative integer values and the result can be represented as -an `int`, the result has type `int`; otherwise, the result has type `float`. - -```Hack -2 ** 3; // int with value 8 -2 ** 3.0; // float with value 8.0 -2.0 ** 3.0; // float with value 8.0 -``` - -## Unary Plus - -The unary plus operator `+` requires an `int` or `float` value, but -has no effect. It exists for symmetry. - -The following are equivalent: - -```Hack -$v = +10; -$v = 10; -``` - -## Unary Minus - -The unary minus operator `-` requires an `int` or `float` value, and -returns the negated value. - -```Hack -$v = 10; -$x = -$v; // $x has value -10 -``` - -Note that due to underflow, negating the smallest negative value -produces the same value. diff --git a/guides/hack/03-expressions-and-operators/69-string-concatenation.md b/guides/hack/03-expressions-and-operators/69-string-concatenation.md deleted file mode 100644 index 744abcb21..000000000 --- a/guides/hack/03-expressions-and-operators/69-string-concatenation.md +++ /dev/null @@ -1,7 +0,0 @@ -The binary operator `.` creates a string that is the concatenation of the left-hand operand and the right-hand operand, in that order. If -either or both operands have type `int`, their values are converted to type `string`. Consider the following examples: - -```Hack -"foo"."bar"; // "foobar" -"A" . 25; // string result with value "A25" -``` diff --git a/guides/hack/03-expressions-and-operators/70-bitwise-operators.md b/guides/hack/03-expressions-and-operators/70-bitwise-operators.md deleted file mode 100644 index acf3dbeab..000000000 --- a/guides/hack/03-expressions-and-operators/70-bitwise-operators.md +++ /dev/null @@ -1,68 +0,0 @@ -Hack provides a range of bitwise operators. These assume that their -operands are `int`. - -## Bitwise AND - -The operator `&` performs a bitwise AND on its two `int` operands and produces an `int`. For example: - -```Hack -0b101111 & 0b101; // result is 0b101 - -$lcase_letter = 0x73; // lowercase letter 's' -$ucase_letter = $lcase_letter & ~0x20; // clear the 6th bit to make uppercase letter 'S' -``` - -## Bitwise OR - -The operator `|` performs a bitwise OR on its two `int` operands and produces an `int`. For example: - -```Hack -0b101111 | 0b101; // result is 0b101111 - -$ucase_letter = 0x41; // uppercase letter 'A' -$lcase_letter = $ucase_letter | 0x20; // set the 6th bit to make lowercase 'a' -``` - -## Bitwise XOR - -The operator `^` performs a bitwise XOR on its two `int` operands and produces an `int`. For example: - -```Hack -0b101111 ^ 0b101; // result is 0b101010 -``` - -## Shifting - -The operator `<<` performs a bitwise left shift. It takes two `int` -operands and produces an `int`. - -`e1 << e2` shifts `e1` left by `e2` bits, zero extending the value. - -```Hack -0b101 << 2; // result is 0b10100 -10 << 3; // result is 80 -``` - -The operator `>>` performs a bitwise right shift. - -``` Hack -0b1011 >> 2; // result is 0b10 -100 >> 2; // result is 25 -``` - -Note that right shifts extend the sign bit: - -```Hack -(1 << 63) >> 63; // result is -1 -``` - -This is because `1 << 63` is 0x8000000000000000, or -9223372036854775808. - -## Bitwise Negation - -The operator `~` performs a bitwise negation on its `int` operand and produces an `int`. For example: - -```Hack -$lLetter = 0x73; // lowercase letter 's' -$uLetter = $lLetter & ~0b100000; // clear the 6th bit to make uppercase letter 'S' -``` diff --git a/guides/hack/03-expressions-and-operators/72-logical-operators.md b/guides/hack/03-expressions-and-operators/72-logical-operators.md deleted file mode 100644 index 9863374b3..000000000 --- a/guides/hack/03-expressions-and-operators/72-logical-operators.md +++ /dev/null @@ -1,62 +0,0 @@ -Hack provides the conventional boolean operations. - -## Logical AND `&&` - -The operator `&&` calculates the boolean AND operation of its two operands. - -```Hack no-extract -if (youre_happy() && you_know_it()) { - clap_your_hands(); -} -``` - -If either operand does not have a boolean type, it is converted to a -boolean first. The result is always a boolean. - -`&&` is short circuiting, so it stops evaluation on the first `false` -result. - -```Hack no-extract -$x = one() && two() && three(); -``` - -The function `three` will not be called if `one()` or `two()` evaluate to `false`. - -## Logical OR `||` - -The operator `||` calculates the boolean OR operation of its two operands. - -```Hack no-extract -if ($weekday === 6 || $weekday === 7) { - echo "It's a weekend"; -} -``` - -If either operand does not have a boolean type, it is converted to a -boolean first. The result is always a boolean. - -`||` is short circuiting, so it stops evaluation on the first `true` -result. - -```Hack no-extract -$x = one() || two() || three(); -``` - -The function `three` will not be called if `one()` or `two()` evaluate to `true`. - - -## Logical NOT `!` - -The operator `!` calculate the boolean negation of its operand. - -If the operand does not have a boolean type, it is converted to a -boolean first. The result is always a boolean. - -```Hack no-extract -while (!is_connected()) { - connect(); -} -``` - -If the operand has type `num`, `!$v` is equivalent to -`$v === 0 || $v === 0.0`. diff --git a/guides/hack/03-expressions-and-operators/75-comparisons.md b/guides/hack/03-expressions-and-operators/75-comparisons.md deleted file mode 100644 index 004f9d9c4..000000000 --- a/guides/hack/03-expressions-and-operators/75-comparisons.md +++ /dev/null @@ -1,47 +0,0 @@ -Hack provides comparison operators. They operate on two operands and -return `bool`. - -* `<`, which represents *less-than* -* `>`, which represents *greater-than* -* `<=`, which represents *less-than-or-equal-to* -* `>=`, which represents *greater-than-or-equal-to* - -The type of the result is `bool`. - -Comparison operators are typically used with numbers: - -``` Hack -1 < 2; // true -1.0 <= 1.5; // true -``` - -However, comparisons also work on strings. This uses a lexicographic ordering -unless both strings are numeric, in which case the numeric values are -used: - -``` Hack -"a" < "b"; // true -"ab" < "b"; // true - -"01" < "1"; // false (1 == 1) -``` - -## The Spaceship Operator -Often referred to as the *spaceship operator*, the binary operator `<=>` compares the values of its operands and returns an `int` -result. If the left-hand value is less than the right-hand value, the result is some unspecified negative value; else, if the left-hand -value is greater than the right-hand value, the result is some unspecified positive value; otherwise, the values are equal and the result is zero. For example: - -```Hack -1 <=> 1; // 0; equal -1 <=> 2; // negative; 1 < 2 -2 <=> 1; // positive; 2 > 1 - -"a" <=> "a"; // 0; same length and content -"a" <=> "b"; // negative; a is lower than b in the collating sequence -"b" <=> "a"; // positive; b is higher than a in the collating sequence -"a" <=> "A"; // positive; lowercase a is higher than uppercase A - -"a" <=> "aa"; // negative; same leading part, but a is shorter than aa -"aa" <=> "a"; // positive; same leading part, but aa is longer than a -"aa" <=> "aa"; // 0; same length and content -``` diff --git a/guides/hack/03-expressions-and-operators/77-equality.md b/guides/hack/03-expressions-and-operators/77-equality.md deleted file mode 100644 index 003593ea6..000000000 --- a/guides/hack/03-expressions-and-operators/77-equality.md +++ /dev/null @@ -1,114 +0,0 @@ -There are two equality operators in Hack: `===` (recommended) and -`==`. They also have not-equal equivalents, which are `!==` and `!=`. - -```Hack -1 === 2; // false -1 !== 2; // true -``` - -## `===` Equality - -`===` compares objects by reference. - -```Hack file:object.hack -class MyObject {} -``` - -```Hack file:object.hack -$obj = new MyObject(); - -// Different references aren't equal. -$obj === new MyObject(); // false - -// The same reference is equal. -$obj === $obj; // true -``` - -`===` compares primitives types by value. - -```Hack -1 === 1; // true -vec[1, 2] === vec[1, 2]; // true -``` - -Items of different primitive types are never equal. - -```Hack -0 === null; // false -vec[1] === keyset[1]; // false - -// Tip: if you want to compare an integer with a float, -// convert the integer value: -(float)1 === 1.0; // true -``` - -`vec`, `keyset`, `dict` and `shape` values are equal if their items -are `===` equal and if the items are in the same order. - -```Hack -vec[1, 2] === vec[1, 2]; // true -vec[1] === vec[2]; // false - -keyset[1, 2] === keyset[1, 2]; // true -keyset[1, 2] === keyset[2, 1]; // false - -dict[0 => null, 1 => null] === dict[0 => null, 1 => null]; // true -dict[1 => null, 0 => null] === dict[0 => null, 1 => null]; // false - -// Tip: Use Keyset\equal and Dict\equal if you -// want to ignore order: -Keyset\equal(keyset[1, 2], keyset[2, 1]); // true -Dict\equal(dict[1 => null, 0 => null], dict[0 => null, 1 => null]); // true -``` - -`!==` returns the negation of `===`. - -```Hack -1 !== 2; // true -2 !== 2; // false -``` - -## `==` Equality - -**If in doubt, prefer `===` equality.** - -`==` compares objects by comparing each property, producing a -structural equality. - -```Hack file:wrapper.hack -class MyWrapper { - public function __construct(private mixed $m) {} -} -``` - -```Hack file:wrapper.hack -new MyWrapper(1) == new MyWrapper(1); // true -new MyWrapper(1) == new MyWrapper(2); // false -``` - -Items of different type are never equal with `==`, the same as `===`. - -```Hack -1 == 1.0; // false -0 == null; // false -"" == 0; // false -``` - -`==` ignores the order when comparing `keyset`, `dict` and `shape` -values. Items within these collections are compared with `==` -recursively. - -```Hack -keyset[1, 2] == keyset[2, 1]; // true -dict[1 => null, 2 => null] == dict[2 => null, 1 => null]; // true - -// Note that vec comparisons always care about order. -vec[1, 2] == vec[2, 1]; // false -``` - -`!=` returns the negation of `==`. - -```Hack -1 != 2; // true -1 != 1; // false -``` diff --git a/guides/hack/03-expressions-and-operators/89-ternary.md b/guides/hack/03-expressions-and-operators/89-ternary.md deleted file mode 100644 index f0317e4cb..000000000 --- a/guides/hack/03-expressions-and-operators/89-ternary.md +++ /dev/null @@ -1,24 +0,0 @@ -The ternary operator `?` `:` is a shorthand for `if` statements. It is -an expression, so it evaluates to a value. For example: - -```Hack no-extract -$days_in_feb = is_leap_year($year) ? 29 : 28; -``` - -It takes three operands `e1 ? e2 : e3`. If `e1` evaluates to a truthy -value, then the result is the evaluation of `e2`. Otherwise the result -is the evaluation of `e3`. - -## Elvis Operator - -There is also a two operand version `?:`, sometimes called the "elvis -operator". This results in the first operand if it evaluates to a truthy -value. For example: - -``` Hack no-extract -$x = foo() ?: bar(); - -// Is equivalent to: -$tmp = foo(); -$x = $tmp ? $tmp : bar(); -``` diff --git a/guides/hack/03-expressions-and-operators/91-coalesce.md b/guides/hack/03-expressions-and-operators/91-coalesce.md deleted file mode 100644 index b3fa2db8a..000000000 --- a/guides/hack/03-expressions-and-operators/91-coalesce.md +++ /dev/null @@ -1,106 +0,0 @@ -Given the expression `e1 ?? e2`, if `e1` is defined and not `null`, then the -result is `e1`. Otherwise, `e2` is evaluated, and its value becomes the result. -There is a sequence point after the evaluation of `e1`. - -```Hack -$nully = null; -$nonnull = 'a string'; -\print_r(vec[ - $nully ?? 10, // 10 as $nully is `null` - $nonnull ?? 10, // 'a string' as $nonnull is `nonnull` -]); - -$arr = dict['black' => 10, 'white' => null]; -\print_r(vec[ - $arr['black'] ?? -100, // 10 as $arr['black'] is defined and not null - $arr['white'] ?? -200, // -200 as $arr['white'] is null - $arr['green'] ?? -300, // -300 as $arr['green'] is not defined -]); -``` - -It is important to note that the right-hand side of the `??` operator will be -conditionally evaluated. If the left-hand side is defined and not `null`, the -right-hand side will not be evaluated. - -```Hack no-extract -$nonnull = 4; - -// The `1 / 0` will never be evaluated and no Exception is thrown. -$nonnull ?? 1 / 0; - -// The function_with_sideeffect is never invoked. -$nonnull ?? function_with_sideeffect(); -``` - - -## `??` and `idx()` - -The `??` operator is similar to the built-in function `idx()`. However, an -important difference is that `idx()` only falls back to the specified default -value if the given key does not exist, while `??` uses the fallback value even -if a key exists but has `null` value. Compare these examples to the ones above: - -```Hack -$arr = dict['black' => 10, 'white' => null]; -\print_r(vec[ - idx($arr, 'black', -100), // 10 - idx($arr, 'white', -200), // null - idx($arr, 'green', -300), // -300 - idx($arr, 'green'), // null -]); -``` - - -## Coalescing assignment operator - -A coalescing -[assignment](https://docs.hhvm.com/hack/expressions-and-operators/assignment) -operator `??=` is also available. - -The `??=` operator can be used for conditionally writing to a variable if it is -null, or to a collection if the specified key is not present or has `null` -value. - -This is similar to `e1 = e1 ?? e2`, with the important difference that `e1` is -only evaluated once. - -The `??=` operator is very useful for initializing elements of a collection: - -```Hack -function get_counts_by_value(Traversable $values): dict { - $counts_by_value = dict[]; - foreach ($values as $value) { - $counts_by_value[$value] ??= 0; - ++$counts_by_value[$value]; - } - return $counts_by_value; -} - -function get_people_by_age( - KeyedTraversable $ages_by_name, -): dict> { - $people_by_age = dict[]; - foreach ($ages_by_name as $name => $age) { - $people_by_age[$age] ??= vec[]; - $people_by_age[$age][] = $name; - } - return $people_by_age; -} - -<<__EntryPoint>> -function main(): void { - $values = vec['foo', 'bar', 'foo', 'baz', 'bar', 'foo']; - \print_r(get_counts_by_value($values)); - - $people = dict[ - 'Arthur' => 35, - 'Ford' => 110, - 'Trillian' => 35, - 'Zaphod' => 120, - ]; - \print_r( - get_people_by_age($people) - |> Dict\map($$, $names ==> Str\join($names, ', ')) - ); -} -``` diff --git a/guides/hack/03-expressions-and-operators/93-pipe.md b/guides/hack/03-expressions-and-operators/93-pipe.md deleted file mode 100644 index eed32b3a6..000000000 --- a/guides/hack/03-expressions-and-operators/93-pipe.md +++ /dev/null @@ -1,18 +0,0 @@ -The binary pipe operator, `|>`, evaluates the result of a left-hand expression and stores the result in `$$`, the pre-defined pipe variable. The right-hand expression *must* contain at least one occurrence of `$$`. - -## Basic Usage -With the pipe operator, you can chain function calls, as shown in the code below. - -``` Hack -$x = vec[2,1,3] - |> Vec\map($$, $a ==> $a * $a) // $$ with value vec[2,1,3] - |> Vec\sort($$); // $$ with value vec[4,1,9] -``` - -Written in another way, the code above is syntactically equivalent to: - -``` Hack -Vec\sort(Vec\map(vec[2, 1, 3], $a ==> $a * $a)); // Evaluates to vec[1,4,9] -``` -## Await and the Binary Pipe -`Await` cannot be used as an expression to the right of the pipe operator. diff --git a/guides/hack/03-expressions-and-operators/97-assignment.md b/guides/hack/03-expressions-and-operators/97-assignment.md deleted file mode 100644 index 337f6222a..000000000 --- a/guides/hack/03-expressions-and-operators/97-assignment.md +++ /dev/null @@ -1,55 +0,0 @@ -The assignment operator `=` assigns the value of the right-hand operand to the left-hand operand. For example: - -```Hack -$a = 10; -``` - -## Element Assignment - -We can assign to array elements, as follows: - -```Hack -$v = vec[1, 2, 3]; - -$v[0] = 42; // $v is now vec[42, 2, 3] - -$v = dict[0 => 10, 1 => 20, 2 => 30]; -$v[1] = 22; // change the value of the element with key 1 -$v[-10] = 19; // insert a new element with key -10 -``` - -For `vec`, indexes must be within the range of the -existing values. Use `$v[] = new_value;` to append new values. - -For `dict`, we can insert at arbitrary keys. - -``` Hack -$d = dict['x' => 1]; -$d['y'] = 42; // $d is now dict['x' => 1, 'y' => 42] -``` - -Strings can also be assigned like arrays. However, it is possible to -assign beyond the end of the string. The string will be extended with -spaces as necessary. - -``` Hack -$s = "ab"; -$s[0] = "x"; // in bounds -$s[3] = "y"; // $s is now "xb y" -``` - -## Compound Assignments - -Infix operators in Hack have a corresponding compound assignment -operator. For example, `+` has compound assignment operator `+=`. - -``` Hack no-extract -$x += 10; - -// Equivalent to: -$tmp = $x + 10; -$x = $tmp; -``` - -The complete set of compound-assignment operators is: `**=`, `*=`, `/=`, `%=`, `+=`, `-=`, `.=`, `<<=`, `>>=`, `&=`, `^=`, `|=`, and -[`??=`](https://docs.hhvm.com/hack/expressions-and-operators/coalesce#coalescing-assignment-operator). diff --git a/guides/hack/03-expressions-and-operators/98-yield.md b/guides/hack/03-expressions-and-operators/98-yield.md deleted file mode 100644 index 5d826b4a0..000000000 --- a/guides/hack/03-expressions-and-operators/98-yield.md +++ /dev/null @@ -1,90 +0,0 @@ -Any function containing the `yield` operator is a *generator function*. A generator function generates a collection of zero or more -key/value pairs where each pair represents the next element in some series. For example, a generator might yield random numbers or -the series of Fibonacci numbers. When a generator function is called explicitly, it returns an object of type `Generator`, which -implements the interface `Iterator`. As such, that object can be iterated over using the `foreach` statement. During each iteration, -the runtime calls the generator function implicitly to get the element. Then the runtime saves the state of the generator for subsequent -element-fetch requests. Consider the following example: - -```Hack -function series( - int $start, - int $end, - int $incr = 1, -): \Generator { - for ($i = $start; $i <= $end; $i += $incr) { - yield $i; - } -} - -<<__EntryPoint>> -function main(): void { - foreach (series(5, 15, 2) as $key => $val) { - echo "key: $key, value: $val\n"; - } - echo "-----------------\n"; - - foreach (series(25, 20, 3) as $key => $val) { - echo "key: $key, value: $val\n"; - } - echo "-----------------\n"; -} -``` - -Function `series` returns an instance of the generic type `Generator`, in which the first two type arguments are the element's key- and -value-type, respectively. (We won't discuss the third type argument here; it is `void` in all the examples below.) Note that the function -does **not** contain any `return` statement. Instead, elements are *returned* as directed by the `yield` expression. As shown, the function -yields element values, one per loop iteration. - -In `main`, we call `series` to generate the collection, and then we iterate over that collection from 5-15 in steps of 2, and simply display -the next element's key and value. However, when we use the range 25-20 in steps of 3, the resulting collection is empty, as 25 is already greater than 20. - -In its simplest form, `yield` is followed by the value of the next element with that value's key being an `int` whose value starts at zero -for each collection. This is demonstrated in the output, which has keys 0-5. - -`yield` can also specify the value of a key; for example: - -```Hack -function squares( - int $start, - int $end, - string $keyPrefix = "", -): Generator { - for ($i = $start; $i <= $end; ++$i) { - yield $keyPrefix.$i => $i * $i; // specify a key/value pair - } -} - -<<__EntryPoint>> -function main(): void { - foreach (squares(-2, 3, "X") as $key => $val) { - echo "key: $key, value: $val\n"; - } -} -``` - -By using the same syntax as that to initialize a dict element, we can provide both the key and associated value. Of course, the return -type of `squares` now uses `string` as the first generic type argument, as the element type has a key of type `string`. - -The following example uses `yield` to generate a collection of strings, each of which is a record from a text file: - -```Hack -function getTextFileLines(string $filename): Generator { - $infile = fopen($filename, 'r'); - if ($infile === false) { - // handle file-open failure - } - - try { - while (true) { - $textLine = fgets($infile); - if ($textLine === false) { - break; - } - $textLine = rtrim($textLine, "\r\n"); // strip off line terminator - yield $textLine; - } - } finally { - fclose($infile); - } -} -``` diff --git a/guides/hack/03-expressions-and-operators/99-XHP-attribute-selection.md b/guides/hack/03-expressions-and-operators/99-XHP-attribute-selection.md deleted file mode 100644 index 66987b3e0..000000000 --- a/guides/hack/03-expressions-and-operators/99-XHP-attribute-selection.md +++ /dev/null @@ -1,17 +0,0 @@ -When working with [XHP](/hack/XHP/introduction), use the `->:` operator to retrieve an XHP class [attribute](/hack/XHP/basic-usage#attributes) value. - -The operator can also be used on arbitrary expressions that resolve to an XHP object (e.g. `$a ?? $b)->:`). - -```Hack no-extract -use namespace Facebook\XHP\Core as x; - -final xhp class user_info extends x\element { - attribute int userid @required; - attribute string name = ""; - - protected async function renderAsync(): Awaitable { - return - User with id {$this->:userid} has name {$this->:name}; - } -} -``` diff --git a/guides/hack/03-expressions-and-operators/expressions-and-operators-category.txt b/guides/hack/03-expressions-and-operators/expressions-and-operators-category.txt deleted file mode 100644 index 263beb086..000000000 --- a/guides/hack/03-expressions-and-operators/expressions-and-operators-category.txt +++ /dev/null @@ -1 +0,0 @@ -Getting Started diff --git a/guides/hack/03-expressions-and-operators/expressions-and-operators-summary.txt b/guides/hack/03-expressions-and-operators/expressions-and-operators-summary.txt deleted file mode 100644 index de2b7bb6f..000000000 --- a/guides/hack/03-expressions-and-operators/expressions-and-operators-summary.txt +++ /dev/null @@ -1 +0,0 @@ -Expressions, operators, associativity, and precedence. diff --git a/guides/hack/04-statements/01-introduction.md b/guides/hack/04-statements/01-introduction.md deleted file mode 100644 index 45462b1ca..000000000 --- a/guides/hack/04-statements/01-introduction.md +++ /dev/null @@ -1,13 +0,0 @@ -**Topics covered in this section** - -* [break/continue](/hack/statements/break-and-continue) -* [do/while](/hack/statements/do) -* [for](/hack/statements/for) -* [foreach](/hack/statements/foreach) -* [if/else if/else](/hack/statements/if) -* [return](/hack/statements/return) -* [switch](/hack/statements/switch) -* [throw/try/catch/finally](/hack/statements/try) -* [use](/hack/statements/use) -* [using](/hack/statements/using) -* [while](/hack/statements/while) diff --git a/guides/hack/04-statements/02-break-and-continue.md b/guides/hack/04-statements/02-break-and-continue.md deleted file mode 100644 index c7b94841d..000000000 --- a/guides/hack/04-statements/02-break-and-continue.md +++ /dev/null @@ -1,37 +0,0 @@ -## `continue` - -A `continue` statement terminates the execution of the innermost enclosing `do`, `for`, `foreach`, or `while` statement. For example: - -```Hack -for ($i = 1; $i <= 10; ++$i) { - if (($i % 2) === 0) { - continue; - } - echo "$i is odd\n"; -} -``` - -Although a `continue` statement must not attempt to break out of a finally block, a `continue` statement can terminate a loop that is -fully contained within a finally block. - -## `break` - -A `break` statement can be used to interrupt the iteration of a loop statement and to break-out to the statement immediately following -that loop statement. For example: - -```Hack no-extract -while (true) { - // ... - if ($done) { - break; // break out of the while loop - } - // ... -} -``` - -Sometimes it is useful to have an infinite loop from which we can escape when the right condition occurs. - -Although a `break` statement must not attempt to break out of a finally block, a `break` statement can break out of a construct that is -fully contained within a finally block. - -A `break` statement can also affect a non-looping context; it terminates a case in a `switch` statement. diff --git a/guides/hack/04-statements/03-do.md b/guides/hack/04-statements/03-do.md deleted file mode 100644 index d00c8ee1e..000000000 --- a/guides/hack/04-statements/03-do.md +++ /dev/null @@ -1,25 +0,0 @@ -The general format of a `do` statement is - -`do` *statement* `while (` *expression* `);` - -The *single* statement is executed. If the expression tests `true`, the process is repeated. If the expression tests `false`, control transfers -to the point immediately following the end of the `do` statement. The loop body (that is, the single statement) is executed one or more times. -Consider the following: - -```Hack -$i = 1; -do { - echo "$i\t".($i * $i)."\n"; // output a table of squares - ++$i; -} while ($i <= 10); -``` - -The execution of a `do` statement is impacted by a subordinate -[`break` or `continue`](break-and-continue.md). - -The controlling expression must have type `bool` or a type that can be converted implicitly to `bool`. For example, in `do` ... `while (1);` -`do` ... `while (123);` and `do` ... `while (-1.234e24)`, in each case, the value of the expression is non-zero, which is implicitly converted -to `true`. Only zero-values are converted to `false`. - -The `do` statement behaves slightly differently than `while` in that the former executes the loop body *before* it tests the controlling -expression, whereas `while` executes it after. diff --git a/guides/hack/04-statements/04-for.md b/guides/hack/04-statements/04-for.md deleted file mode 100644 index 76cd54ad7..000000000 --- a/guides/hack/04-statements/04-for.md +++ /dev/null @@ -1,43 +0,0 @@ -The `for` statement is typically used to step through a range of values in ascending or descending increments, performing some set of operations -on each value. For example: - -```Hack -for ($i = 1; $i <= 5; ++$i) { - echo "$i\t".($i * $i)."\n"; // output a table of squares -} - -$i = 1; -for (; $i <= 5; ) { - echo "$i\t".($i * $i)."\n"; // output a table of squares - ++$i; -} - -$i = 1; -for (; ; ) { - if ($i > 5) - break; - echo "$i\t".($i * $i)."\n"; // output a table of squares - ++$i; -} -``` - -In the first `for` loop above, let's call `$i = 1` the *for-initializer*, `$i <= 10` the *for-control*, and `++$i` the *for-end-of-loop-action*. -Each of these three parts can contain a comma-separated list of expressions. For example: - -```Hack no-extract -for ($i = 1, $j = 10; f($i), $i <= 10; $i = $i + 2, --$j) { - // ... -} -``` - -The group of expressions in *for-initializer* is evaluated once, left-to-right, for their side-effects only. Then the group of expressions -in *for-control* is evaluated left-to-right (with all but the right-most one for their side-effects only), with the right-most expression's -value being tested. If that tests `true`, the loop body is executed, and the group of expressions in *for-end-of-loop-action* is evaluated -left-to-right, for their side-effects only. Then the process is repeated starting with *for-control*. If the right-most expression in -*for-control* tests `false`, control transfers to the point immediately following the end of the for statement. The loop body is executed zero or more times. - -The controlling expression—the right-most expression in *for-control*---must have type `bool` or be implicitly convertible to that type. - -Any or all of the three parts of the first line of a for statement can be omitted, as shown. If *for-initializer* is omitted, no action -is taken at the start of the loop processing. If *for-control* is omitted, this is treated as if *for-control* was an expression with the -value `true`. If *for-end-of-loop-action* is omitted, no action is taken at the end of each iteration. diff --git a/guides/hack/04-statements/05-foreach.md b/guides/hack/04-statements/05-foreach.md deleted file mode 100644 index 8e0b98b53..000000000 --- a/guides/hack/04-statements/05-foreach.md +++ /dev/null @@ -1,35 +0,0 @@ -The `foreach` statement iterates over the set of elements in a given collection, starting at the beginning, executing a single statement -each iteration. On each iteration, the value of the current element is assigned to the corresponding variable, as specified. The loop body -is executed zero or more times. For example: - -```Hack -$colors = vec["red", "white", "blue"]; -foreach ($colors as $color) { - // ... -} -``` - -Here, we iterate over a collection of three strings in a vec of `string`. Inside the loop body, `$color` takes on the value of the current string. - -As each array element has an index as well as a value, we can access both. For example: - -```Hack -$colors = vec["red", "white", "blue"]; -foreach ($colors as $key => $color) { - // ... -} -``` - -The `as` clause gives us access to the array key. - -We can cause each element's value to be ignored, using `$_`, as follows: - -```Hack - $a = dict['a' => 10, 'f' => 30]; - foreach ($a as $key => $_) { // 10 and 30 are ignored - // ... - } -``` - -We can also use `list()` here `foreach($vec_of_tuples as list($here, $there))` and here `foreach($vec_of_tuples as $key => list($here, $there))`. -For more information about lists, see [list](../expressions-and-operators/list.md). diff --git a/guides/hack/04-statements/06-if.md b/guides/hack/04-statements/06-if.md deleted file mode 100644 index d1b9e1e98..000000000 --- a/guides/hack/04-statements/06-if.md +++ /dev/null @@ -1,62 +0,0 @@ -An `if` statement will execute code if a condition is true. If it's false, an -`else` block can execute. - - -```Hack -$count = 11; - -if ($count < 10) { - echo "small"; -} else if ($count < 20) { - echo "medium"; -} else { - echo "large"; -} -``` - -Conditions must have type `bool` or be implicitly convertible to -`bool`. - -If the condition evaluates to to `true`, the `if` block is -executed. Otherwise, `else if` conditions are evaluated in order until -one evaluates to `true`, then its block is executed. - -If none of the conditions evaluate to `true`, and an `else` block is -present, that will be executed instead. - -## Without Braces - -Braces allow you to have multiple statements inside an `if` -statement. Braces are recommended, but they are optional. - -```Hack no-extract -if ($count < 10) - echo "small"; -else - echo "big"; -``` - -When no braces are present, an `else` clause is associated with the -lexically nearest preceding `if` or `else if`. - -```Hack no-extract -if ($x) - echo "x is true"; -if ($y) - echo "y is true"; -else // Associated with the second if. - echo "y is not true"; -``` - -The above code is equivalent to: - -```Hack no-extract -if ($x) { - echo "x is true"; -} -if ($y) { - echo "y is true"; -} else { - echo "y is not true"; -} -``` diff --git a/guides/hack/04-statements/07-return.md b/guides/hack/04-statements/07-return.md deleted file mode 100644 index af0b396b4..000000000 --- a/guides/hack/04-statements/07-return.md +++ /dev/null @@ -1,41 +0,0 @@ -A `return` statement can only occur inside a function, in which case, it causes that function to terminate normally. The function can -optionally return a single value (but one which could contain other values, as in a tuple, a shape, or an object of some user-defined -type), whose type must be compatible with the function's declared return type. If the `return` statement contains no value, or there -is no `return` statement (in which case, execution drops into the function's closing brace), no value is returned. For example: - -```Hack -function average_float(float $p1, float $p2): float { - return ($p1 + $p2) / 2.0; -} - -type IdSet = shape('id' => ?string, 'url' => ?string, 'count' => int); -function get_IdSet(): IdSet { - return shape('id' => null, 'url' => null, 'count' => 0); -} - -class Point { - private float $x; - private float $y; - public function __construct(num $x = 0, num $y = 0) { - $this->x = (float)$x; // sets private property $x - $this->y = (float)$y; // sets private property $y - } // no return statement - public function move(num $x = 0, num $y = 0): void { - $this->x = (float)$x; // sets private property $x - $this->y = (float)$y; // sets private property $y - return; // return nothing - } - // ... -} -``` - -However, for an async function having a `void` return type, an object of type `Awaitable` is returned. For an async function, -the value having a non-`void` return type, the return value is wrapped in an object of type `Awaitable` (where `T` is the type of -the return value), which is returned. - -Returning from a constructor behaves just like returning from a function having a return type of `void`. - -The value returned by a [generator function](../expressions-and-operators/yield.md) must be the literal `null`. A `return` statement -inside a generator function causes the generator to terminate. - -A return statement must not occur in a finally block or in a function declared [`noreturn`](../built-in-types/noreturn.md). diff --git a/guides/hack/04-statements/08-switch.md b/guides/hack/04-statements/08-switch.md deleted file mode 100644 index dec6a0a44..000000000 --- a/guides/hack/04-statements/08-switch.md +++ /dev/null @@ -1,103 +0,0 @@ -A `switch` statement typically consists of a controlling expression, some case labels, and optionally a default label. Based on the -value of the controlling expression, execution passes to one of the case labels, the default label, or to the statement immediately -following the switch statement. For example: - -```Hack no-extract -enum Bank: int { - DEPOSIT = 1; - WITHDRAWAL = 2; - TRANSFER = 3; -} - -function processTransaction(Transaction $t): void { - $trType = ...; // get the transaction type as an enum value - switch ($trType) { - - case Bank::TRANSFER: - // ... - break; - case Bank::DEPOSIT: - // ... - break; - case Bank::WITHDRAWAL: - // ... - break; - } -} -``` - -The `switch` has case labels for each of the possible value of `enum Bank`, where a case label is the keyword `case` followed by an -expression, followed by `:`, followed by zero or more statements. Note that the so-called body of a case label need *not* be made a -compound statement; the set of statements associated with a particular case label ends with a `break` statement or the closing brace (`}`) -of the `switch` statement. - -A default label is used as a catch-all. In the enumerated-type example above, assuming all possible values of type `enum Bank` have -corresponding case labels, no default label is needed, as no other values can exist! However, that is not true when the switch controlling -expression has type `int`. Here, we're unlikely to have case labels cover the complete range of `int` values, so a default label might be -necessary. For example: - -```Hack -$v = 100; - -switch ($v) { - case 20: - // ... - break; - case 10: - // ... - break; - case 30: - // ... - break; - default: - // ... - break; -} -``` - -A default label is the keyword `default`, followed by `:`, followed by zero or more statements. Note that the so-called body of a default -label need *not* be made a compound statement; the set of statements associated with a particular default label ends with a `break` -statement or the closing brace (`}`) of the `switch` statement. - -If a `switch` contains more than one case label whose values compare equal to the controlling expression, the first in lexical order is -considered the match. - -An arbitrary number of statements can be associated with any case or default label. In the absence of a `break` statement at the end of -a set of such statements, control drops through into any following case or default label. Thus, if all cases and the default end in `break` -and there are no duplicate-valued case labels, the order of case and default labels is insignificant. - -If no `break` statement is seen for a case or default before a subsequent case label, default label, or the switch-terminating `}` is -encountered, an implementation might issue a warning. However, such a warning can be suppressed by placing a source line containing the -special comment `// FALLTHROUGH`, at the end of that case or default statement group. - -```Hack -$v = 10; -switch ($v) { - case 10: - // ... - // FALLTHROUGH - case 30: - // ... // Handle 10 or 30 - break; - default: - // ... - break; -} -``` - -Case-label values can be runtime expressions, and the types of sibling case-label values need not be the same. - -**Note switch uses `==` equality for comparing the value with the -different cases.**. See [equality](../expressions-and-operators/equality.md) for more details. - -```Hack -$v = 30; -switch ($v) { - case 30.0: // <===== this case matches with 30 - // ... - break; - default: - // ... - break; -} -``` diff --git a/guides/hack/04-statements/09-try.md b/guides/hack/04-statements/09-try.md deleted file mode 100644 index 6c19c7865..000000000 --- a/guides/hack/04-statements/09-try.md +++ /dev/null @@ -1,105 +0,0 @@ -An *exception* is some unusual condition in that it is outside the ordinary expected behavior. (Examples include dealing with situations in -which a critical resource is needed, but is unavailable, and detecting an out-of-range value for some computation.) As such, exceptions require -special handling. - -Whenever some exceptional condition is detected at runtime, an exception is thrown using [`throw`](throw.md). A designated exception handler -can *catch* the thrown exception and service it. Among other things, the handler might recover from the situation completely (allowing the -script to continue execution), it might perform some recovery and then throw an exception to get further help, or it might perform some -cleanup action and terminate the script. Exceptions may be thrown on behalf of the runtime or by explicit code source code in the script. - -A `throw` statement throws an exception immediately and unconditionally. Control never reaches the statement immediately -following the throw. For example: - -```Hack -class MyException extends Exception {} - -function demo(): void { - throw new MyException(); -} -``` - -The type of the exception must be `Throwable` or a subclass of `Throwable`. - -Exception handling involves the use of the following keywords: -* `try`, which allows a *try-block* of code containing one or more possible exception generations, to be tried -* `catch`, which defines a handler for a specific type of exception thrown from the corresponding try-block or from some function it calls -* `finally`, which allows the *finally-block* of a try-block to be executed (to perform some cleanup, for example), whether or not an exception -occurred within that try-block -* `throw`, which generates an exception of a given type, from a place called a *throw point*. - -Consider the following: - -```Hack -function do_it(int $x, int $y): void { - try { - $result = $x / $y; - echo "\$result = " . (string)$result . "\n"; - // ... - } - catch (DivisionByZeroException $ex) { - echo "Caught a DivisionByZeroException\n"; - // ... - } - catch (Exception $ex) { - echo "Caught an Exception\n"; - // ... - } -} -``` - -Here, we put the statement that might lead to an exception inside a try-block, which has associated with it one or more catch-blocks. If and -only an exception of that type is thrown, is the catch handler code executed. - -Consider the following hierarchy of exception-class types: - -```Hack -class DeviceException extends Exception { /*...*/ } -class DiskException extends DeviceException { /*...*/ } -class RemovableDiskException extends DiskException { /*...*/ } -class FloppyDiskException extends RemovableDiskException { /*...*/ } - -function process(): void { - throw new DeviceException(); -} - -<<__EntryPoint>> -function main(): void { - try { - process(); // call a function that might generate a disk-related exception - } catch (FloppyDiskException $fde) { - echo "In handler for FloppyDiskException\n"; - // ... - } catch (RemovableDiskException $rde) { - echo "In handler for RemovableDiskException\n"; - // ... - } catch (DiskException $de) { - echo "In handler for DiskException\n"; - // ... - } catch (DeviceException $dve) { - echo "In handler for DeviceException\n"; - // ... - } finally { - echo "In finally block\n"; - // perform some cleanup - } -} -``` - -The order of the catch-blocks is important; they are in decreasing order of type specialization. The optional finally-clause is executed -**whether or not** an exception is caught. - -In a catch-clause, the variable-name (such as `$fde` and `$rde` above) designates an exception variable passed in by value. This variable -corresponds to a local variable with a scope that extends over the catch-block. During execution of the catch-block, the exception variable -represents the exception currently being handled. - -Once an exception is thrown, the runtime searches for the nearest catch-block that can handle the exception. The process begins at the current -function level with a search for a try-block that lexically encloses the throw point. All catch-blocks associated with that try-block are -considered in lexical order. If no catch-block is found that can handle the run-time type of the exception, the function that called the -current function is searched for a lexically enclosing try-block that encloses the call to the current function. This process continues -until a catch-block is found that can handle the current exception. - -If a matching catch-block is located, the runtime prepares to transfer control to the first statement of that catch-block. However, before -execution of that catch-block can start, the runtime first executes, in order, any finally-blocks associated with try-blocks nested more -deeply than the one that caught the exception. - -If no matching catch-block is found, the behavior is implementation-defined. diff --git a/guides/hack/04-statements/10-use.md b/guides/hack/04-statements/10-use.md deleted file mode 100644 index 2325c5f5a..000000000 --- a/guides/hack/04-statements/10-use.md +++ /dev/null @@ -1,106 +0,0 @@ -The `use` statement permits names defined in one namespace to be introduced into another namespace, so they can be referenced -there by their simple name rather than their (sometimes very long) fully qualified name. The `use` statement can only be -present at the top level. - -Consider the following: - -```Hack file:use.hack -namespace UseNS { - - const int CON = 100; - - function f(): void { - echo "In function ".__FUNCTION__."\n"; - } - - class C { - public function f(): void { - echo "In method ".__METHOD__."\n"; - } - } - - class D {} - class E {} -} - -namespace Hack\UserDocumentation\Statements\use\Examples\XXX { - - const int CON2 = 500; - - function f(): void { - echo "In function ".__FUNCTION__."\n"; - } -} - -namespace Hack\UserDocumentation\Statements\use\Examples\test { - - use const UseNS\CON; - use function UseNS\f; - //use function Hack\UserDocumentation\Statements\use\Examples\XXX\f; // Error: name f already declared - use type UseNS\C; - use type UseNS\{D, E}; - use namespace Hack\UserDocumentation\Statements\use\Examples\XXX; - - <<__EntryPoint>> - function main(): void { - - // access const CON by fully qualified and abbreviated names - - echo "CON = ".\UseNS\CON."\n"; - echo "CON = ".CON."\n"; - - // access function f by fully qualified and abbreviated names - - \UseNS\f(); - f(); - - // access type C by fully qualified and abbreviated names - - $c = new \UseNS\C(); - $c->f(); - $c = new C(); - $c->f(); - - // access type D by fully qualified and abbreviated names - - $d = new \UseNS\D(); - $d = new D(); - - // access name f by fully qualified and abbreviated names - - \Hack\UserDocumentation\Statements\use\Examples\XXX\f(); - XXX\f(); - - // access name CON2 by fully qualified and abbreviated names - - echo "XXX\CON2 = ". - \Hack\UserDocumentation\Statements\use\Examples\XXX\CON2. - "\n"; - echo "XXX\\CON2 = ".XXX\CON2."\n"; - } -} -``` - -Namespace `UseNS` contains a definition for a constant `CON`. From within namespace `Hack\UserDocumentation\Statements\use\Examples\test`, we -can access that constant by its fully qualified name, `\UseNS\CON`, as shown in `main`. However, if we write `use const UseNS\CON;`, we can -access that constant's name simply as `CON`. - -In the same manner, we can have `use type` and `use function` introduce type and function names, respectively. And as we can see -with `use type UseNS\{D, E};`, we can introduce a comma-separated list of names of the same kind in a single statement. - -Note that we have two functions called `f`, defined in separate namespaces. If we attempt to introduce the same name from more than -one namespace, references to that name would be ambiguous, so this is disallowed. - -In the case of `use namespace`, we can implicitly reference names inside the given namespace by using a prefix that is the right-most -part of the fully qualified name. For example, once - -```Hack file:use.hack -namespace { - use namespace Hack\UserDocumentation\Statements\use\Examples\XXX; -} -``` - -has been seen, we can access `CON2` via the abbreviated `XXX\CON2`. - -Note that names in `use` statements are always fully qualified, they don't need -to be prefixed with `\`. diff --git a/guides/hack/04-statements/11-using.md b/guides/hack/04-statements/11-using.md deleted file mode 100644 index 95cce0b88..000000000 --- a/guides/hack/04-statements/11-using.md +++ /dev/null @@ -1,44 +0,0 @@ -A `using` statement is used to enforce [object disposal](../classes/object-disposal.md). It has two forms: block and non-block. Here is an -example of the block form: - -```Hack no-extract - using ($f1 = new TextFile("file1.txt", "rw")) { - // ... work with the file - } // __dispose is called here -``` - -The type of the expression inside the parentheses must implement either `IDisposable` (or `IAsyncDisposable`). The scope of `$f1` is -the `using` block, and at the end of that scope, `__dispose` (or `__disposeAsync`) is called. If the assignment (as in, `$f1 = `) is -omitted, we cannot access the object directly inside the block. - -Within the block, there are limits to what we can do with `$f1`. Specifically, we *cannot* assign to it again or make copies of it. And to -pass it to a function, we must mark the function's corresponding parameter with the -[attribute __AcceptDisposable](../attributes/predefined-attributes.md#__AcceptDisposable). We can also call methods on the object -that `$f1` designates. Consider the following: - -```Hack no-extract - using ($f1 = new TextFile("file1.txt", "rw")) { -// echo "\$f1 is >" . $f1 . "<\n"; // usage not permitted - echo "\$f1 is >" . $f1->__toString() . "<\n"; - // ... - } -``` - -Note the commented-out trace statement at the start of the block. Under the hood, we're trying to pass a copy of a TextFile to `echo`, but -`echo` doesn't know anything about TextFile's object cleanup, so that is rejected. We can, however, directly call a method on that object, -which is why `__toString` is called explicitly in the statement following. - -Here is an example of the non-block form: - -```Hack no-extract -function foo(): void { - using $f4 = TextFile::open_TextFile("file4.txt", "rw"); - using $f5 = new TextFile("file5.txt", "rw"); - // ... work with both files -} // __dispose is called here for both $f4 and $f5 -``` - -The difference here is that no parentheses are required around the controlling expression, we use a trailing semicolon instead of a block, -and the scope of the assigned-to variables ends at the end of the parent block, which avoids the need to use nested `using` statements. - -See [object disposal](../classes/object-disposal) for a detailed example of the use of both forms. diff --git a/guides/hack/04-statements/12-while.md b/guides/hack/04-statements/12-while.md deleted file mode 100644 index a3d800f3f..000000000 --- a/guides/hack/04-statements/12-while.md +++ /dev/null @@ -1,33 +0,0 @@ -The general format of a `while` statement is - -`while (` *expression* ` )` *statement* - -If the expression tests `true`, the *single* statement that follows is executed, and the process is repeated. If the expression tests `false`, -control transfers to the point immediately following the end of the `while` statement. The loop body (that is, the single statement) is executed -zero or more times. Consider the following: - -```Hack -$i = 1; -while ($i <= 10) { - echo "$i\t".($i * $i)."\n"; // output a table of squares - ++$i; -} -``` - -The execution of a `while` statement is impacted by a subordinate -[`break` or `continue`](break-and-continue.md). - -The controlling expression is often a combination of relational, equality, and logical expressions. For example: - -```Hack no-extract -while (($i <= 10 && $j !== 0) || !getStatus()) { - // ... -} -``` - -The controlling expression must have type `bool` or a type that can be implicitly converted to `bool`. For example, in `while (1)` ..., -`while (123)` ..., and `while (-1.234e24)` ..., in each case, the value of the expression is non-zero, which is implicitly converted to `true`. Only -zero-values are converted to `false`. - -The `do`/`while` statement behaves slightly differently than `while` in that the former executes the loop body *before* it tests the -controlling expression, whereas `while` executes it after. diff --git a/guides/hack/04-statements/statements-category.txt b/guides/hack/04-statements/statements-category.txt deleted file mode 100644 index 74de90a5c..000000000 --- a/guides/hack/04-statements/statements-category.txt +++ /dev/null @@ -1 +0,0 @@ -Control Flow diff --git a/guides/hack/04-statements/statements-summary.txt b/guides/hack/04-statements/statements-summary.txt deleted file mode 100644 index 1b6ab879a..000000000 --- a/guides/hack/04-statements/statements-summary.txt +++ /dev/null @@ -1 +0,0 @@ -Simple statements, blocks, and loops. diff --git a/guides/hack/05-functions/01-introduction.md b/guides/hack/05-functions/01-introduction.md deleted file mode 100644 index 3ebbb82b0..000000000 --- a/guides/hack/05-functions/01-introduction.md +++ /dev/null @@ -1,97 +0,0 @@ -The `function` keyword defines a global function. - -```Hack -function add_one(int $x): int { - return $x + 1; -} -``` - -The `function` keyword can also be used to define [methods](/hack/classes/methods). - -## Default Parameters - -Hack supports default values for parameters. - -```Hack -function add_value(int $x, int $y = 1): int { - return $x + $y; -} -``` - -This function can take one or two arguments. `add_value(3)` returns 4. - -Required parameters must come before optional parameters, so the -following code is invalid: - -```Hack error -function add_value_bad(int $x = 1, int $y): int { - return $x + $y; -} -``` - -## Variadic Functions - -You can use `...` to define a function that takes a variable number of -arguments. - -```Hack file:sumints.hack -function sum_ints(int $val, int ...$vals): int { - $result = $val; - - foreach ($vals as $v) { - $result += $v; - } - return $result; -} -``` - -This function requires at least one argument, but has no maximum -number of arguments. - -```Hack file:sumints.hack -// Passing positional arguments. -sum_ints(1, 2, 3); - -// You can also pass a collection into a variadic parameter. -$args = vec[1, 2, 3]; -sum_ints(0, ...$args); -``` - -## Function Types - -Functions are values in Hack, so they can be passed as arguments too. - -```Hack -function apply_func(int $v, (function(int): int) $f): int { - return $f($v); -} - -function usage_example(): void { - $x = apply_func(0, $x ==> $x + 1); -} -``` - -Variadic functions can also be passed as arguments. - -```Hack -function takes_variadic_fun((function(int...): void) $f): void { - $f(1, 2, 3); - - $args = vec[1, 2, 3]; - $f(0, ...$args); -} -``` - -Finally, functions taking optional parameters can be passed as arguments. - -```Hack -function with_default(int $x, int $y = 0):void { -} -function takes_unary_or_binary_fun((function(int,optional int):void) $f):void { - $f(1); - $f(1,2); -} -function demo():void { - takes_unary_or_binary_fun(with_default<>); -} -``` diff --git a/guides/hack/05-functions/02-anonymous-functions.md b/guides/hack/05-functions/02-anonymous-functions.md deleted file mode 100644 index 426f9d5ec..000000000 --- a/guides/hack/05-functions/02-anonymous-functions.md +++ /dev/null @@ -1,93 +0,0 @@ -Hack supports anonymous functions. - -In the example below, the anonymous function, `$f`, evaluates to a function that -returns the value of `$x + 1`. - -``` Hack -$f = $x ==> $x + 1; - -$two = $f(1); // result of 2 -``` - -To create an anonymous function with more than one parameter, surround the parameter -list with parentheses: - -``` Hack -$f = ($x, $y) ==> $x + $y; - -$three = $f(1, 2); // result of 3 -``` - -Anonymous functions pass _by value_, not by reference. This is also true for any -[object property](../expressions-and-operators/member-selection) passed to an -anonymous function. - -``` Hack -$x = 5; -$f = $x ==> $x + 1; - -$six = $f($x); // pass by value - -echo($six); // result of 6 -echo("\n"); -echo($x); // $x is unchanged; result of 5 -``` - -If you need to mutate the reference, use the HSL `Ref` class. - -## Type Inference - -Unlike named functions, type annotations are optional on anonymous functions. -You can still add explicit types if you wish. - -``` Hack -$f = (int $x): int ==> $x + 1; -``` - -HHVM will enforce type annotations if they are provided. - -If typechecking cannot infer a type for a function, it will show an -error, and you will need to provide a type. Adding explicit type -annotations can also help the typechecker run faster. - -## Fat Arrow Syntax - -`==>` defines an anonymous function in Hack. An anonymous function can -be a single expression, or a block. - -``` Hack -$f1 = $x ==> $x + 1; - -$f2 = $x ==> { return $x + 1; }; -``` - -## Legacy PHP-Style Syntax - -Hack also supports an anonymous function syntax similar to PHP. These -are less flexible, so we recommend using fat arrow syntax. - -``` Hack -$f = function($x) { return $x + 1; }; -``` - -PHP-style lambdas require an explicit `{ ... }` block. - -PHP-style lambdas also require `use` to refer to enclosing variables. Fat -arrow lambdas do not require this. - -``` Hack -$y = 1; - -$f = function($x) use($y) { return $x + $y; }; -``` - -PHP-style lambdas can also specify parameter and return types. - -``` Hack -$y = 1; - -$f = function(int $x): int use($y) { return $x + $y; }; -``` - -Note that this syntax is not the same as PHP 7 lambdas, which put -`use` before the return type. diff --git a/guides/hack/05-functions/03-type-enforcement.md b/guides/hack/05-functions/03-type-enforcement.md deleted file mode 100644 index 4104b7666..000000000 --- a/guides/hack/05-functions/03-type-enforcement.md +++ /dev/null @@ -1,18 +0,0 @@ -HHVM does a runtime type check for function arguments and return -values. - -```Hack error -function takes_int(int $_): void {} - -function check_parameter(): void { - takes_int("not an int"); // runtime error. -} - -function check_return_value(): int { - return "not an int"; // runtime error. -} -``` - -If a type is wrong, HHVM will raise a fatal error. This is controlled -with the HHVM option `CheckReturnTypeHints`. Setting it to 0 or 1 will -disable this. diff --git a/guides/hack/05-functions/05-format-strings.md b/guides/hack/05-functions/05-format-strings.md deleted file mode 100644 index c4ccace6f..000000000 --- a/guides/hack/05-functions/05-format-strings.md +++ /dev/null @@ -1,57 +0,0 @@ -The Hack typechecker checks that format strings are being used correctly. - -## Quickstart - -```Hack error -// Correct. -Str\format("First: %d, second: %s", 1, "foo"); - -// Typechecker error: Too few arguments for format string. -Str\format("First: %d, second: %s", 1); -``` - -This requires that the format string argument is a string literal, not a variable. - -```Hack error -$string = "Number is: %d"; - -// Typechecker error: Only string literals are allowed here. -Str\format($string, 1); -``` - -## Defining Functions with Format Strings -You can define your own functions with format string arguments too. - -```Hack -function takes_format_string( - \HH\FormatString<\PlainSprintf> $format, - mixed ...$args -): void {} - -function use_it(): void { - takes_format_string("First: %d, second: %s", 1, "foo"); -} -``` - -`HH\FormatString` will check that you've used the right -number of arguments. `HH\FormatString` will also -check that arguments match the type in the format string. - -## Format Specifiers -See `PlainSprintf` for in-depth information on all format specifiers. - -| Specifier | Expected Input | Expected Output | -|-----------|----------------|---------------------------------------------------------------------------------------------------------------------| -| b | int | Binary (`63` => `111111`) | -| c | int | ASCII character (`63` => `?`) | -| d | int | Signed int (`-1` => `-1`) | -| u | int | Unsigned int (`-1` => `18446744073709551615`) | -| e | float | Scientific Notation, as lowercase (`0.34` => `3.4e`) | -| E | float | Scientific Notation, as uppercase (`0.34` => `3.4E`) | -| f | float | Locale Floating Point Number | -| F | float | Non-Locale Floating Point Number | -| g | float | Locale Floating Point Number or Scientific Notation (`3.141592653` => `3.14159`, `3141592653` => `3.1415e+9`). | -| o | int | Octal (`63` => `77`) | -| s | string | string | -| x | int | Hexadecimal, as lowercase (`63` => `3f`) | -| X | int | Hexadecimal, as uppercase (`63` => `3F`) | diff --git a/guides/hack/05-functions/20-inout-parameters.md b/guides/hack/05-functions/20-inout-parameters.md deleted file mode 100644 index f082dd07d..000000000 --- a/guides/hack/05-functions/20-inout-parameters.md +++ /dev/null @@ -1,72 +0,0 @@ -Hack functions normally pass arguments by value. `inout` provides -"copy-in, copy-out" arguments, which allow you to modify the variable -in the caller. - -```Hack -function takes_inout(inout int $x): void { - $x = 1; -} - -function call_it(): void { - $num = 0; - takes_inout(inout $num); - - // $num is now 1. -} -``` - -This is similar to copy-by-reference, but the copy-out only happens -when the function returns. If the function throws an exception, no -changes occur. - -```Hack -function takes_inout(inout int $x): void { - $x = 1; - throw new Exception(); -} - -<<__EntryPoint>> -function call_it(): void { - $num = 0; - try { - takes_inout(inout $num); - } catch (Exception $_) { - } - - // $num is still 0. -} -``` - -`inout` must be written in both the function signature and the -function call. This is enforced in the typechecker and at runtime. - -## Indexing with `inout` - -In addition to local variables, `inout` supports indexes in value -types. - -```Hack -function set_to_value(inout int $item, int $value): void { - $item = $value; -} - -function use_it(): void { - $items = vec[10, 11, 12]; - $index = 1; - set_to_value(inout $items[$index], 42); - - // $items is now vec[10, 42, 12]. -} -``` - -This works for any value type: `vec`, `dict`, `keyset` or `array`. You -can also do nested access e.g. `inout $foo[$y][z()]['stuff']`. - -## Dynamic Usage - -`inout` is a different calling convention, so dynamic calls will not -work with `inout` parameters. For example, you cannot use -`meth_caller`, `call_user_func` or `ReflectionFunction::invoke`. - -`unset` on a `inout` parameter will set the value to `null`. This is -not recommended, and will raise a warning when the function returns. diff --git a/guides/hack/05-functions/30-function-references.md b/guides/hack/05-functions/30-function-references.md deleted file mode 100644 index 9bff3d78e..000000000 --- a/guides/hack/05-functions/30-function-references.md +++ /dev/null @@ -1,187 +0,0 @@ -It is often useful to refer to a function -(or a [method](https://docs.hhvm.com/hack/classes/methods)) -without actually calling it—for example, -as an argument for functions like `Vec\map`. - -**Note:** The following syntax is only supported since HHVM 4.79. For older HHVM -versions, see [old syntax](#old-syntax) below. - -To refer to a top-level (global) function named `foo`, you can write: - -```Hack no-extract -foo<>; // a reference to global function 'foo' -``` - -You can think of it like it’s a function call with empty generics, but the list -of arguments has been omitted (the missing parentheses). - -The following example stores a function reference in a variable and later calls -the function. Note that the type checker keeps track of the -[function's type](/hack/built-in-types/function) -and correctly checks all calls. - -```Hack no-extract -function foo(string $x): bool { ... } - -$x = foo<>; // $x:(function(string): bool) -$y = $x('bar'); // $y:bool -$_ = $x(-1); // error! -``` - -This syntax supports namespaced names the same way you would refer to them as -part of a function call, so the following function references are all -equivalent: - -```Hack no-extract -$fun = \Foo\Bar\Baz\derp<>; -``` - -```Hack no-extract -namespace Foo; -$fun = Bar\Baz\derp<>; -``` - -```Hack no-extract -use namespace Foo\Bar\Baz; -$fun = Baz\derp<>; -``` - -```Hack no-extract -use function Foo\Bar\Baz\derp; -$fun = derp<>; -``` - -## Static methods - -Similarly, you can refer to a static method `bar` on a class `MyClass` by using -the familiar method call syntax, without providing the call arguments. Just -append type arguments (like `<>`) to the function call receiver -(like `MyClass::bar`). - -```Hack no-extract -MyClass::bar<>; // a reference to static method 'MyClass::bar' -``` - -- **Private/protected** methods can be referenced using this syntax as long as - they are accessible to you in your local scope (the scope where the reference - is created). The returned reference can then be called from any scope. -- **Abstract** static methods cannot be referenced. Such methods cannot be - called, for they have no implementation. Invoking a hypothetical reference to - one would also be an error, so we simply don’t allow a reference to be - created. -- In traits and other classes that are not marked `final`, you cannot use - `self::` in a reference. This is to avoid ambiguity and confusion around what - `self` actually refers to when the method is called (it depends on the static - context of a call, whereas function references can never receive the context - information because the target is only resolved once). -- Also, `parent::` is never supported. - -## Generics - -If you wish to pass along explicit generic arguments, either as a hint to the -type checker, or in the case of a function with reified type parameters when -they are required, that is also supported: - -```Hack no-extract -i_am_erased; // erased generics (note wildcard) -i_am_reified>; // a reified generic -``` - -- Keep in mind that generics, if any, still must be provided at the location - where the function reference is created, rather than where it is used/invoked. -- The arity of the type argument list, if it is non-empty (i.e. not `<>`), must - match the declaration, just like for an ordinary function call. -- The special wildcard specifier `_` may be provided in place of any or all - erased (non-reified) generic arguments if you want Hack to infer a type - automatically based on the type parameter’s constraints. Again this is the - same as for ordinary function calls. - -Example with erased generics: - -```Hack no-extract -function fizz(Ta $a, Tb $b): mixed { ... } - -$x = fizz; // OK -$x(4, 'hello'); -$x(-1, false); // error! - -$y = fizz<>; -$y(3.14, new C()); // also OK -$y('yo', derp()); // error! - -// OK as well -$z = fizz; -$z = fizz<_, string>; -$z = fizz<_, _>; - -// these all have errors! -fizz<_>; -fizz; -fizz; -``` - -Example with [reified generics](/hack/generics/reified-generics): - -```Hack no-extract -function buzz(T $x): mixed { ... } - -$w = buzz; // OK -$w(42); -$w("goodbye"); // error! - -// these all have errors! -buzz<>; -buzz<_>; -buzz; -``` - -## Introspection - -Function references can be cached in APC (the name will be resolved again when -they are retrieved) or passed to memoized functions. However, other -serialization formats are not supported. - -Internally, function/method references are represented using special data types -that are intended to be opaque. This means they cannot (or should not) be cast -directly to a string or another type, or be accessed in any other way besides -calling them. - -If you need to determine what a function reference is pointing to, e.g. for -use in logging messages, and you know enough about the expected input and -output formats, HHVM provides the following helpers (but note they are not -well supported and may change): - -* `HH\is_fun` -* `HH\fun_get_function` -* `HH\is_class_meth` -* `HH\class_meth_get_class` -* `HH\class_meth_get_method` - -Be very careful and deliberate when using these, as they are loosely typed but -will throw exceptions for bad arguments. - -In Meta's WWW repository, prefer using higher -level wrappers such as the `HackCallable` class, or `ReflectionFunctionProdUtils` outside -of intern code. - -## Old syntax - -Before HHVM 4.79, there was no special syntax for function references. However, -the built-in functions `fun` and `class_meth` can be used for the same purpose. -For HHVM versions that support both options, the returned function references -are identical, e.g. `foo<>` is equivalent to `fun('foo')`. - -There is also no equivalent syntax for referencing non-static methods. For -those, use the built-in functions `inst_meth` and `meth_caller`, or use an -[anonymous function](anonymous-functions) instead: - -```Hack no-extract -class C { - public function foo(): void {} -} - -$obj = new C(); -$fun1 = inst_meth($obj, 'foo'); -$fun2 = () ==> $obj->foo(); -// calling $fun1() is equivalent to calling $fun2() -``` diff --git a/guides/hack/05-functions/functions-category.txt b/guides/hack/05-functions/functions-category.txt deleted file mode 100644 index 1dcccc5c6..000000000 --- a/guides/hack/05-functions/functions-category.txt +++ /dev/null @@ -1 +0,0 @@ -Classes, Interfaces, Traits diff --git a/guides/hack/05-functions/functions-summary.txt b/guides/hack/05-functions/functions-summary.txt deleted file mode 100644 index 5c43af296..000000000 --- a/guides/hack/05-functions/functions-summary.txt +++ /dev/null @@ -1 +0,0 @@ -Named functions, anonymous functions and parameters. diff --git a/guides/hack/06-classes/01-introduction.md b/guides/hack/06-classes/01-introduction.md deleted file mode 100644 index 0bedb9458..000000000 --- a/guides/hack/06-classes/01-introduction.md +++ /dev/null @@ -1,20 +0,0 @@ -Classes provide a way to group functionality and state together. - -To define a class, use the `class` keyword. - -```Hack -class Counter { - private int $i = 0; - - public function increment(): void { - $this->i += 1; - } - - public function get(): int { - return $this->i; - } -} -``` - -To create an instance of a class, use -[`new`](../expressions-and-operators/new.md), e.g. `new Counter();`. diff --git a/guides/hack/06-classes/03-methods.md b/guides/hack/06-classes/03-methods.md deleted file mode 100644 index e3416689b..000000000 --- a/guides/hack/06-classes/03-methods.md +++ /dev/null @@ -1,39 +0,0 @@ -A method is a function defined in a class. - -```Hack file:person.hack -class Person { - public string $name = "anonymous"; - - public function greeting(): string { - return "Hi, my name is ".$this->name; - } -} -``` - -To call an instance method, use `->`. - -```Hack file:person.hack -$p = new Person(); -echo $p->greeting(); -``` - -You can access the current instance with `$this` inside a method. - -## Static Methods - -A static method is a function in a class that is called without an -instance. Since there's no instance, `$this` is not available. - -```Hack file:person2.hack -class Person { - public static function typicalGreeting(): string { - return "Hello"; - } -} -``` - -To call a static method, use `::`. - -```Hack file:person2.hack -echo Person::typicalGreeting(); -``` diff --git a/guides/hack/06-classes/05-properties.md b/guides/hack/06-classes/05-properties.md deleted file mode 100644 index b8b7c0652..000000000 --- a/guides/hack/06-classes/05-properties.md +++ /dev/null @@ -1,107 +0,0 @@ -A property is a variable defined inside a class. - -```Hack file:intbox.hack -class IntBox { - public int $value = 0; -} -``` - -Instance properties are accessed with `->`. Every instance has a -separate value for an instance property. - -```Hack file:intbox.hack -$b = new IntBox(); -$b->value = 42; -``` - -Note that there is no `$` used when accessing `->value`. - -## Initializing Properties - -Properties in Hack must be initialized. You can provide a default -value, or assign to them in the constructor. - -```Hack -class HasDefaultValue { - public int $i = 0; -} - -class SetInConstructor { - public int $i; - public function __construct() { - $this->i = 0; - } -} -``` - -Properties with nullable types do not require initial values. They -default to `null` if not set. - -```Hack -class MyExample { - public mixed $m; - public ?string $s; -} -``` - -## Static Properties - -A static property is a property that is shared between all instances -of a class. - -```Hack file:example.hack -class Example { - public static int $val = 0; -} -``` - -Static properties are accessed with `::`. - -```Hack file:example.hack -Example::$val; -``` - -If your property never changes value, you might want to use a class -constant instead. - -## The Property Namespace - -Properties and methods are in different namespaces. It's possible to -have a method and a property with the same name. - -```Hack file:intbox_prop.hack -class IntBox { - public int $value = 0; - - public function value(): int { - return $this->value; - } -} -``` - -(Reusing a name like this is usually confusing. We recommend you use -separate names.) - -If there are parentheses, Hack knows it's a method call. - -```Hack file:intbox_prop.hack -$b = new IntBox(); -$b->value(); // method call -$b->value; // property access -``` - -If you have a callable value in a property, you will need to be -explicit that you're accessing the property. - -```Hack file:funbox.hack -class FunctionBox { - public function __construct(public (function(): void) $value) {} -} -``` - -Use parentheses to access and call the wrapped function. - -```Hack file:funbox.hack -$b = new FunctionBox(() ==> { echo "hello"; }); -($b->value)(); -``` diff --git a/guides/hack/06-classes/06-inheritance.md b/guides/hack/06-classes/06-inheritance.md deleted file mode 100644 index e597eb1ed..000000000 --- a/guides/hack/06-classes/06-inheritance.md +++ /dev/null @@ -1,196 +0,0 @@ -Hack supports single inheritance between classes. - -``` Hack -class IntBox { - public function __construct(protected int $value) {} - - public function get(): int { - return $this->value; - } -} - -class MutableIntBox extends IntBox { - public function set(int $value): void { - $this->value = $value; - } -} -``` - -Classes can access things defined in the parent class, unless they are -`private`. - -## Overriding Methods - -You can override methods in subclasses by defining a method with -the same name. - -``` Hack -class IntBox { - public function __construct(protected int $value) {} - - public function get(): int { - return $this->value; - } -} - -class IncrementedIntBox extends IntBox { - <<__Override>> - public function get(): int { - return $this->value + 1; - } -} -``` - -If a method is intended to override a method in a parent class, you -should annotate it with `<<__Override>>`. This has no runtime effect, but -ensures you get a type error if the parent method is removed. - -Hack does not support method overloading. Subclasses methods must have -a return type, parameters and visibility that is compatible with the -parent class. - -``` Hack -class NumBox { - public function __construct(protected num $value) {} - - protected function get(): num { - return $this->value; - } -} - -class FloatBox extends NumBox { - <<__Override>> - public function get(): float { - return (float)$this->value; - } -} -``` - -The only exception is constructors, which may have incompatible -signatures with the parent class. You can use `<<__ConsistentConstruct>>` -to require subclasses to have compatible types. - -``` Hack -class User { - // This constructor takes one argument. - public function __construct(protected string $name) {} -} - -class Player extends User { - // But this constructor takes two arguments. - <<__Override>> - public function __construct(protected int $score, string $name) { - parent::__construct($name); - } -} -``` - -## Calling Overridden Methods - -You can use `parent::` to call an overridden method in the parent -class. - -``` Hack -class IntBox { - public function __construct(protected int $value) {} - - public function get(): int { - return $this->value; - } -} - -class IncrementedIntBox extends IntBox { - <<__Override>> - public function get(): int { - return parent::get() + 1; - } -} -``` - -This also works for static methods. - -``` Hack -class MyParent { - public static function foo(): int { - return 0; - } -} - -class MyChild extends MyParent { - <<__Override>> - public static function foo(): int { - return parent::foo() + 1; - } -} -``` - -## Abstract Classes - -An abstract class cannot be instantiated. - -``` Hack -abstract class Animal { - public abstract function greet(): string; -} - -class Dog extends Animal { - <<__Override>> - public function greet(): string { - return "woof!"; - } -} -``` - -This allows `new Dog()` but not `new Animal()`. - -Abstract classes are similar to -[interfaces](implementing-an-interface.md), but they can include -implementations of methods. - -## Final Classes - -A final class cannot have subclasses. - -``` Hack -final class Dog { - public function greet(): string { - return "woof!"; - } -} -``` - -If your class has subclasses, but you want to prevent additional -subclasses, use `<<__Sealed>>`. - -If you want to inherit from a final class for testing, use -`<<__MockClass>>`. - -You can also combine `final` and `abstract` on classes. This produces -a class that cannot be instantiated or have subclasses. The class is -effectively a namespace of grouped functionality. - -``` Hack -abstract final class Example { - public static function callMe(int $i): int { - return static::helper($i); - } - - private static function helper(int $i): int { - return $i + 1; - } -} -``` - -## Final Methods - -A `final` method cannot be overridden in subclasses. - -``` Hack -class IntBox { - public function __construct(protected int $value) {} - - final public function get(): int { - return $this->value; - } -} -``` diff --git a/guides/hack/06-classes/16-constructors.md b/guides/hack/06-classes/16-constructors.md deleted file mode 100644 index 59bd38d6b..000000000 --- a/guides/hack/06-classes/16-constructors.md +++ /dev/null @@ -1,121 +0,0 @@ -A constructor is a specially named instance method that is used to initialize the instance immediately after it has been created. A -constructor is called by the [`new` operator](../expressions-and-operators/new.md). For example: - -```Hack -class Point { - private static int $pointCount = 0; // static property with initializer - private float $x; // instance property - private float $y; // instance property - - public function __construct(num $x = 0, num $y = 0) { // instance method - $this->x = (float)$x; // access instance property - $this->y = (float)$y; // access instance property - ++Point::$pointCount; // include new Point in Point count - } -} - -function demo(): void { - $p1 = new Point(2.3); -} -``` - -A constructor has the name `__construct`. As such, a class can have only one constructor. (Hack does *not* support method overloading.) - -When `new Point` causes the constructor to be called, the argument 2.3 maps to the parameter `$x`, and the default value 0 is mapped to -the parameter `$y`. The constructor body is then executed, which results in the instance properties being initialized and the Point count -being incremented. Note that a constructor may call any *private* method in its class, but no public methods. - -A constructor does not require a return type, but if one is included, it must be `void`. - -## Constructor parameter promotion - -If you have created a class in Hack, you have probably seen a pattern like this: - -```Hack -final class User { - private int $id; - private string $name; - - public function __construct( - int $id, - string $name, - ) { - $this->id = $id; - $this->name = $name; - } -} -``` - -The class properties are essentially repeated multiple times: at declaration, in -the constructor parameters and in the assignment. This can be quite cumbersome. - -With *constructor parameter promotion*, all that repetitive boilerplate is -removed. - -```Hack -final class User { - public function __construct( - private int $id, - private string $name, - ) {} -} -``` - -All you do is put a visibility modifier in front of the constructor parameter -and everything else in the previous example is done automatically, including the -actual creation of the property. - -**Note:** Promotion can only be used for constructor parameters with name and -type that exactly match the respective class property. For example, we couldn't -use it in the `Point` class above because we wanted the properties to have type -`float`, so any arithmetic coordinate value can be represented, yet we wanted -the constructor parameters to have type `num`, so either integer or -floating-point values can be passed in. - -Don't hesitate to “un-promote” a constructor parameter if it later -turns out that a different internal data representation would be better. For -example, if we later decided to store `$name` in a structured form instead of a string, we could easily make that change while keeping the public-facing -constructor parameters unchanged (and therefore backwards-compatible). - -```Hack no-extract -final class User { - private ParsedName $name; - - public function __construct( - private int $id, - string $name, - ) { - $this->name = parse_name($name); - } -} -``` - -### Rules - -* A modifier of `private`, `protected` or `public` must precede the parameter - declaration in the constructor. -* Other, non-class-property parameters may also exist in the constructor, as - normal. -* Type annotations must go between the modifier and the parameter's name. -* The parameters can have a default value. -* Other code in the constructor is run **after** the parameter promotion - assignment. - -```Hack -final class User { - private static dict $allUsers = dict[]; - private int $age; - - public function __construct( - private int $id, - private string $name, - // Promoted parameters can be combined with regular non-promoted parameters. - int $birthday_year, - ) { - $this->age = \date('Y') - $birthday_year; - // The constructor parameter promotion assignments are done before the code - // inside the constructor is run, so we can use $this->id here. - self::$allUsers[$this->id] = $this; - } -} -``` diff --git a/guides/hack/06-classes/18-constants.md b/guides/hack/06-classes/18-constants.md deleted file mode 100644 index a209564e6..000000000 --- a/guides/hack/06-classes/18-constants.md +++ /dev/null @@ -1,33 +0,0 @@ -A class can contain definitions for named constants. - -Because a class constant belongs to the class as a whole, it is implicitly `static`. For example: - -```Hack -class Automobile { - const DEFAULT_COLOR = "white"; - // ... -} - -<<__EntryPoint>> -function main(): void { - $col = Automobile::DEFAULT_COLOR; // or: $col = self::DEFAULT_COLOR; - echo "\$col = $col\n"; -} -``` - -## Visibility -Class constants are always public, and can not be explicitly declared as `public`, `protected`, or `private`. - -## Selection -Inside a parent class, use `self::foo` to access a named constant `foo`. Outside a parent class, a class constant's name must be fully qualified with the class and constant name (e.g. `Bar::foo`). For more information, see [scope-resolution operator, `::`](/hack/expressions-and-operators/scope-resolution). - -## Type Inference -If a class constant's type is omitted, it can be inferred. For example: -* the inferred type of `const DEFAULT_COLOR = "white"` is `string`, -* the inferred type of `const DEFAULT_VALUE = 42` is `int`. -* the inferred type of `const DEFAULT_FOODS = vec["apple", "orange", "banana"]` is `vec`. - -## Limitations -Constants can not be assigned to legacy container types like `Vector`, `Map`, `Set`, et al., and closures. - -Instead, create constants with equivalent types like `array`, `vec`, `dict`, and `set`. When using these types, all subinitializers must resolve to constant expressions. diff --git a/guides/hack/06-classes/19-type-constants.md b/guides/hack/06-classes/19-type-constants.md deleted file mode 100644 index babf16c1b..000000000 --- a/guides/hack/06-classes/19-type-constants.md +++ /dev/null @@ -1,22 +0,0 @@ -Type constants provide a way to abstract a type name. However, type constants only make sense in the context of interfaces -and inheritance hierarchies, so they are discussed under those topics. - -For now, the declaration of a type constant involves the keywords `const type`. Without explanation, here's an example: - -```Hack -abstract class CBase { - abstract const type T; - // ... -} - -class CString extends CBase { - const type T = string; - // ... -} -``` - -A type constant has public visibility and is implicitly static. - -By convention, type constant names begin with an uppercase `T`. - -See [inheritance](inheritance.md) and [type constants revisited](type-constants-revisited.md) for more information. diff --git a/guides/hack/06-classes/21-object-disposal.md b/guides/hack/06-classes/21-object-disposal.md deleted file mode 100644 index f0d4001db..000000000 --- a/guides/hack/06-classes/21-object-disposal.md +++ /dev/null @@ -1,154 +0,0 @@ -Modern programming languages allow resources to be allocated at runtime, under programmer control. However, in the case where -explicit action must be taken to free such resources, different languages have different approaches. Some languages use a -*destructor* for cleanup, while others use a *finalizer*, which is called by a garbage collector, sometime, maybe! Hack uses -a *dispose* approach, which is tied to object scope. - -In the following example, we define and use type `TextFile` to encapsulate a text file. When we are done with such a file, -we need to make sure that output buffers are flushed, among other things. Let us call these tasks *object cleanup*. (The -example is skeletal; it has only the minimal machinery needed to demonstrate object disposal.) - -```Hack -class TextFile implements \IDisposable { - private ?int $fileHandle = null; - private bool $openFlag = false; - private string $fileName; - private string $openMode; - - public function __construct(string $fileName, string $openMode) { - $this->fileHandle = 55; // open file somehow and store handle - $this->openFlag = true; // file is open - $this->fileName = $fileName; - $this->openMode = $openMode; - } - - public function close(): void { - if ($this->openFlag === false) { - return; - } - - // ... somehow close the file - $this->fileHandle = null; - $this->openFlag = false; - - echo "Closed file $this->fileName\n"; - } - - public function __toString(): string { - return 'fileName: '. - $this->fileName. - ', openMode: '. - $this->openMode. - ', fileHandle: '. - (($this->fileHandle === null) ? "null" : $this->fileHandle). - ', openFlag: '. - (($this->openFlag) ? "True" : "False"); - } - - public function __dispose(): void { - echo "Inside __dispose\n"; - $this->close(); - } - - <<__ReturnDisposable>> - public static function open_TextFile( - string $fileName, - string $openMode, - ): TextFile { - return new TextFile($fileName, $openMode); - } - - public function is_same_TextFile(<<__AcceptDisposable>> TextFile $t): bool { - return $this->fileHandle === $t->fileHandle; - } - - // other methods, such as read and write -} - -<<__EntryPoint>> -function main(): void { - using ($f1 = new TextFile("file1.txt", "rw")) { - // echo "\$f1 is >" . $f1 . "<\n"; // usage not permitted - echo "\$f1 is >".$f1->__toString()."<\n"; - // work with the file - $f1->close(); // close explicitly - $f1->close(); // try to close again - } // dispose called here - - using ($f2 = new TextFile("file2.txt", "rw")) { - echo "\$f2 is >".$f2->__toString()."<\n"; - // work with the file - // no explicit close - } // dispose called here - - using ($f3 = TextFile::open_TextFile("file3.txt", "rw")) { - echo "\$f3 is >".$f3->__toString()."<\n"; - // work with the file - // no explicit close - } // dispose called here - - using $f4 = TextFile::open_TextFile("file4.txt", "rw"); - echo "\$f4 is >".$f4->__toString()."<\n"; - using $f5 = new TextFile("file5.txt", "rw"); - echo "\$f5 is >".$f5->__toString()."<\n"; - // work with both files - // no explicit close -} // dispose called here for both $f4 and $f5 -``` - -A class for which we wish to provide cleanup *must* implement the interface `IDisposable`, which requires that class to -define a public method called `__dispose`, with the signature as shown. - -As expected, the constructor initializes the new object's state. (Note that because the physical-file open details have been -omitted, each instance gets the hard-coded handle value of 55 rather than a unique value.) - -Method `close` provides a way to do cleanup under programmer control, **presuming the programmer remembers to do that!** However, -we provide a mechanism via the `openFlag` property to be sure we're not trying to cleanup more than once. - -Let's look at the `using` block at the start of function `main`. The expression controlling that construct *must* have a type -that implements the interface `IDisposable`, and the scope of the local variable `$f1` is the using block. Note the commented-out -trace statement at the start of the block. Under the hood, we're trying to pass a copy of a TextFile to `echo`, but `echo` -doesn't know anything about TextFile's object cleanup, so that is rejected. We can, however, call a method on that object, -which is why `__toString` is called explicitly in the statement following. (Later, we'll show how to allow copying of objects -needing cleanup.) - -When we are done with the file, we call `close`, which performs the necessary cleanup. Then if/when we call `close` again, no -new work is done. Finally, at the end of the `using` block, `$f1` goes out of scope and the runtime calls `$f1->__dispose`, -which, in our case, simply calls `close`. - -The second `using` block is much like the first except it doesn't call `close`. Of course, the implicit call to `__dispose` -does that, and the cleanup is performed then. - -Rather than calling the constructor to create a new instance, the third `using` block calls what is known as a *factory method*, -`open_TextFile`. The challenge here is that method is returning an object with associated resources, and the consumer of that -object must be ready to handle that object's cleanup or pass it on to someone who can. To allow such a method call, we must -declare that it is okay to return an object subject to cleanup; we do with by marking the method with the attribute -`<<__ReturnDisposable>>`, as shown. - -Note that once we've marked a class as implementing `IDisposable`, we can *only* instantiate that class in a `using` -clause's controlling expression or in an appropriately annotated factory method. - -Thus far, we've processed one file at a time, but what if we wish to work with multiple text files at the same time? The -fourth and fifth `using` clauses involving `$f4` and `$f5` show how. Instead of having an associated block to limit the scope, -these statements end in a semicolon. As such, their local variables go out of scope at the end of their parent block, in this -case, at the end of `main`, at which time, `__dispose` is called for each of them. Note carefully though, that the order in which -these two calls are made is unspecified. - -Earlier, we discussed the problem of making copies of objects needing cleanup. Consider the method `is_same_TextFile`, which is -called on one TextFile and is explicitly passed a second TextFile. By marking the parameter with the attribute `<<__AcceptDisposable>>`, -we promise that we've taken care of cleanup elsewhere. That is, when the copy goes out of scope, `__dispose` must **not** be called. - -If classes in a class hierarchy need cleanup, it is the responsibility of the dispose method at each level to call the dispose -in its base class explicitly. - -For objects of a class type to be used in an asynchronous context, that type must implement interface `IAsyncDisposable` instead, -which requires a public method called `__disposeAsync`, like this: - -```Hack -class Example implements IAsyncDisposable { - public async function __disposeAsync(): Awaitable { - // Cleanup here. - } -} -``` - -Now, related `using` clauses *must* be preceded by `await`. diff --git a/guides/hack/06-classes/31-type-constants-revisited.md b/guides/hack/06-classes/31-type-constants-revisited.md deleted file mode 100644 index 5e5af8c52..000000000 --- a/guides/hack/06-classes/31-type-constants-revisited.md +++ /dev/null @@ -1,203 +0,0 @@ -Imagine that you have a class, and some various `extends` to that class. - -```Hack -abstract class User { - public function __construct(private int $id) {} - public function getID(): int { - return $this->id; - } -} - -trait UserTrait { - require extends User; -} - -interface IUser { - require extends User; -} - -class AppUser extends User implements IUser { - use UserTrait; -} - -<<__EntryPoint>> -function run(): void { - $au = new AppUser(-1); - \var_dump($au->getID()); -} -``` - -Now imagine that you realize that sometimes the ID of a user could be a `string` as well as an `int`. But you know that the concrete classes -of `User` will know exactly what type will be returned. - -While this situation could be handled by using generics, an alternate approach is to use type constants. Instead of types being declared -as parameters directly on the class itself, type constants allow the type to be declared as class member constants instead. - -```Hack -abstract class User { - abstract const type T as arraykey; - public function __construct(private this::T $id) {} - public function getID(): this::T { - return $this->id; - } -} - -trait UserTrait { - require extends User; -} - -interface IUser { - require extends User; -} - -// We know that AppUser will only have int ids -class AppUser extends User implements IUser { - const type T = int; - use UserTrait; -} - -class WebUser extends User implements IUser { - const type T = string; - use UserTrait; -} - -class OtherUser extends User implements IUser { - const type T = arraykey; - use UserTrait; -} - -<<__EntryPoint>> -function run(): void { - $au = new AppUser(-1); - \var_dump($au->getID()); - $wu = new WebUser('-1'); - \var_dump($wu->getID()); - $ou1 = new OtherUser(-1); - \var_dump($ou1->getID()); - $ou2 = new OtherUser('-1'); - \var_dump($ou2->getID()); -} -``` - -Notice the syntax `abstract const type [ as ];`. All type constants are `const` and use the keyword `type`. You -specify a name for the constant, along with any possible [constraints](/hack/generics/type-constraints) that -must be adhered to. - -## Using Type Constants - -Given that the type constant is a first-class constant of the class, you can reference it using `this`. As -a type annotation, you annotate a type constant like: - -``` -this:: -``` - -e.g., - -``` -this::T -``` - -You can think of `this::` in a similar manner as the [`this` return type](../built-in-types/this.md). - -This example shows the real benefit of type constants. The property is defined in `Base`, but can have different types depending -on the context of where it is being used. - -```Hack -abstract class Base { - abstract const type T; - protected this::T $value; -} - -class Stringy extends Base { - const type T = string; - public function __construct() { - // inherits $value in Base which is now setting T as a string - $this->value = "Hi"; - } - public function getString(): string { - return $this->value; // property of type string - } -} - -class Inty extends Base { - const type T = int; - public function __construct() { - // inherits $value in Base which is now setting T as an int - $this->value = 4; - } - public function getInt(): int { - return $this->value; // property of type int - } -} - -<<__EntryPoint>> -function run(): void { - $s = new Stringy(); - $i = new Inty(); - \var_dump($s->getString()); - \var_dump($i->getInt()); -} -``` - -## Examples - -Here are some examples of where type constants may be useful: - -### Referencing Type Constants - -Referencing type constants is as easy as referencing a static class constant. - -```Hack -abstract class UserTC { - abstract const type Ttc as arraykey; - public function __construct(private this::Ttc $id) {} - public function getID(): this::Ttc { - return $this->id; - } -} - -class AppUserTC extends UserTC { - const type Ttc = int; -} - -function get_id_from_userTC(AppUserTC $uc): AppUserTC::Ttc { - return $uc->getID(); -} - -<<__EntryPoint>> -function run(): void { - $autc = new AppUserTC(10); - \var_dump(get_id_from_userTC($autc)); -} -``` - -### Type Constants and Instance Methods - -You can use type constants as inputs to class instance methods. - -```Hack -abstract class Box { - abstract const type T; - public function __construct(private this::T $value) {} - public function get(): this::T { - return $this->value; - } - public function set(this::T $val): this { - $this->value = $val; - return $this; - } -} - -class IntBox extends Box { - const type T = int; -} - -<<__EntryPoint>> -function run(): void { - $ibox = new IntBox(10); - \var_dump($ibox); - $ibox->set(123); - \var_dump($ibox); -} -``` diff --git a/guides/hack/06-classes/33-methods-with-predefined-semantics.md b/guides/hack/06-classes/33-methods-with-predefined-semantics.md deleted file mode 100644 index 5ceda7993..000000000 --- a/guides/hack/06-classes/33-methods-with-predefined-semantics.md +++ /dev/null @@ -1,43 +0,0 @@ -If a class contains a definition for a method having one of the following names, that method must have the prescribed visibility, -signature, and semantics: - -Method Name | Description -------------|------------- -[`__construct`](constructors.md) | A constructor -[`__dispose`](#method-__dispose) | Performs object-cleanup -[`__disposeAsync`](#method-__disposeasync) | Performs object-cleanup -[`__toString`](#method-__tostring) | Returns a string representation of the instance on which it is called - -## Method __construct - -See [Constructors](constructors.md). - -## Method __dispose - -This public instance method is required if the class implements the interface `IDisposable`; the method is intended to perform object -cleanup. The method's signature is, as follows: - -```Hack -class Example implements IDisposable { - public function __dispose(): void {} -} -``` - -This method is called implicitly by the runtime when the instance goes out of scope, provided the attributes `<<__ReturnDisposable>>` -and `<<__AcceptDisposable>>` are *not* present. - -See [object disposal](object-disposal.md) for an example of its use and a discussion of these attributes. - -## Method __disposeAsync - -This public instance method is required if the class implements the interface `IAsyncDisposable`; the method is intended to perform -object cleanup. The method's signature is as follows: - -```Hack no-extract -public async function __disposeAsync(): Awaitable; -``` - -This method is called implicitly by the runtime when the instance goes out of scope, provided the attributes `<<__ReturnDisposable>>` -and `<<__AcceptDisposable>>` are *not* present. - -See [object disposal](object-disposal.md) for a discussion of disposal and these attributes. diff --git a/guides/hack/06-classes/classes-category.txt b/guides/hack/06-classes/classes-category.txt deleted file mode 100644 index 1dcccc5c6..000000000 --- a/guides/hack/06-classes/classes-category.txt +++ /dev/null @@ -1 +0,0 @@ -Classes, Interfaces, Traits diff --git a/guides/hack/06-classes/classes-summary.txt b/guides/hack/06-classes/classes-summary.txt deleted file mode 100644 index 3ecda1199..000000000 --- a/guides/hack/06-classes/classes-summary.txt +++ /dev/null @@ -1 +0,0 @@ -Classes provide a way to group functionality and state together. diff --git a/guides/hack/07-traits-and-interfaces/01-introduction.md b/guides/hack/07-traits-and-interfaces/01-introduction.md deleted file mode 100644 index ea48b8a05..000000000 --- a/guides/hack/07-traits-and-interfaces/01-introduction.md +++ /dev/null @@ -1,5 +0,0 @@ -**Topics covered in this section** - -* [Using a Trait](using-a-trait.md) -* [Implementing an Interface](implementing-an-interface.md) -* [Trait and Interface Requirements](trait-and-interface-requirements.md) diff --git a/guides/hack/07-traits-and-interfaces/02-implementing-an-interface.md b/guides/hack/07-traits-and-interfaces/02-implementing-an-interface.md deleted file mode 100644 index 65a69a821..000000000 --- a/guides/hack/07-traits-and-interfaces/02-implementing-an-interface.md +++ /dev/null @@ -1,87 +0,0 @@ -A class can implement a *contract* through an interface, which is a set of required -method declarations and constants. - -Note that the methods are only declared, not defined; that is, an interface defines a type consisting -of *abstract* methods, where those methods are implemented by client classes as they see fit. An interface allows unrelated classes to -implement the same facilities with the same names and types without requiring those classes to share a common base class. For example: - -```Hack -interface MyCollection { - const MAX_NUMBER_ITEMS = 1000; - public function put(int $item): void; - public function get(): int; -} - -class MyList implements MyCollection { - public function put(int $item): void { /* implement method */ } - public function get(): int { /* implement method */ - return 0; - } - // ... -} - -class MyQueue implements MyCollection { - public function put(int $item): void { /* implement method */ } - public function get(): int { /* implement method */ - return 0; - } - // ... -} - -function process_collection(MyCollection $p1): void { - /* can process any object whose class implements MyCollection */ - $p1->put(123); -} - -<<__EntryPoint>> -function main(): void { - process_collection(new MyList()); - process_collection(new MyQueue()); -} -``` - -In this example, we define an interface type called `MyCollection` that contains an implicitly static [constant](../classes/constants.md) and two implicitly -abstract methods. Note how these methods have no bodies; their declarations end in a semicolon, which makes them abstract. Next, we define two -classes that each implement this interface. - -Note carefully that the parameter type of `process_collection` is an interface type. As such, when that function is called, the argument can -have any type that implements that interface type. As we add new collection types that implement that interface, we can plug them into the -application without impacting existing code. - -An interface can extend another interface; for example: - -```Hack no-extract -interface Iterator extends Traversable { - // ... -} -``` - -The library interface generic type `Iterator<...>` inherits the members of the interface generic type `Traversable<...>`. The `extends` -clause allows a comma-separated list of base interfaces, so an interface can have multiple base interfaces. As such, the members of an -interface are those specified by its own declaration, and the members inherited from its base interfaces. - -Interfaces are designed to support classes; an interface cannot be instantiated directly. - -An interface can have usage requirements placed on it; see [interface requirements](trait-and-interface-requirements.md) for more information. - -Methods declared in interfaces, and abstract methods in classes, should not use default values for parameters. Instead, they can declare a -parameter to be `optional`. Any implementation of the interface or abstract method must supply default values for the optional parameters. -```Hack -interface ICounter { - public function inc(optional int $increment): void; - public function get(): int; -} -class Counter implements ICounter { - public function __construct(private int $value = 0) { } - public function inc(int $increment = 1): void { - $this->value += $increment; - } - public function get(): int { - return $this->value; - } -} -function doSomething(ICounter $c):void { - $c->inc(); // Use default as defined by implementation of ICounter - $c->inc(10); // Uses the supplied value -} -``` diff --git a/guides/hack/07-traits-and-interfaces/03-using-a-trait.md b/guides/hack/07-traits-and-interfaces/03-using-a-trait.md deleted file mode 100644 index 892619855..000000000 --- a/guides/hack/07-traits-and-interfaces/03-using-a-trait.md +++ /dev/null @@ -1,248 +0,0 @@ -Traits are a mechanism for code reuse that overcomes some limitations of Hack single inheritance model. - -In its simplest form a trait defines properties and method declarations. A trait cannot be instantiated with `new`, but it can be _used_ inside one or more classes, via the `use` clause. Informally, whenever a trait is used by a class, the property and method definitions of the trait are inlined (copy/pasted) inside the class itself. The example below shows a simple trait defining a method that returns even numbers. The trait is used by two, unrelated, classes. - -```Hack -trait T { - public int $x = 0; - - public function return_even() : int { - invariant($this->x % 2 == 0, 'error, not even\n'); - $this->x = $this->x + 2; - return $this->x; - } -} - -class C1 { - use T; - - public function foo() : void { - echo "C1: " . $this->return_even() . "\n"; - } -} - -class C2 { - use T; - - public function bar() : void { - echo "C2: " . $this->return_even() . "\n"; - } -} - -<<__EntryPoint>> -function main() : void { - (new C1()) -> foo(); - (new C2()) -> bar(); -} -``` - -A class can use multiple traits, and traits themselves can use one or more traits. The example below uses three traits, to generate even numbers, to generate odd numbers given a generator of even numbers, and to test if a number is odd: - -```Hack -trait T1 { - public int $x = 0; - - public function return_even() : int { - invariant($this->x % 2 == 0, 'error, not even\n'); - $this->x = $this->x + 2; - return $this->x; - } -} - -trait T2 { - use T1; - - public function return_odd() : int { - return $this->return_even() + 1; - } -} - -trait T3 { - public static function is_odd(int $x) : bool { - if ($x % 2 == 1) { - return true; - } else { - return false; - } - } -} - -class C { - use T2; - use T3; - - public function foo() : void { - echo (string)static::is_odd($this->return_odd()) . "\n"; - } -} - -<<__EntryPoint>> -function main() : void { - (new C()) -> foo(); -} -``` - -Traits can contain both instance and static members. If a trait defines a static property, then each class using the trait has its own instance of the static property. - -A trait can access methods and properties of the class that uses it, but these dependencies must be declared using [trait requirements](trait-and-interface-requirements.md). - -### Resolution of naming conflicts - -A trait can insert arbitrary properties, constants, and methods inside a class, and naming conflicts may arise. Conflict resolution rules are different according to whether the conflict concerns a property, constant, or method. - -If a class uses multiple traits that define the same property, say `$x`, then every trait must define the property `$x` with the same type, visibility modifier, and initialization value. The class itself may, or not, define again the property `$x`, subject to the same conditions as above. - -Beware that at runtime all the instances of the multiply defined property `$x` are _aliased_. This might be source of unexpected interference between traits implementing unrelated services: in the example below the trait `T2` breaks the invariant of trait `T1` whenever both are used by the same class. - -```Hack -trait T1 { - public static int $x = 0; - - public static function even() : void { - invariant(static::$x % 2 == 0, 'error, not even\n'); - static::$x = static::$x + 2; - } -} - -trait T2 { - public static int $x = 0; - - public static function inc() : void { - static::$x = static::$x + 1; - } -} - -class C { - use T1; - use T2; - - public static function foo() : void { - static::inc(); - static::even(); - } -} - -<<__EntryPoint>> -function main() : void { - try { - C::foo(); - } catch (\Exception $ex) { - echo "Caught an exception\n"; - } -} -``` - -For methods, a rule of thumb is "traits provide a method implementation if the class itself does not". If the class implements a method `m`, then traits used by the class can define methods named `m` provided that their interfaces are compatible (more precisely _super types_ of the type of the method defined in the class. At runtime methods inserted by traits are ignored, and dispatch selects the method defined in the class. - -If multiple traits used by a class define the same method `m`, and a method named `m` is not defined by the class itself, then the code is rejected altogether, independently of the method interfaces. - -Traits inherited along multiple paths (aka. "diamond traits") are rejected by Hack and HHVM whenever they define methods. However the experimental `<<__EnableMethodTraitDiamond>>` attribute can be specified on the base class (or trait) to enable support for diamond traits that define methods, provided that method resolution remains unambiguous. For instance, in the example below the invocation of `(new C())->foo()` unambiguously resolves to the method `foo` defined in trait `T`: - - -```Hack -<> - -trait T { - public function foo(): void { echo "I am T"; } -} - -trait T1 { use T; } -trait T2 { use T; } - -<<__EnableMethodTraitDiamond>> -class C { - use T1, T2; -} - -<<__EntryPoint>> -function main() : void { - (new C())->foo(); -} -``` - -```.ini -hhvm.diamond_trait_methods=1 -``` - -Since the `<<__EnableMethodTraitDiamond>>` attribute is specified on the class `C`, the example is accepted by Hack and HHVM. - -_Remark_: a diamond trait cannot define properties if it is used by a class via the `<<__EnableMethodTraitDiamond>>` attribute. - - -For constants, constants inherited from the parent class take precedence over constants inherited from traits. - -```Hack -trait T { - const FOO = 'trait'; -} - -class B { - const FOO = 'parent'; -} - -class A extends B { use T; } - -<<__EntryPoint>> -function main() : void { - \var_dump(A::FOO); -} -``` - -If multiple used traits declare the same constant, the constant inherited from the first trait is used. - -```Hack -trait T1 { - const FOO = 'one'; -} - -trait T2 { - const FOO = 'two'; -} - -class A { use T1, T2; } - -<<__EntryPoint>> -function main() : void { - \var_dump(A::FOO); -} -``` - -Finally, constants inherited from interfaces declared on the class conflict with other inherited constants, including constants declared on traits. - -```Hack error -trait T { - const FOO = 'trait'; -} - -interface I { - const FOO = 'interface'; -} - -class A implements I { use T; } - -<<__EntryPoint>> -function main() : void { - \var_dump(A::FOO); -} -``` - -The single exception to this rule are constants inherited from traits via interfaces, as these will lose silently upon conflict. - -```Hack -interface I1 { - const FOO = 'one'; -} - -trait T implements I1 {} - -interface I { - const FOO = 'two'; -} - -class A implements I { use T; } - -<<__EntryPoint>> -function main() : void { - \var_dump(A::FOO); -} -``` diff --git a/guides/hack/07-traits-and-interfaces/04-trait-and-interface-requirements.md b/guides/hack/07-traits-and-interfaces/04-trait-and-interface-requirements.md deleted file mode 100644 index 9683d4158..000000000 --- a/guides/hack/07-traits-and-interfaces/04-trait-and-interface-requirements.md +++ /dev/null @@ -1,222 +0,0 @@ -Trait and interface requirements allow you to restrict the use of these constructs by specifying what classes may actually use a trait or -implement an interface. This can simplify long lists of `abstract` method requirements, and provide a hint to the reader as to the -intended use of the trait or interface. - -## Syntax - -To introduce a trait requirement, you can have one or more of the following in your trait: - -```Hack no-extract -require extends ; -require class ; -require implements ; -``` - -To introduce an interface requirement, you can have one or more of following in your interface: - -```Hack no-extract -require extends ; -``` - -## Traits - -Here is an example of a trait that introduces a class and interface requirement, and shows a class that meets the requirement: - -```Hack -abstract class Machine { - public function openDoors(): void { - return; - } - public function closeDoors(): void { - return; - } -} -interface Fliers { - public function fly(): bool; -} - -trait Plane { - require extends Machine; - require implements Fliers; - - public function takeOff(): bool { - $this->openDoors(); - $this->closeDoors(); - return $this->fly(); - } -} - -class AirBus extends Machine implements Fliers { - use Plane; - - public function fly(): bool { - return true; - } -} - -<<__EntryPoint>> -function run(): void { - $ab = new AirBus(); - \var_dump($ab); - \var_dump($ab->takeOff()); -} -``` - -Here is an example of a trait that introduces a class and interface requirement, and shows a class that *does not* meet the requirement: - -```Hack error -abstract class Machine { - public function openDoors(): void { - return; - } - public function closeDoors(): void { - return; - } -} -interface Fliers { - public function fly(): bool; -} - -trait Plane { - require extends Machine; - require implements Fliers; - - public function takeOff(): bool { - $this->openDoors(); - $this->closeDoors(); - return $this->fly(); - } -} - -// Having this will not only cause a typechecker error, but also cause a fatal -// error in HHVM since we did not meet the trait requirement. -class Paper implements Fliers { - use Plane; - - public function fly(): bool { - return false; - } -} - -<<__EntryPoint>> -function run(): void { - // This code will not run in HHVM because of the problem mentioned above. - $p = new Paper(); - \var_dump($p); - \var_dump($p->takeOff()); -} -``` - -The `require extends` constraints should be taken literally: the class that uses the trait *must* be a **strict** sub-class of that in the `require extends` constraint. - -A `require class ;` constraint in a trait specifies that the trait can only be used by the -_non-generic, _final_, class ``. This contrasts with the `require extends t;` constraints that allow the trait to be used by an arbitrary _strict_ subtype of `t`. -By relaxing the strict subtype constraint of `require extends`, `require class` constraints allow splitting the implementation of a class into a -class and one (or multiple) traits, as in the following: - -```Hack -trait T { - require class C; - public function foo(): void { - $this->bar(); - } -} - -final class C { - use T; - public function bar(): void {} -} -``` - -## Interfaces - -Here is an example of an interface that introduces a class requirement, and shows a class that meets the requirement: - -```Hack -abstract class Machine { - public function openDoors(): void { - return; - } - public function closeDoors(): void { - return; - } -} -interface Fliers { - require extends Machine; - public function fly(): bool; -} - -class AirBus extends Machine implements Fliers { - public function takeOff(): bool { - $this->openDoors(); - $this->closeDoors(); - return $this->fly(); - } - - public function fly(): bool { - return true; - } -} - -<<__EntryPoint>> -function run(): void { - $ab = new AirBus(); - \var_dump($ab); - \var_dump($ab->takeOff()); -} -``` - -Here is an example of an interface that introduces a class requirement, and shows a class that *does not* meet the requirement: - -```Hack error -abstract class Machine { - public function openDoors(): void { - return; - } - public function closeDoors(): void { - return; - } -} -interface Fliers { - require extends Machine; - public function fly(): bool; -} - -// Having this will not only cause a typechecker error, but also cause a fatal -// error in HHVM since we did not meet the interface requirement (extending -// Machine). -class Paper implements Fliers { - public function fly(): bool { - return false; - } -} - -<<__EntryPoint>> -function run(): void { - // This code will actually not run in HHVM because of the fatal mentioned - // above. - $p = new Paper(); - \var_dump($p); - \var_dump($p->takeOff()); -} -``` - -**NOTE**: trait cannot be used as a type, comparing to some other languages. Only class and interface are types. For example, - -```Hack no-extract -trait T {} -class C { use T; } -$a = new C(); -$j = ($a is C); -$k = ($a is T); # error! -``` -leads to error - -``` -Hit fatal : "is" and "as" operators cannot be used with a trait - #0 at [:1] - #1 include(), called at [:1] - #2 include(), called at [:0] -Hit fatal : "is" and "as" operators cannot be used with a trait -Failed to evaluate expression -``` diff --git a/guides/hack/07-traits-and-interfaces/traits-and-interfaces-category.txt b/guides/hack/07-traits-and-interfaces/traits-and-interfaces-category.txt deleted file mode 100644 index 1dcccc5c6..000000000 --- a/guides/hack/07-traits-and-interfaces/traits-and-interfaces-category.txt +++ /dev/null @@ -1 +0,0 @@ -Classes, Interfaces, Traits diff --git a/guides/hack/07-traits-and-interfaces/traits-and-interfaces-summary.txt b/guides/hack/07-traits-and-interfaces/traits-and-interfaces-summary.txt deleted file mode 100644 index cfdf15b6e..000000000 --- a/guides/hack/07-traits-and-interfaces/traits-and-interfaces-summary.txt +++ /dev/null @@ -1 +0,0 @@ -Mechanisms for code reuse and code constraint within classes. diff --git a/guides/hack/08-arrays-and-collections/01-introduction.md b/guides/hack/08-arrays-and-collections/01-introduction.md deleted file mode 100644 index 46daa151d..000000000 --- a/guides/hack/08-arrays-and-collections/01-introduction.md +++ /dev/null @@ -1,74 +0,0 @@ -Hack includes diverse range of array-like data structures. - -Hack arrays are value types for storing iterable data. The types -available are [`vec`](/hack/arrays-and-collections/vec-keyset-and-dict#vec), [`dict`](/hack/arrays-and-collections/vec-keyset-and-dict#dict) and [`keyset`](/hack/arrays-and-collections/vec-keyset-and-dict#keyset). **When in doubt, use Hack -arrays**. - -Hack collections are **deprecated** object types for storing iterable data. The types -available include `Vector`, `Map`, `Set`, `Pair` and helper -interfaces. - -## Quickstart -You can create Hack arrays as follows: - -```Hack -$v = vec[2, 1, 2]; - -$k = keyset[2, 1]; - -$d = dict['a' => 1, 'b' => 3]; -``` - -## The Hack Standard Library -There are many helpful functions in the `C`, `Vec`, `Keyset` and `Dict` -namespaces, which are a part of the [Hack Standard Library (HSL)](/hsl/reference). - -For more information on included HSL namespaces, see [Hack Standard Library: Namespaces](/hack/getting-started/the-hack-standard-library#hsl-namespaces). - -```Hack -// The C namespace contains generic functions that are relevant to -// all array and collection types. -C\count(vec[]); // 0 -C\is_empty(keyset[]); // true - -// The Vec, Keyset and Dict namespaces group functions according -// to their return type. -Vec\keys(dict['x' => 1]); // vec['x'] -Keyset\keys(dict['x' => 1]); // keyset['x'] - -Vec\map(keyset[1, 2], $x ==> $x + 1); // vec[2, 3] -``` - -## Arrays Cheat Sheet - -| Operation| `vec` | `dict` | `keyset` | -|----------|----------|----------|----------| -| Initialize empty | `$v = vec[];` | `$d = dict[];` | `$k = keyset[];` | -| Literal | `$v = vec[1, 2, 3];` | `$d = dict['foo' => 1];` | `$k = keyset['foo', 'bar'];` | -| From Another Container* | `$v = vec($container);` | `$d = dict($keyed_container);` | `$k = keyset($container);` | -| Keys from Container* | `$v = Vec\keys($container);` | N/A | `$k = Keyset\keys($container);`| -| Add Elements | `$v[] = 4;` | `$d['baz'] = 2;` | `$k[] = 'baz';` | -| Bulk Add Elements | `$v = Vec\concat($t1, $t2)` | `$d = Dict\merge($kt1, $kt2)` | `$k = Keyset\union($t1, $t2)` | -| Remove Elements | Remove-at-index is unsupported; `Vec\drop($v,$n)`, `Vec\take($v,$n)`; `$first=C\pop_front(inout $x)`, `$last=C\pop_back(inout $x)` | `unset($d['baz']);` | `unset($k['baz']);`| -| Key Existence | `C\contains_key($v, 1)` | `C\contains_key($d, 'foo')` | `C\contains_key($k, 'foo')` | -| Value Existence | `C\contains($v, 3)` | `C\contains($d, 2)` | Use `C\contains_key($k, 'foo')`| -| Equality (Order-Dependent) | `$v1 === $v2` | `$d1 === $d2` | `$k1 === $k2` | -| Equality (Order-Independent) | N/A | `Dict\equal($d1, $d2)` | `Keyset\equal($k1, $k2)` | -| Count Elements (i.e., length, size of array) | `C\count($v)` | `C\count($d)` | `C\count($k)` | -| Type Signature | `vec` | `dict` | `keyset` | -| Type Refinement | `$v is vec<_>` | `$d is dict<_, _>` | `$k is keyset<_>` | -| `Awaitable` Consolidation | `Vec\from_async($v)` | `Dict\from_async($d)` | `Keyset\from_async($x)` | - -\* `$container` can be a Hack Array or Hack Collection - -## Arrays Conversion Cheat sheet - -Prefer to use Hack arrays whenever possible. When interfacing with legacy APIs that expect older Containers, it may be easier to convert. Here's how: - -| Converting | To `Vector`| To `Map` | To `Set` | -|------------|------------|------------|------------| -| `dict` | N/A | `new Map($d)` | N/A | -| `dict` keys | `Vector::fromKeysOf($d)` | N/A | `Set::fromKeysOf($d)` | -| `dict` values | `new Vector($d)` | N/A | `new Set($d)` | -| `vec` | `new Vector($v)` | `new Map($v)` | `new Set($v)` | -| `keyset` | `new Vector($k)` | `new Map($k)` | `new Set($k)` | diff --git a/guides/hack/08-arrays-and-collections/05-vec-keyset-and-dict.md b/guides/hack/08-arrays-and-collections/05-vec-keyset-and-dict.md deleted file mode 100644 index babb37cbe..000000000 --- a/guides/hack/08-arrays-and-collections/05-vec-keyset-and-dict.md +++ /dev/null @@ -1,209 +0,0 @@ -`vec`, `keyset` and `dict` are value types. Any mutation produces a -new value, and does not modify the original value. - -These types are referred to as 'Hack arrays'. Prefer using these types -whenever you're unsure. - -## `vec` - -A `vec` is an ordered, iterable data structure. It is created with -the `vec[]` syntax. - -```Hack -// Creating a vec. -function get_items(): vec { - $items = vec['a', 'b', 'c']; - return $items; -} -``` - -`vec`s can be accessed with the following syntax. - -```Hack -$items = vec['a', 'b', 'c']; - -// Accessing items by index. -$items[0]; // 'a' -$items[3]; // throws OutOfBoundsException - -// Accessing items that might be out-of-bounds. -idx($items, 0); // 'a' -idx($items, 3); // null -idx($items, 3, 'default'); // 'default' - -// Modifying items. These operations set $items -// to a modified copy, and do not modify the original value. -$items[0] = 'xx'; // vec['xx', 'b', 'c'] -$items[] = 'd'; // vec['xx', 'b', 'c', 'd'] - -// Getting the length. -C\count($items); // 4 - -// Seeing if a vec contains a value or index. -C\contains($items, 'a'); // true -C\contains_key($items, 2); // true - -// Iterating. -foreach ($items as $item) { - echo $item; -} -// Iterating with the index. -foreach ($items as $index => $item) { - echo $index; // e.g. 0 - echo $item; // e.g. 'a' -} - -// Equality checks. Elements are recursively compared with ===. -vec[1] === vec[1]; // true -vec[1, 2] === vec[2, 1]; // false - -// Combining vecs. -Vec\concat(vec[1], vec[2, 3]); // vec[1, 2, 3] - -// Removing items at an index. -$items = vec['a', 'b', 'c']; -$n = 1; -Vec\concat(Vec\take($items, $n), Vec\drop($items, $n + 1)); // vec['a', 'c'] - -// Converting from an Iterable. -vec(keyset[10, 11]); // vec[10, 11] -vec(Vector { 20, 21 }); // vec[20, 21] -vec(dict['key1' => 'value1']); // vec['value1'] - -// Type checks. -$items is vec<_>; // true -``` - -## `keyset` - -A `keyset` is an ordered data structure without duplicates. It is -created with the `keyset[]` syntax. - -A `keyset` can only contain `string` or `int` values. - - -```Hack -// Creating a keyset. -function get_items(): keyset { - $items = keyset['a', 'b', 'c']; - return $items; -} -``` - -`keyset`s can be accessed with the following syntax. - -```Hack -$items = keyset['a', 'b', 'c']; - -// Checking if a keyset contains a value. -C\contains($items, 'a'); // true - -// Adding/removing items. These operations set $items to a modified copy, -// and do not modify the original value. -$items[] = 'd'; // keyset['a', 'b', 'c', 'd'] -$items[] = 'a'; // keyset['a', 'b', 'c', 'd'] -unset($items['b']); // keyset['a', 'c', 'd'] - -// Getting the length. -C\count($items); // 3 - -// Iterating. -foreach ($items as $item) { - echo $item; -} - -// Equality checks. === returns false if the order does not match. -keyset[1] === keyset[1]; // true -keyset[1, 2] === keyset[2, 1]; // false -Keyset\equal(keyset[1, 2], keyset[2, 1]); // true - -// Combining keysets. -Keyset\union(keyset[1, 2], keyset[2, 3]); // keyset[1, 2, 3] - -// Converting from an Iterable. -keyset(vec[1, 2, 1]); // keyset[1, 2] -keyset(Vector { 20, 21 }); // keyset[20, 21] -keyset(dict['key1' => 'value1']); // keyset['value1'] - -// Type checks. -$items is keyset<_>; // true -``` - -## `dict` - -A `dict` is an ordered key-value data structure. It is -created with the `dict[]` syntax. - -Keys must be `string`s or `int`s. `dict`s are ordered according to the -insertion order. - -```Hack -// Creating a dict. -function get_items(): dict { - $items = dict['a' => 1, 'b' => 3]; - return $items; -} -``` - -`dicts`s can be accessed with the following syntax. - -```Hack -$items = dict['a' => 1, 'b' => 3]; - -// Accessing items by key. -$items['a']; // 1 -$items['foo']; // throws OutOfBoundsException - -// Accessing keys that may be absent. -idx($items, 'a'); // 1 -idx($items, 'z'); // null -idx($items, 'z', 'default'); // 'default' - -// Inserting, updating or removing values in a dict. These operations -// set $items to a modified copy, and do not modify the original value. -$items['a'] = 42; // dict['a' => 42, 'b' => 3] -$items['z'] = 100; // dict['a' => 42, 'b' => 3, 'z' => 100] -unset($items['b']); // dict['a' => 42, 'z' => 100] - -// Getting the keys. -Vec\keys(dict['a' => 1, 'b' => 3]); // vec['a', 'b'] - -// Getting the values. -vec(dict['a' => 1, 'b' => 3]); // vec[1, 3] - -// Getting the length. -C\count($items); // 2 - -// Checking if a dict contains a key or value. -C\contains_key($items, 'a'); // true -C\contains($items, 3); // true - -// Iterating values. -foreach ($items as $value) { - echo $value; // e.g. 1 -} -// Iterating keys and values. -foreach ($items as $key => $value) { - echo $key; // e.g. 'a' - echo $value; // e.g. 1 -} - -// Equality checks. === returns false if the order does not match. -dict[] === dict[]; // true -dict[0 => 10, 1 => 11] === dict[1 => 11, 0 => 10]; // false -Dict\equal(dict[0 => 10, 1 => 11], dict[1 => 11, 0 => 10]); // true - -// Combining dicts (last item wins). -Dict\merge(dict[10 => 1, 20 => 2], dict[30 => 3, 10 => 0]); -// dict[10 => 0, 20 => 2, 30 => 3]; - -// Converting from an Iterable. -dict(vec['a', 'b']); // dict[0 => 'a', 1 => 'b'] -dict(Map {'a' => 5}); // dict['a' => 5] - -// Type checks. -$items is dict<_, _>; // true -``` - -If you want different keys to have different value types, or if you -want a fixed set of keys, consider using a `shape` instead. diff --git a/guides/hack/08-arrays-and-collections/10-object-collections.md b/guides/hack/08-arrays-and-collections/10-object-collections.md deleted file mode 100644 index d1f5cf4bf..000000000 --- a/guides/hack/08-arrays-and-collections/10-object-collections.md +++ /dev/null @@ -1,293 +0,0 @@ -The collection object types are `Vector`, `ImmVector`, `Map`, `ImmMap`, -`Set`, `ImmSet` and `Pair`. There are also a range of helper -interfaces, discussed below. - -Hack Collection types are objects. They have reference semantics, so -they can be mutated. - -Collections define a large number of methods you can use. They also -support array style syntax. Idiomatic Hack prefers array access syntax over methods, e.g. -`$v[0]` is better than `$v->at(0)`. - -This page focuses on the core operations available, which all have -array access syntax. Consult the reference pages -(e.g. [Vector](/hack/reference/class/HH.Vector/)) for the full list of -methods. - -## `Vector` and `ImmVector` - -*Where possible, we recommend using `vec` instead.* - -A `Vector` is a mutable ordered data structure. It is -created with the `Vector {}` syntax. - -```Hack -// Creating a Vector. -function get_items(): Vector { - $items = Vector {'a', 'b', 'c'}; - return $items; -} -``` - -`Vector`s can be accessed with the following syntax. - -```Hack -$items = Vector {'a', 'b', 'c'}; - -// Accessing items by index. -$items[0]; // 'a' -$items[3]; // throws OutOfBoundsException - -// Accessing items that might be out-of-bounds. -idx($items, 0); // 'a' -idx($items, 3); // null -idx($items, 3, 'default'); // 'default' - -// Modifying items. This mutates the Vector in place. -$items[0] = 'xx'; // Vector {'xx', 'b', 'c'} -$items[] = 'd'; // Vector {'xx', 'b', 'c', 'd'} - -// Getting the length. -C\count($items); // 4 - -// Iterating. -foreach ($items as $item) { - echo $item; -} -// Iterating with the index. -foreach ($items as $index => $item) { - echo $index; // e.g. 0 - echo $item; // e.g. 'a' -} - -// Equality checks compare references. -$items === $items; // true -Vector {} === Vector {}; // false - -// Converting from an Iterable. -new Vector(vec[1, 2]); // Vector {1, 2} -new Vector(Set {1, 2}); // Vector {1, 2} -new Vector(dict['key1' => 'value1']); // Vector {'value1'} - -// Type checks -$items is Vector<_>; // true -``` - -`ImmVector` is an immutable version of `Vector`. - -``` Hack -// Creating an ImmVector. -function get_items(): ImmVector { - $items = ImmVector {'a', 'b', 'c'}; - return $items; -} -``` - -## `Set` and `ImmSet` - -*Where possible, we recommend using `keyset` instead.* - -A `Set` is a mutable, ordered, data structure without duplicates. It -is created with the `Set {}` syntax. - -A `Set` can only contain `string` or `int` values. - -```Hack -// Creating a Set. -function get_items(): Set { - $items = Set {'a', 'b', 'c'}; - return $items; -} -``` - -`Set`s can be accessed with the following syntax. - -```Hack -$items = Set {'a', 'b', 'c'}; - -// Checking if a Set contains a value. -C\contains_key($items, 'a'); // true - -// Modifying items. This mutates the Set in place. -$items[] = 'd'; // Set {'a', 'b', 'c', 'd'} -$items[] = 'a'; // Set {'a', 'b', 'c', 'd'} - -// Getting the length. -C\count($items); // 4 - -// Iterating. -foreach ($items as $item) { - echo $item; -} - -// Equality checks compare references. -$items === $items; // true -Set {} === Set {}; // false - -// Converting from an Iterable. -new Set(vec[1, 2, 1]); // Set {1, 2} -new Set(Vector {20, 21}); // Set {20, 21} -new Set(dict['key1' => 'value1']); // Set {'value1'} - -// Type checks. -$items is Set<_>; // true -``` - -`ImmSet` is an immutable version of `Set`. - -``` Hack -// Creating an ImmSet. -function get_items(): ImmSet { - $items = ImmSet {'a', 'b', 'c'}; - return $items; -} -``` - - -## `Map` and `ImmMap` - -*Where possible, we recommend using `dict` instead.* - -A `Map` is a mutable, ordered, key-value data structure. It is -created with the `Map {}` syntax. - -Keys must be `string`s or `int`s. - -```Hack -// Creating a Map. -function get_items(): Map { - $items = Map {'a' => 1, 'b' => 3}; - return $items; -} -``` - -`Map`s can be accessed with the following syntax. - -```Hack -$items = Map {'a' => 1, 'b' => 3}; - -// Accessing items by key. -$items['a']; // 1 -$items['z']; // throws OutOfBoundsException - -// Accessing keys that may be absent. -idx($items, 'a'); // 1 -idx($items, 'z'); // null -idx($items, 'z', 'default'); // 'default' - -// Modifying items. This mutates the Map in place. -$items['a'] = 42; // Map {'a' => 42, 'b' => 3} -$items['z'] = 100; // Map {'a' => 42, 'b' => 3, 'z' => 100} - -// Getting the keys. -Vec\keys(Map {'a' => 1, 'b' => 3}); // vec['a', 'b'] - -// Getting the values. -vec(Map {'a' => 1, 'b' => 3}); // vec[1, 3] - -// Getting the length. -C\count($items); // 3 - -// Iterating values. -foreach ($items as $value) { - echo $value; -} -// Iterating keys and values. -foreach ($items as $key => $value) { - echo $key; - echo $value; -} - -// Equality checks compare references. -$items === $items; // true -Map {} === Map {}; // false - -// Converting from an Iterable. -new Map(dict['key1' => 'value1']); // Map { 'key1' => 'value1'} -new Map(vec['a', 'b']); // Map {0 => 'a', 1 => 'b'} - -// Type checks -$items is Map<_, _>; // true -``` - -`ImmMap` is an immutable version of `Map`. - -``` Hack -// Creating an ImmMap. -function get_items(): ImmMap { - $items = ImmMap {'a' => 1, 'b' => 3}; - return $items; -} -``` - -## `Pair` - -*Where possible, we recommend using `tuple` instead.* - -A `Pair` is an immutable data structure with two items. It is -created with the `Pair {}` syntax. - -``` Hack -function get_items(): Pair { - $items = Pair {42, 'foo'}; - return $items; -} -``` - -`Pair`s can be accessed with the following syntax. - -```Hack -$items = Pair {42, 'foo'}; - -// Destructuring a Pair value. -list($x, $y) = $items; // $x: 42, $y: 'foo' - -// Accessing elements by index. -$items[0]; // 42 -$items[1]; // 'foo' -``` - -## Interfaces - -Hack Collections implement a range of helper interfaces, so your code -can handle multiple Hack Collection types. - -If you want to handle both Hack arrays and Hack Collections, use -`Traversable`. If you want to read and write a Hack Collection, use -`Collection`. If you only want to read a Hack Collection, use -`ConstCollection`. - -The `ConstCollection` interface represents Hack Collections that be -can read from. - -```text - ConstCollection - +-- ConstVector - | +-- ImmVector - | +-- Pair - +-- ConstSet - | +-- ImmSet - +-- ConstMap - | +-- ImmMap - +-- Collection - +-- MutableVector - | +-- Vector - +-- MutableMap - | +-- Map - +-- MutableSet - +-- Set -``` - -The `OutputCollection` interface represents Hack Collections that be -can written to. - -```text - OutputCollection - +-- Collection - +-- MutableVector - | +-- Vector - +-- MutableMap - | +-- Map - +-- MutableSet - +-- Set -``` diff --git a/guides/hack/08-arrays-and-collections/15-varray-and-darray.md b/guides/hack/08-arrays-and-collections/15-varray-and-darray.md deleted file mode 100644 index f6c74b3aa..000000000 --- a/guides/hack/08-arrays-and-collections/15-varray-and-darray.md +++ /dev/null @@ -1,162 +0,0 @@ -**`varray`, `darray` and `varray_or_darray` are legacy value types for -storing iterable data.**. They are also called 'PHP arrays' and will -eventually be removed. - -PHP arrays are immutable value types, just like Hack arrays. Unlike -Hack arrays, they include legacy behaviors from PHP that can hide -bugs. - -For example, in HHVM 4.36, invalid array keys are accepted and -silently coerced to an `arraykey`. - -```Hack no-extract -$x = dict[false => 123]; -var_dump(array_keys($x)[0]); -// int(0), not `bool(false)` -``` - -## `varray` - -#### Use Hack Arrays - -As of [HHVM 4.103](https://hhvm.com/blog/2021/03/31/hhvm-4.103.html), `varray` is aliased to `vec`. Use [`vec`](https://docs.hhvm.com/hack/arrays-and-collections/hack-arrays#vec). - -#### Working with varrays - -A `varray` is an ordered, iterable data structure. - -```Hack no-extract -// Creating a varray. -function get_items(): varray { - $items = vec['a', 'b', 'c']; - return $items; -} - -// Accessing items by index. -$items[0]; // 'a' -$items[3]; // throws OutOfBoundsException - -// Accessing items that might be out-of-bounds. -idx($items, 0); // 'a' -idx($items, 3); // null -idx($items, 3, 'default'); // 'default' - -// Modifying items. These operations set $items -// to a modified copy, and do not modify the original value. -$items[0] = 'xx'; // vec['xx', 'b', 'c'] -$items[] = 'd'; // vec['xx', 'b', 'c', 'd'] - -// Getting the length. -C\count($items); // 4 - -// Iterating. -foreach ($items as $item) { - echo $item; -} -// Iterating with the index. -foreach ($items as $index => $item) { - echo $index; // e.g. 0 - echo $item; // e.g. 'a' -} - -// Equality checks. -vec[1] === vec[1]; // true -vec[1, 2] === vec[2, 1]; // false - -// Converting from an Iterable. -varray(vec[10, 11]); // vec[10, 11] -varray(keyset[10, 11]); // vec[10, 11] -``` - -## `darray` - -#### Use Hack Arrays - -As of [HHVM 4.103](https://hhvm.com/blog/2021/03/31/hhvm-4.103.html), `darray` is aliased to `dict`. Use [`dict`](https://docs.hhvm.com/hack/arrays-and-collections/hack-arrays#dict). - -#### Working with darrays - -A `darray` is an ordered key-value data structure. - -```Hack no-extract -// Creating a darray. -function get_items(): darray { - $items = dict['a' => 1, 'b' => 3]; - return $items; -} - -// Accessing items by key. -$items['a']; // 1 -$items['foo']; // throws OutOfBoundsException - -// Accessing keys that may be absent. -idx($items, 'a'); // 1 -idx($items, 'z'); // null -idx($items, 'z', 'default'); // 'default' - -// Inserting, updating or removing values in a darray. These operations -// set $items to a modified copy, and do not modify the original value. -$items['a'] = 42; // dict['a' => 42, 'b' => 3] -$items['z'] = 100; // dict['a' => 42, 'b' => 3, 'z' => 100] -unset($items['b']); // dict['a' => 42, 'z' => 100] - -// Getting the keys. -Vec\keys(dict['a' => 1, 'b' => 3]); // vec['a', 'b'] - -// Getting the values. -vec(dict['a' => 1, 'b' => 3]); // vec[1, 3] - -// Getting the length. -C\count($items); // 2 - -// Checking if a dict contains a key or value. -C\contains_key($items, 'a'); // true -C\contains($items, 3); // true - -// Iterating values. -foreach ($items as $value) { - echo $value; // e.g. 1 -} -// Iterating keys and values. -foreach ($items as $key => $Value) { - echo $key; // e.g. 'a' - echo $value; // e.g. 1 -} - -// Equality checks. === returns false if the order does not match. -dict[] === dict[]; // true -dict[0 => 10, 1 => 11] === dict[1 => 11, 0 => 10]; // false - -// Converting from an Iterable. -darray(vec['a', 'b']); // dict[0 => 'a', 1 => 'b'] -darray(Map {'a' => 5}); // dict['a' => 5] -``` - -## `varray_or_darray` - -A `varray_or_darray` is type that can be either a `varray` or -`darray`. It exists to help gradually migrate code to more specific -types, and should be avoided when possible. - -```Hack -function get_items(bool $b): varray_or_darray { - if ($b) { - return vec['a', 'b']; - } else { - return dict[5 => 'c']; - } -} -``` - -## Runtime options - -In HHVM version 4.62 and earlier, by default, `varray` and `darray` are interchangeable at runtime; this can be changed, as can some legacy PHP array behaviors, depending on the HHVM version. - -The available runtime options change frequently; to get an up-to-date list, search `ini_get_all()` for settings beginning with `hhvm.hack_arr`; in general: -- a value of `0` means no logging -- `1` means a warning or notice is raised -- `2` means a recoverable error is raised - -The `hhvm.hack_arr_compat_notices` option must be set to true for any of the `hhvm.hack_arr_` options to have an effect. - -Individual runtime settings are documented [here](/hack/built-in-types/darray-varray-runtime-options.md). diff --git a/guides/hack/08-arrays-and-collections/20-mutating-values.md b/guides/hack/08-arrays-and-collections/20-mutating-values.md deleted file mode 100644 index 09ce00c7c..000000000 --- a/guides/hack/08-arrays-and-collections/20-mutating-values.md +++ /dev/null @@ -1,109 +0,0 @@ -Hack arrays are value types. This makes your code easier to reason -about, faster (no work required on a fresh web request), and well -suited for caches. - -If you really need mutation, Hack provides you with several options. - -## Updating value types - -Updating an element in a value type creates a new copy. - -``` Hack -function update_value(vec $items): vec { - // Both of these operations set $items a modified copy of the - // original value. - $items[0] = 42; - $items[] = 100; - return $items; -} - -function demo(): void { - $v = vec[1, 2]; - // $v is unaffected by this function call. - $v2 = update_value($v); - - var_dump($v); // vec[1, 2] - var_dump($v2); // vec[42, 2, 100] -} -``` - -Value types are shallow. A mutable type inside a value type is mutated -by reference. - -``` Hack -class Person { - public function __construct(public string $name) {} -} - -function update_person(vec $items): void { - $items[0]->name = "new"; -} - -function demo(): void { - $v = vec[new Person("old")]; - - update_person($v); - - var_dump($v); // vec[Person { name: "new" }] -} -``` - -## Using `inout` to simulate mutability - -You can often use `inout` parameters instead of mutation. This copies -the modified parameters back to the locals of the caller. - -``` Hack -function update_value(inout vec $items): void { - $items[0] = 42; - $items[] = 100; -} - -function demo(): void { - $v = vec[1, 2]; - update_value(inout $v); - - var_dump($v); // vec[42, 2, 100] -} -``` - -## Using `Ref` for shallow mutability - -The `Ref` class provides a single value that can be mutated. - -```Hack no-extract -function update_value(Ref> $items): void { - $inner = $items->get(); - $inner[0] = 42; - $inner[] = 100; - $items->set($inner); -} - -function demo(): void { - $v = new Ref(vec[1, 2]); - update_value($v); - - var_dump($v->get()); // vec[42, 2, 100] -} - -``` - -## Using Collections for mutability - -All the Collection classes are mutable. We recommend using Hack arrays -wherever possible, but you can use `Vector`, `Set` or `Map` if you -really need to. - -``` Hack -function update_value(Vector $items): void { - $items[0] = 42; - $items[] = 100; -} - -function demo(): void { - $v = Vector {1, 2}; - update_value($v); - - var_dump($v); // Vector {42, 2, 100} -} -``` diff --git a/guides/hack/08-arrays-and-collections/arrays-and-collections-category.txt b/guides/hack/08-arrays-and-collections/arrays-and-collections-category.txt deleted file mode 100644 index 263beb086..000000000 --- a/guides/hack/08-arrays-and-collections/arrays-and-collections-category.txt +++ /dev/null @@ -1 +0,0 @@ -Getting Started diff --git a/guides/hack/08-arrays-and-collections/arrays-and-collections-summary.txt b/guides/hack/08-arrays-and-collections/arrays-and-collections-summary.txt deleted file mode 100644 index f11f8303c..000000000 --- a/guides/hack/08-arrays-and-collections/arrays-and-collections-summary.txt +++ /dev/null @@ -1 +0,0 @@ -Immutable collections, mutable collections, and APIs. diff --git a/guides/hack/10-types/01-introduction.md b/guides/hack/10-types/01-introduction.md deleted file mode 100644 index ece17b1c4..000000000 --- a/guides/hack/10-types/01-introduction.md +++ /dev/null @@ -1,17 +0,0 @@ -Hack includes a strong static type system. This section covers the -basic features of the type checker. - -See also the [`is` operator](../expressions-and-operators/is.md) for -checking the type of a value, and the [`as` operator](../expressions-and-operators/as.md) -for asserting types. - -**Topics covered in this section** - -* [Subtyping](supertypes-and-subtypes.md) -* [Soft Types](soft-types.md) -* [Nullable Types](nullable-types.md) -* [Type Aliases (`newtype` and `type`)](type-aliases.md) -* [Type Conversion](type-conversion.md) -* [Type Inferencing](type-inferencing.md) -* [Type Refinement](type-refinement.md) -* [Generic Types](generic-types.md) diff --git a/guides/hack/10-types/45-soft-types.md b/guides/hack/10-types/45-soft-types.md deleted file mode 100644 index 5dc71c173..000000000 --- a/guides/hack/10-types/45-soft-types.md +++ /dev/null @@ -1,25 +0,0 @@ -A soft type hint `<<__Soft>> Foo` allows you to add types to code without -crashing if you get the type wrong. - -```Hack -function probably_int(<<__Soft>> int $x): @int { - return $x + 1; -} - -function definitely_int(int $x): int { - return $x + 1; -} -``` - -Calling `definitely_int("foo")` will produce an error at runtime, -whereas `probably_int("foo")` will only log a warning. - -The type checker treats both `definitely_int` and `probably_int` the -same way. Code completion and type checks are identical. - -Soft type hints are useful when migrating partial code or very dynamic -code to strict mode. Once you've fixed your code, and you're not -seeing any more warnings, then you can remove the `<<__Soft>>`. - -Previous versions of Hack used `@Foo` syntax instead of -`<<__Soft>> Foo`. diff --git a/guides/hack/10-types/46-generic-types.md b/guides/hack/10-types/46-generic-types.md deleted file mode 100644 index 933b9625c..000000000 --- a/guides/hack/10-types/46-generic-types.md +++ /dev/null @@ -1,51 +0,0 @@ -Hack contains a mechanism to define generic—that is, type-less—classes, interfaces, and traits, and to create type-specific instances of -them via type parameters. - -Consider the following example in which `Stack` is a generic class having one type parameter, `T`, and that implements a stack: - -```Hack file:stack.hack -class StackUnderflowException extends Exception {} - -class Stack { - private vec $stack; - private int $stackPtr; - - public function __construct() { - $this->stackPtr = 0; - $this->stack = vec[]; - } - - public function push(T $value): void { - $this->stack[] = $value; - $this->stackPtr++; - } - - public function pop(): T { - if ($this->stackPtr > 0) { - $this->stackPtr--; - return $this->stack[$this->stackPtr]; - } else { - throw new StackUnderflowException(); - } - } -} -``` - -As shown, the type parameter `T` (specified in `Stack`) is used as a placeholder in the declaration of the instance property `$stack`, as -the parameter type of the instance method `push`, and as the return type of the instance method `pop`. Note that although `push` and `pop` use -the type parameter, they are not themselves generic methods. - -```Hack file:stack.hack -function use_int_stack(Stack $stInt): void { - $stInt->push(10); - $stInt->push(20); - $stInt->push(30); - echo 'pop => '.$stInt->pop()."\n"; -} -``` - -Assuming we construct an instance for a `Stack` of `int`s, we can pass that to function `use_int_stack`, which can push values onto, and pop -values off, that stack, as shown. And in the same or different programs, we can have stacks of `string`, stacks of `?(int, float)`, stacks of -`Employee`, and so on, without have to write type-specific code for each kind of stack. - -For more information, see [generic types overview](../generics/introduction.md). diff --git a/guides/hack/10-types/67-nullable-types.md b/guides/hack/10-types/67-nullable-types.md deleted file mode 100644 index a8ae33dec..000000000 --- a/guides/hack/10-types/67-nullable-types.md +++ /dev/null @@ -1,43 +0,0 @@ -A type `?Foo` is either a value of type `Foo`, or `null`. - -``` Hack -function takes_nullable_str(?string $s): string { - if ($s is null){ - return "default"; - } else { - return $s; - } -} -``` - -`nonnull` is any value except `null`. You can use it to check if a -value is not `null`: - -``` Hack -function takes_nullable_str2(?string $s): string { - if ($s is nonnull){ - return $s; - } else { - return "default"; - } -} -``` - -This is slightly better than writing `$s is string`, as you don't need -to repeat the type name. - -`nonnull` is also useful when using generics. - -``` Hack -function my_filter_nulls(vec $items): vec { - $result = vec[]; - foreach ($items as $item) { - if ($item is null) { - // Discard it. - } else { - $result[] = $item; - } - } - return $result; -} -``` diff --git a/guides/hack/10-types/76-type-conversion.md b/guides/hack/10-types/76-type-conversion.md deleted file mode 100644 index 4be426db4..000000000 --- a/guides/hack/10-types/76-type-conversion.md +++ /dev/null @@ -1,126 +0,0 @@ -In a few situations (documented in the following sections) the values of operands are implicitly converted from one type to another. Explicit -conversion is performed using the [cast operator](../expressions-and-operators/casting.md). - -If an expression is converted to its own type, the type and value of the result are the same as the type and value of the expression. - -When an expression of type `num` is converted, if that expression is currently an `int`, then `int` conversion rules apply; otherwise, `float` -conversion rules apply. - -When an expression of type `arraykey` is converted, if that expression is currently an `int`, then `int` conversion rules apply; otherwise, `string` -conversion rules apply. - -## Conversion to `bool` - -No non-`bool` type can be converted implicitly to `bool`. All other conversions must be explicit. - -If the source type is `int` or `float`, then if the source value tests equal to 0, the result value is `false`; otherwise, the result value is `true`. - -If the source value is `null`, the result value is `false`. - -If the source is an empty string or the string "0", the result value is `false`; otherwise, the result value is `true`. - -If the source is an array with zero elements, the result value is `false`; otherwise, the result value is `true`. - -If the source is an object, the result value is `true`, with some legacy exceptions: -- `SimpleXMLElement` can be false if there are no child elements -- The legacy Hack Collection classes `Vector`, `Map`, `Set` and their immutable variants can be false if there are no elements in the collection. - -We strongly recommend not depending on these behaviors. - -If the source is a resource, the result value is `false`. - -The library function `boolval` allows values to be converted to `bool`. - -## Conversion to `int` - -No non-`int` type can be converted implicitly to `int`. All other conversions must be explicit. - -If the source type is `bool`, then if the source value is `false`, the result value is 0; otherwise, the result value is 1. - -If the source type is `float`, for the values `INF`, `-INF`, and `NAN`, the result value is implementation-defined. For all other values, if -the precision can be preserved, the fractional part is rounded towards zero and the result is well defined; otherwise, the result is undefined. - -If the source value is `null`, the result value is 0. - -If the source is a [numeric string or leading-numeric string](../built-in-types/string.md) having integer format, if the precision can be preserved the result -value is that string's integer value; otherwise, the result is undefined. If the source is a numeric string or leading-numeric string having -floating-point format, the string's floating-point value is treated as described above for a conversion from `float`. The trailing non-numeric -characters in leading-numeric strings are ignored. For any other string, the result value is 0. - -If the source is an array with zero elements, the result value is 0; otherwise, the result value is 1. - -If the source is a resource, the result is the resource's unique ID. - -The library function `intval` allows values to be converted to `int`. - -## Converting to `float` - -No non-`float` type can be converted implicitly to `float`. All other conversions must be explicit. - -If the source type is `int`, if the precision can be preserved the result value is the closest approximation to the source value; otherwise, the -result is undefined. - -If the source is a [numeric string or leading-numeric string](../built-in-types/string.md) having integer format, the string's integer value is treated as described -above for a conversion from `int`. If the source is a numeric string or leading-numeric string having floating-point format, the result value is -the closest approximation to the string's floating-point value. The trailing non-numeric characters in leading-numeric strings are ignored. For -any other string, the result value is 0. - -If the source is an array with zero elements, the result value is 0.0; otherwise, the result value is 1.0. - -If the source is a resource, the result is the resource's unique ID. - -The library function `floatval` allows values to be converted to float. - -## Converting to `num` - -The only implicit conversions to type `num` are from the types `int` and `float`. There is no change in representation during such conversions. There -are no explicit conversions. - -## Converting to `string` - -Except for the type [`classname`](../built-in-types/classname.md), no non-`string` type can be converted implicitly to `string`. All other conversions must be explicit. - -If the source type is `bool`, then if the source value is `false`, the result value is the empty string; otherwise, the result value is "1". - -If the source type is `int` or `float`, then the result value is a string containing the textual representation of the source value (as specified by the -library function `sprintf`). - -If the source value is `null`, the result value is an empty string. - -If the source is an object, then if that object's class has a [`__toString` method](../classes/methods-with-predefined-semantics.md#method-__toString), the -result value is the -string returned by that method; otherwise, the conversion is invalid. - -If the source is a resource, the result value is an implementation-defined string. - -If the source type is the [`classname` type](../built-in-types/classname.md), the result value is a string containing the corresponding fully qualified class or -interface name without any leading `\`. - -The library function `strval` allows values to be converted to `string`. - -## Converting to `arraykey` - -The only implicit conversions to type `arraykey` are from the types `int` and `string`. There is no change in representation during such -conversions. There are no explicit conversions. - -## Converting to an Object Type - -An object type can be converted implicitly to any object type from which the first object type is derived directly or indirectly. There are no -other implicit or explicit conversions. - -## Converting to an Interface Type - -An object type can be converted implicitly to any interface type that object type implements directly or indirectly. - -An interface type can be converted implicitly to any interface type from which the first interface type is derived directly or indirectly. - -There are no other implicit or explicit conversions. - -## Converting to Resource Type - -Standard IO streams returned by [file stream functions](../built-in-types/resources.md) `HH\\stdin()`, `HH\\stdout()`, and `HH\\stderr()`, can be converted implicitly to resource. -No other non-resource type can be so converted. No explicit conversions exist. - -## Converting to Mixed Type - -Any type can be converted implicitly to `mixed`. No explicit conversions exist. diff --git a/guides/hack/10-types/79-type-aliases.md b/guides/hack/10-types/79-type-aliases.md deleted file mode 100644 index f69e0952e..000000000 --- a/guides/hack/10-types/79-type-aliases.md +++ /dev/null @@ -1,82 +0,0 @@ -We can create an alias name for a type, and it is common to do so for non-trivial tuple and shape types. Once such a type alias has been defined, -that alias can be used in almost all contexts in which a type specifier is permitted. Any given type can have multiple aliases, and a type alias -can itself have aliases. - -## Quickstart -A type alias can be created in two ways: using `type` and `newtype`. - -```Hack -type Complex = shape('real' => float, 'imag' => float); -newtype Point = (float, float); -``` - -A type alias can include [Generics](/hack/generics/introduction) as parameters. - -## Using `type` -An alias created using `type` (such as `Complex` above) is a *transparent type alias*. For a given type, that type and all transparent aliases -to that type are all the same type and can be freely interchanged. `type` declarations are top-level declarations. - -## Using `newtype` -An alias created using `newtype` (such as `Point` above) is an *opaque type alias*. In the absence of a type-constraint (see `Counter` -example below), each opaque alias type is distinct from its underlying type and from any other types aliasing it or its underlying type. -Only source code in the file that contains the definition of the opaque type alias is allowed access to the underlying implementation. As -such, opaque type aliasing is an abstraction mechanism. Consider the following file, which contains an opaque alias definition for a tuple -that mimics a point: - -```Hack -newtype Point = (float, float); - -function create_Point(float $x, float $y): Point { - return tuple($x, $y); -} - -function distance(Point $p1, Point $p2): float { - $dx = $p1[0] - $p2[0]; - $dy = $p1[1] - $p2[1]; - return sqrt($dx*$dx + $dy*$dy); -} -``` - -## Choosing between `type` and `newtype` - -Looking at the earlier example, being in the same source file as the alias definition, the functions `create_Point` and `distance` have direct access to the `float` fields in any `Point`'s tuple. However, other files will not have this same access. - -Similarly, if a source file defines the following opaque alias... - -```Hack -newtype Widget = int; -``` - -...any file that includes this file has no knowledge that a `Widget` is really an integer, so that the including file cannot perform any -integer-like operations on a `Widget`. - -Consider a file that contains the following opaque type definition: - -```Hack -newtype Counter = int; -``` - -Any file that includes this file has no knowledge that a Counter is really an integer, meaning the including file *cannot* perform any -integer-like operations on that type. This is a major limitation, as the supposedly well-chosen name for the abstract type, Counter, -suggests that its value could increase and/or decrease. We can fix this by adding a type constraint to the alias's definition, as follows: - -```Hack -newtype Counter as int = int; -``` - -The presence of the type constraint `as int` allows the opaque type to be treated as if it had the type specified by that type constraint, -which removes some of the alias' opaqueness. Although the presence of a constraint allows the alias type to be converted implicitly to the -constraint type, no conversion is defined in the opposite direction. In this example, this means that a Counter may be implicitly converted -into an `int`, but not the other way around. - -Consider the following: - -```Hack no-extract -class C { - const type T2 as arraykey = int; - // ... -} -``` - -Here, we have a class-specific type constant that is an alias, which allows a value of type `T2` to be used in any context an `arraykey` -is expected. After all, any `int` value is also an `arraykey` value. diff --git a/guides/hack/10-types/82-supertypes-and-subtypes.md b/guides/hack/10-types/82-supertypes-and-subtypes.md deleted file mode 100644 index ffe840959..000000000 --- a/guides/hack/10-types/82-supertypes-and-subtypes.md +++ /dev/null @@ -1,28 +0,0 @@ -The set of built-in and user-defined types in Hack can be thought of as a type hierarchy of *supertypes* and *subtypes* in which a variable -of some type can hold the values of any of its subtypes. For example, `int` and `float` are subtypes of `num`. - -A supertype can have one or more subtypes, and a subtype can have one or more supertypes. A supertype can be a subtype of some other supertype, -and a subtype can be a supertype of some other subtype. - -The relationship between a supertype and any of its subtypes involves the notion of substitutability. Specifically, if *T2* is a subtype of *T1*, -program elements designed to operate on *T1* can also operate on *T2*. - -For types in Hack, the following rules apply: -* The root of the type hierarchy is the type `mixed`; as such, every type is a subtype of that type. -* Any type is a subtype of itself. -* `int` and `float` are subtypes of `num`. -* `int` and `string` are subtypes of `arraykey`. -* For each type *T*, *T* is a subtype of the nullable type `?`*T*. -* For each type *T*, the null type is a subtype of all nullable types `?`*T*. -* `string` is a subtype of `Stringish`. -* The predefined types `vec`, `dict`, and `keyset` are subtypes of `Container`, `KeyedContainer`, `KeyedTraversable`, and `Traversable`. -* If *A* is an alias for a type *T* created using `type`, then *A* is a subtype of *T*, and *T* is a subtype of *A*. -* If *A* is an alias for a type *T* created using `newtype`, inside the file containing the `newtype` definition, A is a subtype of *T*, and *T* -is a subtype of *A*. Outside that file, *A* and *T* have no relationship, except that given `newtype A as C = T`, outside the file with the -`newtype` definition, *A* is a subtype of *C*. -* Any class, interface, or trait, having a public instance method `__toString` taking no arguments and returning string, is a subtype of `Stringish`. -* A class type is a subtype of all its direct and indirect base-class types. -* A class type is a subtype of all the interfaces it and its direct and indirect base-class types implement. -* An interface type is a subtype of all its direct and indirect base interfaces. -* A shape type *S2* whose field set is a superset of that in shape type *S1*, is a subtype of *S1*. -* Although [`noreturn`](../built-in-types/noreturn.md) is not a type, per se, it is regarded as a subtype of all other types, and a supertype of none. diff --git a/guides/hack/10-types/85-type-refinement.md b/guides/hack/10-types/85-type-refinement.md deleted file mode 100644 index c591b641e..000000000 --- a/guides/hack/10-types/85-type-refinement.md +++ /dev/null @@ -1,88 +0,0 @@ -A supertype has one or more subtypes, and while any operation permitted on a value of some supertype is also permitted on a value of any of -its subtypes, the reverse is not true. For example, the type `num` is a supertype of `int` and `float`, and while addition and subtraction are -well defined for all three types, bit shifting requires integer operands. As such, a `num` cannot be bit-shifted directly. (Similar situations -occur with `arraykey` and its subtypes `int` and `string`, with nullable types and their subtypes, and with `mixed` and its subtypes.) - -Certain program elements are capable of changing the type of an expression using what is called *type refinement*. Consider the following: - -```Hack -function f1(?int $p): void { - // $x = $p % 3; // rejected; % not defined for ?int - if ($p is int) { // type refinement occurs; $p has type int - $x = $p % 3; // accepted; % defined for int - } -} -``` - -When the function starts execution, `$p` contains `null` or some `int`. However, the type of the expression `$p` is not known to be `int`, so -it is not safe to allow the `%` operator to be applied. When the test `is int` is applied to `$p`, a type refinement occurs in -which the type of the expression `$p` is changed to `int` **for the true path of the `if` statement only**. As such, the `%` operator can -be applied. However, once execution flows out of the `if` statement, the type of the expression `$p` is `?int`. - -Consider the following: - -```Hack -function f2(?int $p): void { - if ($p is null) { // type refinement occurs; $p has type null - // $x = $p % 3; // rejected; % not defined for null - } else { // type refinement occurs; $p has type int - $x = $p % 3; // accepted; % defined for int - } -} -``` - -The first assignment is rejected, not because we don't know `$p`'s type, but because we know its type is not `int`. See how an opposite -type refinement occurs with the `else`. Similarly, we can write the following: - -```Hack -function f3(?int $p): void { - if (!$p is null) { // type refinement occurs; $p has type int - $x = $p % 3; // accepted; % defined for int - } - - if ($p is nonnull) { // type refinement occurs; $p has type int - $x = $p % 3; // accepted; % defined for int - } -} -``` - -Consider the following example that contains multiple selection criteria: - -```Hack -function f4(?num $p): void { - if (($p is int) || ($p is float)) { - // $x = $p**2; // rejected - } -} -``` - -**An implementation is not required to produce the correct type refinement when using multiple criteria directly.** - -The following constructs involve type refinement: -* When used as the controlling expression in an `if`, `while`, or `for` statement, the operators `==`, `!=`, `===`, and `!==` when used -with one operand of `null`, `is`, and simple assignment `=`. [Note that if `$x` is an expression of some nullable type, the -logical test `if ($x)` is equivalent to `if ($x is nonnull)`.] -* The operators `&&`, `||`, and `?:`. -* The intrinsic function `invariant`. -* Some built-in functions like `Shapes::keyExists()` and `\HH\is_any_array()` have special typechecking rules, but others, like `is_string()` and `is_null()` don't. - -Thus far, all the examples use the value of an expression that designates a parameter (which is a local variable). Consider the following -case, which involves a property: - -```Hack -class C { - private ?int $p = 8; // holds an int, but type is ?int - public function m(): void { - if ($this->p is int) { // type refinement occurs; $this->p is int - $x = $this->p << 2; // allowed; type is int - $this->n(); // could involve a permanent type refinement on $p - // $x = $this->p << 2; // disallowed; might no longer be int - } - } - public function n(): void { /* ... */ } -} -``` - -Inside the true path of the `if` statement, even though we know that `$this->p` is an `int` to begin with, once any method in this class -is called, the implementation must assume that method could have caused a type refinement on anything currently in scope. As a result, -the second attempt to left shift is rejected. diff --git a/guides/hack/10-types/86-with-refinement.md b/guides/hack/10-types/86-with-refinement.md deleted file mode 100644 index 264283b90..000000000 --- a/guides/hack/10-types/86-with-refinement.md +++ /dev/null @@ -1,172 +0,0 @@ -Besides `is`-expressions, Hack supports another form of type -refinements, which we refer to as `with`-refinements in this section. -This feature allows more precise typing of classes/interfaces/traits in -a way that specific _type_ or _context_ constant(s) are more specific -(i.e., refined). - -For example, given the definition - -```Hack file:box-with-type+ctx.hack - -interface Box { - abstract const type T; - abstract const ctx C super [defaults]; - public function get()[this::C]: this::T; -} -``` - -one can write a function for which Hack statically guarantees the -returned `Set` is -[valid](https://docs.hhvm.com/hack/reference/class/HH.Set/), i.e., it -only contains integers and/or strings, and not objects of any other type: - -```Hack file:box-with-type+ctx.hack -function unwrap_as_singleton_set( - Box with { type T = Tb } $int_or_string_box -): Set { - return Set { $int_or_string_box->get() }; -} -``` - -Independently, one can constrain context `C` in `Box`. For example, to -work with `Box` subtypes which implement the `get` method in a pure -way (without side effects), `with`-refinements can be used as follows: - -```Hack file:box-with-type+ctx.hack -function unwrap_pure( - Box with { ctx C = []; type T = Tb } $box, -)[]: Tb { - return $box->get(); // OK (type-checker knows `get` must have the empty context list) -} -``` - -A notable use case unlocked by this feature is that a `with`-refinement -can appear in return positions, e.g.: - -```Hack file:box-with-type+ctx.hack -// API -function wrap_number(num $x): Box with { type T = num } { - return new IntBox($x); -} -// implementation details (subject to change): -class IntBox implements Box { - const type T = num; - const ctx C = []; - - public function __construct(private this::T $v) {} - public function get()[]: this::T { return $this->v; } -} -``` - -This is something that is inexpressible with where-clauses. - -Loose (`as`, `super`) bounds on refined constants, such as `type T` -and `context C`, are also supported. For example, you can write -functions _statically_ safe functions such as: - -```Hack file:box-with-type+ctx.hack -function boxed_sum( - Traversable $numeric_boxes -): float { - $sum = 0.0; - foreach ($numeric_boxes as $nb) { - $sum += $nb->get(); - } - return $sum; -} -``` - -and avoid assertions that objects returned by Box’s `get` methods are -numbers (`int` or `float`). - -Finally, you can also use -[generics](https://docs.hhvm.com/hack/generics/introduction) in -bounds; e.g., the above function could have signature - -``` -function boxed_sum_generic( - Traversable $numeric_boxes -): T /* or float */ -``` - -### Sound alternative to `TGeneric::TAbstract` - -This section shows how to improve type safety of existing Hack code -that employs a common pattern in which the intent is to read the type -constant associated with the function- or class-level generic that is -bounded by an abstract class or interface. - -As an example, consider the following definition: - -```Hack file:box-with-type+ctx.hack -interface MeasuredBox extends Box { - abstract const type TQuantity; - public function getQuantity(): this::TQuantity; -} -``` - -Projections off a generic at the function level, such as - -```Hack file:box-with-type+ctx.hack -function weigh_bulk_unsafe(TBox $box): float -where TBox::TQuantity = float { - return $box->getQuantity(); -} -``` - -can and should be translated into: - -```Hack file:box-with-type+ctx.hack -function weigh_bulk(MeasuredBox with { type TQuantity = float } $box): float { - return $box->getQuantity(); -} -``` - -Hack offers a means of _conditionally_ enabling specific methods via -where-clauses. E.g., -to define a method `unloadByQuantity` that is only callable on -subclasses of `Box` where `TQuantity` is an integer (representing -boxes with quantity that is countable exactly), one could write: - -```Hack no-extract -class Warehouse { - public function unloadByCount(TBox $boxes): void - where TBox::TQuantity = int - { /* … */ } -} -``` - -This can be translated to type refinements with a nuance: - -```Hack no-extract -class Warehouse { - public function unloadByCount(TBox $boxes): int - where TBox as Box with { type TQuantity = int } - { /* … */ } -} -``` - -#### **Migration note**: - -This is _stricter_ than the original version with where-clauses -because it is actually sound. Notably, the migrated method, which now -uses type refinements, is _uncallable_ from unmigrated methods that -still use where-clauses. - -```Hack no-extract -function callee_that_now_errs( - Warehouse $warehouse, - TBox $unknown_box, - T $contents, -): void where TBox::T = T { - $warehouse->unloadByCount($unknown_box); // ERROR - /* … */ -} -``` - -Therefore, while migrating code with pattern `TGeneric::TAbstractType` -and where-clauses, you will need to migrate top-down in the callee -graph. This process may also reveal some unsafe usages of the previous -pattern, which is too permissive in theory and could allow reading -abstract type (and thus fail at run-time). -and Hack may chose to do so in the future, too. diff --git a/guides/hack/10-types/88-type-inferencing.md b/guides/hack/10-types/88-type-inferencing.md deleted file mode 100644 index bb394f278..000000000 --- a/guides/hack/10-types/88-type-inferencing.md +++ /dev/null @@ -1,81 +0,0 @@ -While certain kinds of variables must have their type declared explicitly, others can have their type inferred by having the implementation -look at the context in which those variables are used. For example: - -```Hack -function foo(int $i): void { - $v = 100; -} -``` - -As we can see, `$v` is implicitly typed as `int`, and `$i` is explicitly typed. - -In Hack, -* Types **must be declared** for properties and for the parameters and the return type of named functions. -* Types **must be inferred** for local variables, which includes function statics and parameters. -* Types **can be declared or inferred** for constants and for the parameters and return type of unnamed functions. - -The process of type inferencing does not cross function boundaries. - -Here's an example involving a local variable: - -```Hack file:c.hack -function f(): void { - $v = 'acb'; // $v has type string - // ... - $v = true; // $v has type bool - // ... - $v = dict['red' => 10, 'green' => 15]; // $v has type dict - // ... - $v = new C(); // $v has type C -} -``` - -For each assignment, the type of `$v` is inferred from the type of the expression on the right-hand side, as shown in the comments. The type -of function statics is inferred in the same manner, as are function parameters. For example: - -```Hack -function g(int $p1 = -1): void { - // on entry to the function, $p1 has the declared type int - // ... - $p1 = 23.56; // $p1 has type float - // ... -} -``` - -As a parameter, `$p1` is required to have a declared type, in this case, `int`. However, when used as an expression, `$p1`'s type can change, as shown. - -In the case of a class constant, if the type is omitted, it is inferred from the initializer: - -```Hack file:c.hack -class C { - const C1 = 10; // type int inferred from initializer - const string C2 = "red"; // type string declared -} -``` - -Let's consider types in closures: - -```Hack -$doubler = $p ==> $p * 2; -$doubler(3); -``` - -The type of the parameter `$p` and the function's return type have been omitted. These types are inferred each time the anonymous function -is called through the variable `$doubler`. When `3` is passed, as that has type `int`, that is inferred as the type of `$p`. The literal `2` -also has type `int`, so the type of the value returned is the type of `$p * 2`, which is `int`, and that becomes the function's return type. - -We can add partial explicit type information; the following all result in the same behavior: - -```Hack -$doubler = (int $p) ==> $p * 2; -$doubler = ($p = 0) ==> $p * 2; -$doubler = ($p): int ==> $p * 2; -``` - -In the first case, as `$p` has the declared type `int`, and `int * int` gives `int`, the return type is inferred as `int`. In the second -case, as the default value `0` has type `int`, `$p` is inferred to also have that type, and `int * int` gives `int`, so the return type -is inferred as `int`. In the third case, as the return type is declared as `int`, and `$p * 2` must have that type, the type of `$p` is -inferred as `int`, so that must also be the type of the parameter. - -While all three of these cases allow a call such as `$doubler(3)`, none of them allow a call such as `$doubler(4.2)`. So, the fact that -type information can be provided explicitly in these cases doesn't mean it's necessarily a good idea to do so. diff --git a/guides/hack/10-types/types-category.txt b/guides/hack/10-types/types-category.txt deleted file mode 100644 index 2eedef444..000000000 --- a/guides/hack/10-types/types-category.txt +++ /dev/null @@ -1 +0,0 @@ -Types and Generics diff --git a/guides/hack/10-types/types-summary.txt b/guides/hack/10-types/types-summary.txt deleted file mode 100644 index b68d8441c..000000000 --- a/guides/hack/10-types/types-summary.txt +++ /dev/null @@ -1 +0,0 @@ -The type checker. diff --git a/guides/hack/11-built-in-types/01-introduction.md b/guides/hack/11-built-in-types/01-introduction.md deleted file mode 100644 index 01e2dd128..000000000 --- a/guides/hack/11-built-in-types/01-introduction.md +++ /dev/null @@ -1,44 +0,0 @@ -This section covers the different built-in types available in Hack. - -## Primitive Types -Hack has the following primitive types: -[bool](/hack/built-in-types/bool), -[int](/hack/built-in-types/int), -[float](/hack/built-in-types/float), -[string](/hack/built-in-types/string), and -[null](/hack/built-in-types/null). - -## Union Types -Hack supports union types, like: -* [num](/hack/built-in-types/num), where `int` and `float` are subtypes of `num`, and -* [arraykey](/hack/built-in-types/arraykey), where `int` and `string` are subtypes of `arraykey`. - -## The Super Type -Hack's super type is [mixed](/hack/built-in-types/mixed), which represents any value. All other types are subtypes of `mixed`. - -A few things to know when working with `mixed` as a type: -* The opposite of `mixed` is [nothing](/hack/built-in-types/nothing), a special type at the "bottom" of all other types. -* `mixed` is equivalent to `?nonnull`. [nonnull](/hack/built-in-types/nonnull) is a type that represents any value except `null`. - -## Hack Arrays -There are three types of [Hack Arrays](/hack/arrays-and-collections/introduction). They are: -[vec](/hack/arrays-and-collections/hack-arrays#vec), -[keyset](/hack/arrays-and-collections/hack-arrays#keyset), and -[dict](/hack/arrays-and-collections/hack-arrays#dict). - -Though not built-in as types, other alternatives exist in [Hack Collections](/hack/arrays-and-collections/collections). - -## Other Built-In Types -Hack has other built-in types too, like: -[enum](/hack/built-in-types/enum) (with [enum class](/hack/built-in-types/enum-class) and [enum class labels](/hack/built-in-types/enum-class-label)), -[shape](/hack/built-in-types/shapes), and -[tuples](/hack/built-in-types/tuples). - -## Function Return Types -Other types like [noreturn](/hack/built-in-types/noreturn) and [void](/hack/built-in-types/void) are only valid as function return types . - -## Special Types -These last few types are special in their utility and/or versatility: -[classname](/hack/built-in-types/classname), -[dynamic](/hack/built-in-types/dynamic), and -[this](/hack/built-in-types/this). diff --git a/guides/hack/11-built-in-types/04-bool.md b/guides/hack/11-built-in-types/04-bool.md deleted file mode 100644 index 4a5a7468a..000000000 --- a/guides/hack/11-built-in-types/04-bool.md +++ /dev/null @@ -1,27 +0,0 @@ -The Boolean type `bool` can store two distinct values, which correspond to the Boolean values `true` and `false`, respectively. - -Consider the following example: - -```Hack -function is_leap_year(int $yy): bool { - return ((($yy & 3) === 0) && (($yy % 100) !== 0)) || (($yy % 400) === 0); -} - -<<__EntryPoint>> -function main(): void { - $result = is_leap_year(1900); - echo "1900 is ".(($result === true) ? "" : "not ")."a leap year\n"; -} -``` - -When called, function `is_leap_year` takes one argument, of type `int`, and returns a value of type `bool`. (A year is a leap year if -it is a multiple of 4 but not a multiple of 100—for example, 1700, 1800, and 1900 were *not* leap years—or it's a multiple of 400. -Some redundant grouping parentheses have been added to aid readability.) - -The equality operators `===` and `!==`, and the logical operators `&&` and `||`, all produce `bool` results, with the ultimate result of the -large `bool` expression being returned from the function. - -As `is_leap_year` is explicitly typed to return a `bool`, the local variable `$result` is inferred as having type `bool`. (Unlike function -parameters such as `$yy`, or a function return, a local variable *cannot* have an explicit type.) - -The value of `$result` is compared to the `bool` literal `true`, and the `bool` result is used as the controlling expression of the `?:` operator. diff --git a/guides/hack/11-built-in-types/07-int.md b/guides/hack/11-built-in-types/07-int.md deleted file mode 100644 index ee7840f41..000000000 --- a/guides/hack/11-built-in-types/07-int.md +++ /dev/null @@ -1,33 +0,0 @@ -The integer type `int` is signed and uses twos-complement representation for negative values. At least 64 bits are used, so the range of values that -can be stored is at least [-9223372036854775808, 9223372036854775807]. - -Namespace HH\Lib\Math contains the following integer-related constants: `INT64_MAX`, `INT64_MIN`, `INT32_MAX`, `INT32_MIN`, `INT16_MAX`, `INT16_MIN`, -and `UINT32_MAX`. - -Refer to your compiler's documentation to find the behavior when the largest `int` value is incremented, the smallest value is decremented, and the -unary minus is applied to the smallest value. - -Consider the following example: - -```Hack -function is_leap_year(int $yy): bool { - return ((($yy & 3) === 0) && (($yy % 100) !== 0)) || (($yy % 400) === 0); -} - -<<__EntryPoint>> -function main(): void { - $year = 2001; - $result = is_leap_year($year); - echo "$year is ".(($result === true) ? "" : "not ")."a leap year\n"; -} -``` - -When called, function `is_leap_year` takes one argument, of type `int`, and returns a value of type `bool`. (A year is a leap year if it is a -multiple of 4 but not a multiple of 100—for example, 1700, 1800, and 1900 were *not* leap years—or it's a multiple of 400. Some redundant -grouping parentheses have been added to aid readability.) - -The bitwise AND operator, `&`, and the remainder operator, `%`, require operands of type `int`. - -Like `3`, `0`, `100`, and `400`, `2001` is an `int` literal, so the local variable `$year` is inferred as having type `int`. (Unlike function -parameters such as `$yy`, or a function return, a local variable *cannot* have an explicit type.) Then when `$year` is passed to `is_leap_year`, -the compiler sees that an `int` was passed and an `int` was expected, so the call is well-formed. diff --git a/guides/hack/11-built-in-types/10-float.md b/guides/hack/11-built-in-types/10-float.md deleted file mode 100644 index 2250e6f19..000000000 --- a/guides/hack/11-built-in-types/10-float.md +++ /dev/null @@ -1,26 +0,0 @@ -The floating-point type, `float`, allows the use of real numbers. It supports at least the range and precision of IEEE 754 64-bit double-precision -representation, and includes the special values minus infinity, plus infinity, and Not-a-Number (NaN). Using predefined constant names, those -values are written as `-INF`, `INF`, and `NAN`, respectively. - -The library functions `is_finite`, `is_infinite`, and `is_nan` indicate if a given floating-point value is finite, infinite, or a NaN, respectively. - -Consider the following example: - -```Hack -function average_float(float $p1, float $p2): float { - return ($p1 + $p2) / 2.0; -} - -<<__EntryPoint>> -function main(): void { - $val = 3e6; - $result = average_float($val, 5.2E-2); - echo "\$result is ".(string)$result."\n"; -} -``` - -When called, function `average_float` takes two arguments, of type `float`, and returns a value of type `float`. - -The literals `2.0`, `3e6`, and `5.2E-2` have type `float`, so the local variable `$val` is inferred as having type `float`. (Unlike function parameters -such as `$p1` and `$p2`, or a function return, a local variable *cannot* have an explicit type.) Then when `$val` and `5.2E-2` are passed to -`average_float`, the compiler sees that two `float`s were passed and two `float`s were expected, so the call is well-formed. diff --git a/guides/hack/11-built-in-types/13-num.md b/guides/hack/11-built-in-types/13-num.md deleted file mode 100644 index 44dc917b4..000000000 --- a/guides/hack/11-built-in-types/13-num.md +++ /dev/null @@ -1,39 +0,0 @@ -The type `num` can represent any `int` or `float` value. This type can be useful when specifying the interface to a function. Consider the -following function declarations from the math library: - -```Hack no-extract -function sqrt(num $arg): float; -function log(num $arg, ?num $base = null): float; -function abs(T $number): T; -function mean(Container $numbers): ?float; -``` - -The square-root function `sqrt` takes a `num` and returns a `float`. The log-to-any-base function `log` takes a `num` and a nullable-of-`num` -and returns a `float`. The generic absolute-value function `abs` has one type parameter, `T`, which is constrained to having type `num` or a -subtype of `num`. `abs` takes an argument of type `T` and returns a value of the same type. The arithmetic-mean function `mean` takes a generic -type `Container`-of-type-`num` and returns a nullable-of-`float`. - -Consider the following example: - -```Hack -class Point { - private float $x; - private float $y; - public function __construct(num $x = 0, num $y = 0) { - $this->x = (float)$x; - $this->y = (float)$y; - } - public function move(num $x = 0, num $y = 0): void { - $this->x = (float)$x; - $this->y = (float)$y; - } - // ... -} -``` - -Internally, class `Point` stores the x- and y-coordinates as `float`s, but, for convenience, it allows any combination of `int`s and `float`s -to be passed to its constructor and method `move`. - -When given a `num` value, to find out what type of value that `num` actually contains, use the `is` operator. - -See the discussion of [type refinement](../types/type-refinement.md). diff --git a/guides/hack/11-built-in-types/16-string.md b/guides/hack/11-built-in-types/16-string.md deleted file mode 100644 index 1095f3517..000000000 --- a/guides/hack/11-built-in-types/16-string.md +++ /dev/null @@ -1,118 +0,0 @@ -A `string` is a sequence of *bytes* - they are not required to be valid characters in any particular encoding, -for example, they may contain null bytes, or invalid UTF-8 sequences. - -# Basic operations - -Concatenation and byte indexing are built-in operations; for example: - -- `"foo"."bar"` results in `"foobar"` -- `"abc"[1]` is `"b"` -- if the source code is UTF-8, `"a😀c"[1]` is byte `0xf0`, the first of the 4 bytes compromising the "😀" emoji in UTF-8 - -Other operations are supported by the `Str\` namespace in the [Hack Standard Library](/hsl/reference/), such as: - -- `Str\length("foo")` is 3 -- `Str\length("foo\0")` is 4 -- `Str\length("a😀c")` is 6 -- `Str\join(vec['foo', 'bar', 'baz'], '!')` is `"foo!bar!baz"` - -# Converting to numbers - -Use `Str\to_int()` to convert strings to integers; this will raise errors if the input contains additional data, such as `.0` or other trailing characters. - -`(int)` and `(float)` are more permissive, but have undefined behavior for inputs containing similar trailing data. - -# Bytes vs characters - -Functions in the `Str\` namespace with an `_l` suffix such as `Str\length_l()` take a `Locale\Locale` object -as the first parameter, which represents the language, region/country, and encoding (e.g. `en_US.UTF-8`); if a -multibyte encoding such as UTF-8 is specified, the `_l()` functions operate on characters instead of bytes. For -example: - -- `Str\length("a😀c")` is 6 -- `Str\length_l(Locale\bytes(), "a😀c")` is 6 -- `Str\length_l(Locale\create("en_US.UTF-8"), "a😀c")` is 3 -- `Str\slice("a😀c", 2)` is `"a\xf0"` (2 bytes) -- `Str\slice_l(Locale\create("en_US.UTF-8"), "a😀c", 2)` is `"a😀"` (5 bytes) - -In some encodings, the same character can be represented in multiple different ways, with multiple byte sequences; -the `_l` functions will treat them as equivalent. For example, the letter `é` can be represented by either: - -- `"\u{00e9}"`, or "\xc3\xa9" ("LATIN SMALL LETTER E ACUTE") -- `"\u{0065}\u{0301}"`, or `\x65\xcc\x81" ("LATIN SMALL LETTER E", followed by "COMBINING ACUTE ACCENT") - -This means that various comparison functions may report strings as equivalent, despite containing different -byte sequences - so if the result of a character-based operation is used for another function, that function -should also be character-based: - -```Hack -use namespace HH\Lib\{Locale,Str}; - -<<__EntryPoint>> -function main(): void { - $haystack = "abc\u{00e9}"; // ends with UTF-8 "LATIN SMALL LETTER E ACUTE" - $needle = "\u{0065}\u{0301}"; // "LATIN SMALL LETTER E", "COMBINING ACUTE ACCENT" - $locale = Locale\create("en_US.UTF-8"); - \var_dump(dict[ - 'Byte test' => Str\ends_with($haystack, $needle), // false - 'Character test' => Str\ends_with_l($locale, $haystack, $needle), // true - 'Strip byte suffix' => Str\strip_suffix($haystack, $needle), // no change - 'Strip character suffix' => Str\strip_suffix_l($locale, $haystack, $needle), // removed - ]); -} -``` - -# Default encoding - -If a locale is specified without an encoding (e.g. `en_US`, compared to `en_US.UTF-8` or `en_US.ISO8859-1`), the system behavior will be followed. For example: -- on most Linux systems, `en_US` uses a single-byte-per-character-encoding -- on MacOS, `en_US` uses UTF-8 - -# The `Locale\bytes()` locale - -This locale is similar to the constant `"C"` or `"en_US_POSIX"` locale in other libraries and environments; we refer to it as the `bytes` locale to more clearly distinguish between this constant locale and the variable "active libc locale", and because the behavior is slightly different than libc both for performance, and to accommodate arbitrary byte sequences; for example, `Str\length("a\0b")` is 3, however, the libc `strlen` function returns 1 for the same input. - -While operations such as string formatting, uppercase, and lowercase are defined for this locale, they should -only be used when localization is not a concern, for example when the output is intended to be machine-readable -instead of human-readable, such as when generating code. - -# Functions without a locale parameter - -In HHVM 4.130 and above, the bytes locale is the default locale used by the `Str\` functions that do not take an explicit locale - that is, `Str\foo($bar)` is equivalent to `Str\foo_l(Locale\bytes(), $bar)`. In prior versions, the active native/libc locale would be used instead; `Str\foo_l(Locale\get_native(), $bar)` can be used to late the prior behavior. - -This behavior was changed as: -- functions such as `Str\format()` were frequently used to to generate machine-readable strings, leading to subtle - bugs when locale was changed. For example, `Str\format('%.2f', 1.23)` could return either '1.23' or '1,23'. -- functions still operated on bytes rather than characters, even with `LC_CTYPE` was set to `UTF-8`. -- users expect functions such as `Str\format()` and `Str\uppercase()` to be pure, however they can not be when - they depend on the current locale, which is effectively a global variable. - -# Recommendations - -- use the non-`_l` variants of functions when generating strings intended for machines to read. -- use the non-`_l` variants when looking for searching for or operating on specific byte sequences. -- avoid using `setlocale()` or `Locale\set_native()`; instead, store/pass a `Locale\Locale` object for the - viewer in a similar way to how you store/pass other information about the viewer, such as their ID. -- prefer `Locale\set_native()` over `setlocale()`. -- if setting a locale, always explicitly specify an encoding, unless you are matching the behavior of other local executables or native libraries -- if either is necessary, restore the default locale with `Locale\set_native(Locale\bytes())`; while this can be - functionally equivalent to various other locales (e.g. `"en_US"` or `"C"`), HHVM contains optimizations - specifically for the `Locale\bytes()` locale. - -`setlocale()` and `Locale\set_native()` affect many C libraries and extension; in web requests, this can lead -to error messages in logs being translated to the viewer rather than the log reader, though for CLI programs, this -behavior can be desirable. - -# Supported encodings - -HHVM currently supports UTF-8, and single-byte encodings that are supported by the platform libc. - -Other encodings may be supported in the future, however `Locale\set_native()` is likely to be restricted to -the current locales; for example, UTF-16 can not be supported by `Locale\set_native()`, as UTF-16 strings can -contain null bytes. - -# Working with `Regex\` -Functions in the `Regex\` namespace operate on bytes. If the string being inspected is UTF-8, use a pattern with the `u` flag. Failing to do so may result in one multi-byte character being interpreted as multiple characters. For example: - -- `Regex\replace("\u{1f600}", re"/./", 'Char')` is `CharCharCharChar` -- `Regex\replace("\u{1f600}", re"/./u", 'Char')` is `Char` diff --git a/guides/hack/11-built-in-types/19-void.md b/guides/hack/11-built-in-types/19-void.md deleted file mode 100644 index 437a0d82a..000000000 --- a/guides/hack/11-built-in-types/19-void.md +++ /dev/null @@ -1,42 +0,0 @@ -The type `void` indicates the absence of a value. It is used to declare that a function does *not* return any value. As such, a void function -can contain one or more `return` statements, provided none of them return a value. Consider the following example: - -```Hack -function draw_line(Point $p1, Point $p2): void { /* ... */ } - -class Point { - private float $x; - private float $y; - public function __construct(num $x = 0, num $y = 0) { - $this->x = (float)$x; - $this->y = (float)$y; - } - public function move(num $x = 0, num $y = 0): void { - $this->x = (float)$x; - $this->y = (float)$y; - } - // ... -} - -<<__EntryPoint>> -function main(): void { - draw_line(new Point(1.2, 3.3), new Point(6.2, -4.5)); -} -``` - -As is often the case, a function like `draw_line` causes something to happen but does not need to return a result or success code, so its return -type is `void`. Likewise, for method `move`. - -Here's another example, involving a generic stack type: - -```Hack -class Stack { - // ... - public function push(T $value): void { /* ... */ } - // ... -} -``` - -The act of pushing a value on a stack does not require any value to be returned. However, method `push` could fail due to stack overflow; however, -as that is an extreme situation, the method likely would throw an exception that is only handled when the condition occurs rather than returning a -success/failure code that would have to be checked on every call. diff --git a/guides/hack/11-built-in-types/25-tuples.md b/guides/hack/11-built-in-types/25-tuples.md deleted file mode 100644 index c6b9da16d..000000000 --- a/guides/hack/11-built-in-types/25-tuples.md +++ /dev/null @@ -1,57 +0,0 @@ -Suppose we wish to have a function return multiple values. We can do that by using a tuple containing two or more elements. A -tuple is an *ordered* set of one or more elements, which can have different types. The number of elements in a particular tuple is fixed -when that tuple is created. After a tuple has been created, no elements can be added or removed. A tuple is a mutable value type. -This means that when you hand a tuple to a function or assign it to a local variable a logical copy is made. -You can change the values at a given index by assigning using the subscript notation. This will change the type -of the value stored in the variable accordingly when needed. However you can not assign to an index that -did not exist when the tuple was created. - -Consider the case in which we want to have a pair of related values, one a string, the other an integer. For example: - -```Hack no-extract -$v = tuple("apples", 25); -function process_pair((string, int) $pair): void { ... } -function get_next_pair(): (string, int) { ... } -``` - -A tuple value has the form of a comma-separated list of values delimited with parentheses and preceded by `tuple`, as in `tuple("apples", 25)` -above. As we can quickly deduce, that tuple has type *tuple of two elements, in the order `string` and `int`*, and that is the type of the -argument expected by function `process_pair`, and returned by function `get_next_pair`. - -Note carefully that the tuple values `tuple("apples", 25)` and `tuple(25, "apples")` have *different and incompatible* types! Of course, -`tuple("apples", 25)` and `tuple("peaches", 33)` have the same type. [Indeed, `tuple("horses", 3)` has the same type as well; there is nothing -fruit- or animal-specific about this tuple type.] - -A tuple can be indexed with the subscript operator (`[]`); however, the index value must be an integer constant whose value is in the range of -element indices. The index of the first element is zero, with subsequent elements having index values one more than their predecessor: - -```Hack -$t = tuple(10, true, 2.3); -echo "\$t[2] = >" . (string)$t[2] . "<"; // outputs "$t[2] = >2.3<" -$t[0] = 99; // change 10 to 99 -``` - -Here is a more exotic example of a type involve a tuple: - -```Hack no-extract -?(int, (string, float)) -``` - -This declares a nullable type for a tuple containing an `int` and a tuple, which in turn, contains a `string` and a `float`. - -For non-trivial tuple types, it can be cumbersome to write out the complete type. Fortunately, Hack provides type-aliasing via -`newtype` (and `type`). For example: - -```Hack -newtype Point = (float, float); - -function create_point(float $x, float $y): Point { - return tuple($x, $y); -} - -function distance(Point $p1, Point $p2): float { - $dx = $p1[0] - $p2[0]; - $dy = $p1[1] - $p2[1]; - return sqrt($dx * $dx + $dy * $dy); -} -``` diff --git a/guides/hack/11-built-in-types/28-shape.md b/guides/hack/11-built-in-types/28-shape.md deleted file mode 100644 index 71449e612..000000000 --- a/guides/hack/11-built-in-types/28-shape.md +++ /dev/null @@ -1,239 +0,0 @@ -A shape is a lightweight type with named fields. It's similar to -structs or records in other programming languages. - -```Hack -$my_point = shape('x' => -3, 'y' => 6, 'visible' => true); -``` - -## Shape Values - -A shape is created with the `shape` keyword, with a series of field -names and values. - -``` Hack -$server = shape('name' => 'db-01', 'age' => 365); - -$empty = shape(); -``` - -Shape fields are accessed with array indexing syntax, similar to -`dict`. Note that field names must be string literals. - -```Hack no-extract -// OK. -$n = $server['name']; - -// Not OK (type error). -$field = 'name'; -$n = $server[$field]; -``` - -Shapes are copy-on-write. - -``` Hack -$s1 = shape('name' => 'db-01', 'age' => 365); -$s2 = $s1; - -$s2['age'] = 42; -// $s1['age'] is still 365. -``` - -A shape can be constructed incrementally. The type checker will infer -a different type after each assignment. - -``` Hack -// $s has type shape(). -$s = shape(); - -// $s now has type shape('name' => string). -$s['name'] = 'db-01'; - -// $s now has type shape('name' => string, 'age' => int). -$s['age'] = 365; -``` - -Shapes have the same runtime representation as `darray`, although this -is considered an implementation detail. This representation means that -shape order is observable. - -``` Hack -$s1 = shape('name' => 'db-01', 'age' => 365); -$s2 = shape('age' => 365, 'name' => 'db-01'); - -$s1 === $s2; // false -``` - -## Shape Types - -Shape type declarations use a similar syntax to values. - -``` Hack -function takes_server(shape('name' => string, 'age' => int) $s): void { - // ... -} -``` - -Unlike classes, declaring a shape type is optional. You can start -using shapes without defining any types. - -``` Hack no-extract -function uses_shape_internally(): void { - $server = shape('name' => 'db-01', 'age' => 365); - print_server_name($server['name']); - print_server_age($server['age']); -} -``` - -For large shapes, it is often convenient to define a type alias. This is useful because it promotes code re-use and when the same type is being used, and provides a descriptive name for the type. - -```Hack -type Server = shape('name' => string, 'age' => int); - -// Equivalent to the previous takes_server function. -function takes_server(Server $s): void { - // ... - return; -} -``` - -Any shape value that has all of the required fields (and no undefined fields - unless the shape permits them) is considered a value of type `Server`; the type is not specified when creating the value. - -```Hack error -function takes_server(Server $s): void { - return; -} - -function test(): void { - $args = shape('name' => 'hello', 'age' => 10); - takes_server($args); // no error - - $args = shape('name' => null, 'age' => 10); - takes_server($args); // type error: field type mismatch - - $args = shape('name' => 'hello', 'age' => 10, 'error' => true); - takes_server($args); // type error: extra field -} -``` - -Since shapes are copy-on-write, updates can change the type. - -```Hack -// $s has type shape('name' => string, 'age' => int). -$s = shape('name' => 'db-01', 'age' => 365); - -// $s now has type shape('name' => string, 'age' => string). -$s['age'] = '1 year'; -``` - -**Two shapes have the same type if they have the same fields and -types**. This makes shapes convenient to create, but can cause -surprises. This is called 'structural subtyping'. - -```Hack -type Server = shape('name' => string, 'age' => int); -type Pet = shape('name' => string, 'age' => int); - -function takes_server(Server $_): void {} - -function takes_pet(Pet $p): void { - // No error here. - takes_server($p); -} -``` - -## Open and Closed Shapes - -Normally, the type checker will enforce that you provide exactly the -fields specified. This is called a 'closed shape'. - -```Hack error -function takes_named(shape('name' => string) $_): void {} - -function demo(): void { - takes_named(shape('name' => 'db-01', 'age' => 365)); // type error -} -``` - -Shape types may include `...` to indicate that additional fields are -permitted. This is called an 'open shape'. - -```Hack -function takes_named(shape('name' => string, ...) $_): void {} - -// OK. -function demo(): void { - takes_named(shape('name' => 'db-01', 'age' => 365)); -} -``` - -To access the additional fields in an open shape, you can use -`Shapes::idx`. - -```Hack -function takes_named(shape('name' => string, ...) $n): void { - // The value in the shape, or null if field is absent. - $nullable_age = Shapes::idx($n, 'age'); - - // The value in the shape, or 0 if field is absent. - $age_with_default = Shapes::idx($n, 'age', 0); -} - -``` - -## Optional Fields - -A shape type may declare fields as optional. - -```Hack -function takes_server(shape('name' => string, ?'age' => int) $s): void { - $age = Shapes::idx($s, 'age', 0); -} - -function example_usage(): void { - takes_server(shape('name' => 'db-01', 'age' => 365)); - takes_server(shape('name' => 'db-02')); -} -``` - -`takes_server` takes a closed shape, so any additional fields will be -an error. The `age` field is optional though. - -Optional fields can be tricky to reason about, so your code may be -clearer with nullable fields or open shapes. - -```Hack -function takes_server2(shape('name' => string, 'age' => ?int) $s): void { - $age = $s['age'] ?? 0; -} - -function takes_server3(shape('name' => string, ...) $s): void { - $age = Shapes::idx($s, 'age', 0) as int; -} -``` - -## Type Enforcement - -HHVM will check that arguments are shapes, but it will not deeply -check fields. - -```Hack error -// This produces a typehint violation at runtime. -function returns_int_instead(): shape('x' => int) { - return 1; -} - -// No runtime error. -function returns_wrong_shape(): shape('x' => int) { - return shape('y' => 1); -} -``` - -## Converting Shapes - -Converting shapes to containers is strongly discouraged, however is necessary, this can be done with `Shapes::toDict()`. - -On older versions of HHVM, Shapes can also be converted to darrays with `Shapes::toArray()`; this should be avoided in new code, as darrays are currently an alias for the dict type, and will be removed from the language. - -## Limitations - -Some limitations of shapes include only being able to index it using literal expressions (you can't index on a shape using a variable or dynamically formed string, for example), or to provide run-time typechecking, because it is actually just a `dict` at runtime (or `darray` on older versions). diff --git a/guides/hack/11-built-in-types/31-arraykey.md b/guides/hack/11-built-in-types/31-arraykey.md deleted file mode 100644 index 70da7ac79..000000000 --- a/guides/hack/11-built-in-types/31-arraykey.md +++ /dev/null @@ -1,17 +0,0 @@ -The type `arraykey` can represent any integer or string value. For example: - -```Hack -function process_key(arraykey $p): void { - if ($p is int) { - // we have an int - } else { - // we have a string - } -} -``` - -Values of array or collection type can be indexed by `int` or `string`. Suppose, for example, an operation was performed on an array -to extract the keys, but we didn't know the type of the key. As such, we are left with using `mixed` (which is way too loose) or doing -some sort of duplicative code. Instead, we can use `arraykey`. - -See the discussion of [type refinement](../types/type-refinement.md). diff --git a/guides/hack/11-built-in-types/34-enum.md b/guides/hack/11-built-in-types/34-enum.md deleted file mode 100644 index 2addc9ee2..000000000 --- a/guides/hack/11-built-in-types/34-enum.md +++ /dev/null @@ -1,233 +0,0 @@ -Use an enum (enumerated type) to create a set of named, constant, immutable values. - -In Hack, enums are limited to `int` or `string` (as an [`Arraykey`](/hack/built-in-types/arraykey)), or other `enum` values. - -## Quickstart -To access an enum's value, use its full name, as in `Colors::Blue` or `Permission::Read`. - -```Hack -enum Colors: int { - Red = 3; - Green = 5; - Blue = 10; - Default = 3; // duplicate value is okay -} -``` - -```Hack -enum Permission: string { - Read = 'R'; - Write = 'W'; - Execute = 'E'; - Delete = 'D'; -} -``` - -Additionally, by using the [`as`](/hack/expressions-and-operators/type-assertions#enforcing-types-with-as-and-as) operator to enforce type, you can initialize your enum with static expressions that reference other enum values. - -```Hack -enum BitFlags: int as int { - F1 = 1; // value 1 - F2 = BitFlags::F1 << 1; // value 2 - F3 = BitFlags::F2 << 1; // value 4 - F4 = 4 + 3; // value 7 -} -``` - -## Full Example -With an enum, we can create a placement-direction system with names like `Top`, `Bottom`, `Left`, `Right`, and `Center`, then direct output accordingly to write text to the top, bottom, left, right, or center of a window. - -```Hack -enum Position: int { - Top = 0; - Bottom = 1; - Left = 2; - Right = 3; - Center = 4; -} - -function writeText(string $text, Position $pos): void { - switch ($pos) { - case Position::Top: - // ... - break; - case Position::Center: - // ... - break; - case Position::Right: - // ... - break; - case Position::Left: - // ... - break; - case Position::Bottom: - // ... - break; - } -} - -<<__EntryPoint>> -function main(): void { - writeText("Hello", Position::Bottom); - writeText("Today", Position::Left); -} -``` - -## Library Methods -All enums implement these public static methods. - -### `getValues()` / `getNames()` -Returns a `dict` of enum constant values and their names. - -* `getValues()` returns a `dict` where the keys are the enum names and the values are the enum constant values. - * In the example below, the keys/values would be: `"Top" => 0`, `"Bottom" => 1`, etc. -* `getNames()` returns a `dict`, but is flipped: the keys are the enum constant values and the values are the enum's named constants. - * Following the same example, the keys/values would be: `0 => "Top"`, `1 => "Bottom"`, etc. - * Because a `dict` *can not* contain duplicate keys, when you call `getNames()`—the static method that returns a `dict` and flips an enum's constant values *to* keys—there is a possiblity of creating a `dict` with duplicates, resulting in an `HH\InvariantException`. In this situation, one safe option for discarding duplicates (and keeping the most recent of every duplicate) is `Dict\flip`. - -```Hack -enum Position: int { - Top = 0; - Bottom = 1; - Left = 2; - Right = 3; - Center = 4; -} - -<<__EntryPoint>> -function main(): void { - $names = Position::getNames(); - echo " Position::getNames() ---\n"; - foreach ($names as $key => $value) { - echo "\tkey >$key< has value >$value<\n"; - } - - $values = Position::getValues(); - echo "Position::getValues() ---\n"; - foreach ($values as $key => $value) { - echo "\tkey >$key< has value >$value<\n"; - } - - Dict\flip(Position::getValues()); // safe flip of values as keys -} -``` - -### `assert()` / `coerce()` -`assert($value)` checks if a value exists in an enum, and if it does, returns the value; if the value does not exist, throws an `UnexpectedValueException`. - -`coerce($value)` checks if a value exists in an enum, and if it does, returns the value; if the value does not exist, returns `null`. - -```Hack -enum Bits: int { - B1 = 2; - B2 = 4; - B3 = 8; - } - -<<__EntryPoint>> -function main(): void { - Bits::assert(2); // 2 - Bits::assert(16); // UnexpectedValueException - - Bits::coerce(2); // 2 - Bits::coerce(2.0); // null - Bits::coerce(16); // null -} -``` - -**Note:** Both library methods will, when no exact match is found, attempt to do a cast to the other `arraykey` type. If the cast is not reversible / lossless, or the resulting value is still not a member of the enum after the cast, the failure result occurs, where a failure for assert is throwing an `UnexpectedValueException` and a failure for `coerce` is returning null. - -### `assertAll()` -`assertAll($traversable)` calls `assert($value)` on every element of the traversable (e.g. [Hack Arrays](/hack/arrays-and-collections/hack-arrays)); if at least one value does not exist, throws an `UnexpectedValueException`. - - -```Hack -enum Bits: int { - B1 = 2; - B2 = 4; - B3 = 8; - } - -<<__EntryPoint>> -function main(): void { - $all_values = vec[2, 4, 8]; - $some_values = vec[2, 4, 16]; - $no_values = vec[32, 64, 128]; - - Bits::assertAll($all_values); // vec[2, 4, 8] - Bits::assertAll($some_values); // throws on 16, UnexpectedValueException - Bits::assertAll($no_values); // throws on 32, UnexpectedValueException -} -``` - -### `isValid()` -`isValid($value)` checks if a value exists in an enum, and if it does, returns `true`; if the value does not exist, it returns `false`. - -```Hack -enum Bits: int { - B1 = 2; - B2 = 4; - B3 = 8; - } - -<<__EntryPoint>> -function main(): void { - \var_dump(Bits::isValid(2)); - \var_dump(Bits::isValid(2.0)); - \var_dump(Bits::isValid("2.0")); - \var_dump(Bits::isValid(8)); -} -``` - -## `is` / `as` -The operators [`is`](/hack/expressions-and-operators/type-assertions#checking-types-with-is) and [`as`/`?as`](/hack/expressions-and-operators/type-assertions#enforcing-types-with-as-and-as) behave similarly, but not exactly, to `isValid()` (similar to `is`) and `assert()`/`coerce()` (similar to `as`/`?as`). - -For `is`/`as`/`?as` refinement, the operators validate that a value is a part of a given enum. **Caution:** These operators may perform implicit int/string coercion of enum values to preserve compatibility with `isValid()`. - -```Hack -enum MyEnum: int { - FOO = 1; -} - -<<__EntryPoint>> -function main(): void { -1 is MyEnum; // true -1 as MyEnum; // 1 - -42 is MyEnum; // false -42 as MyEnum; // TypeAssertionException - -'foo' is MyEnum; // false -'foo' as MyEnum; // TypeAssertionException - -'1' is MyEnum; // CAUTION - true -'1' as MyEnum; // CAUTION - '1' -} -``` - -## Enum Inclusion -You can define an enum to include all of the constants of another enum with the `use` keyword. - -In the following example, `enum` `F` contains all of the constants of `enum` `E1` and `enum` `E2`. - -```Hack -enum E1: int as int { - A = 0; -} -enum E2: int as int { - B = 1; -} -enum F: int { - // same-line alternative: use E1, E2; - use E1; - use E2; - C = 2; -} -``` - -Enum Inclusion is subject to a few restrictions: -* **Order**: All `use` statements must precede enum constant declarations. -* **Uniqueness**: All constant names across all enums must be unique. -* **Subtype Relation**: In the above example, `E1` and `E2` are not considered subtypes of `F`; that is, the Hack Typechecker rejects passing `E1::A` or `E2::B` to a function that expects an argument of type `F`. - -**Note:** Library functions like `getNames()` and `getValues()` perform a post-order traversal of all included enums. diff --git a/guides/hack/11-built-in-types/35-enum-class.md b/guides/hack/11-built-in-types/35-enum-class.md deleted file mode 100644 index 3c0eb9ba1..000000000 --- a/guides/hack/11-built-in-types/35-enum-class.md +++ /dev/null @@ -1,385 +0,0 @@ -In comparison to [enumerated types (enums)](/hack/built-in-types/enum), enum classes are not restricted to int and string values. - -## Enum types v. Enum class -Built-in enum types limit the base type of an enum to `arraykey` -- an integer or string -- or another enum. - -The base type of an _enum class_ can be any type: they are not required to be constant expressions and objects are valid values. However, with Generics, if an enum has type `T` as a base type, its enum values are bound to values whose type are a subtype of `T`. - -## Declaring a new enum class - -Enum classes are syntactically different from [enum types](/hack/built-in-types/enum), as they require: - -* the `enum class` keyword rather than the `enum` keyword -* that each value is annotated with its precise type: for example, `string` in `string s = ...` - -### Example: Simple declarations - -```Hack -// Enum class where we allow any type -enum class Random: mixed { - int X = 42; - string S = 'foo'; -} - -// Enum class that mimics a normal enum (only allowing ints) -enum class Ints: int { - int A = 0; - int B = 10; -} -``` - -### Example: Interface as a Base Type - -```Hack file:hasname.hack -// Some class definitions to make a more involved example -interface IHasName { - public function name(): string; -} - -class HasName implements IHasName { - public function __construct(private string $name)[] {} - public function name(): string { - return $this->name; - } -} - -class ConstName implements IHasName { - public function name(): string { - return "bar"; - } -} - -// enum class which base type is the IHasName interface: each enum value -// can be any subtype of IHasName, here we see HasName and ConstName -enum class Names: IHasName { - HasName Hello = new HasName('hello'); - HasName World = new HasName('world'); - ConstName Bar = new ConstName(); -} -``` - -## Accessing values - -Once declared, enum values are accessed using the `::` operator: `Names::Hello`, `Names::Bar`, ... - -### Control over enum values - -Using [coeffects](../contexts-and-capabilities/introduction.md), you can have control over which expressions are allowed as enum class constants. - -By default, all enum classes are under the `write_props` context. It is not possible to override this explicitly. - -## Extending an Existing enum class (Inheritance) - -Enum classes can be composed together, as long as they implement the same base type: - -```Hack file:extend.hack -interface IBox {} - -class Box implements IBox { - public function __construct(public T $data)[] {} -} - -enum class Boxes: IBox { - Box Age = new Box(42); - Box Color = new Box('red'); - Box Year = new Box(2021); -} - -function get(\HH\MemberOf> $box): T { - return $box->data; -} - -function test0(): void { - get(Boxes::Age); // ok, of type int, returns 42 - get(Boxes::Color); // ok, of type string, returns 'red' - get(Boxes::Year); // ok, of type int, returns 2021 -} -``` - -```Hack file:extend.hack -enum class EBase: IBox { - Box Age = new Box(42); -} - -enum class EExtend: IBox extends EBase { - Box Color = new Box('red'); -} -``` - -In this example, `EExtend` inherits `Age` from `EBase`, which means that `EExtend::Age` is defined. - -As with ordinary class extension, using the `extends` keyword will create a subtype relation between the enums: `EExtend <: EBase`. -Enum classes support multiple inheritance as long as there is no ambiguity in value names, and that each enum class uses the same base type: - -```Hack file:extend.hack -enum class E: IBox { - Box Age = new Box(42); -} - -enum class F: IBox { - Box Name = new Box('foo'); -} - -enum class X: IBox extends E, F { } // ok, no ambiguity - - -enum class E0: IBox extends E { - Box Color = new Box(0); -} - -enum class E1: IBox extends E { - Box Color = new Box('red'); -} - -// enum class Y: IBox extends E0, E1 { } -// type error, Y::Color is declared twice, in E0 and in E1 -// only he name is use for ambiguity -``` - -### Diamond shape scenarios -Enum classes support diamond shaped inheritance as long as there is no ambiguity, like in: - -```Hack file:extend.hack -enum class DiamondBase: IBox { - Box Age = new Box(42); -} - -enum class D1: IBox extends DiamondBase { - Box Name1 = new Box('foo'); -} - -enum class D2: IBox extends DiamondBase { - Box Name2 = new Box('bar'); -} - -enum class D3: IBox extends D1, D2 {} - -<<__EntryPoint>> -function main(): void { - echo D3::Age->data; -} -``` - -Here there is no ambiguity: the constant `Age` is inherited from `DiamondBase`, and only from there. -The `main` function will echo `42` as expected. - -If either `D1`, `D2` or `D3` tries to define a constant named `Age`, there will be an error. - -### Control over inheritance - -Though the `final` keyword is not supported, Enum classes support the [`__Sealed`](../attributes/predefined-attributes#__sealed) attribute. Using `__Sealed`, you can specify which other enum classes, if any, are allowed to extend from your enum class. - - -## Abstract enum classes - -Like regular classes, enum classes come in two flavors: concrete and abstract. An abstract enum class can declare abstract members (constants), where only their type and name are provided. - -```Hack file:hasname.hack -// abstract enum class with some abstract members -abstract enum class AbstractNames: IHasName { - abstract HasName Foo; - HasName Bar = new HasName('bar'); -} -``` - -Abstract members do not support default values, and can't be accessed directly. They only map a name to a type. -You must extend your abstract enum class into a concrete one with implementations of all abstract members to -safely access members defined as abstract. - -```Hack file:hasname.hack -enum class ConcreteNames: IHasName extends AbstractNames { - HasName Foo = new HasName('foo'); // one must provide all the abstract members - // Bar is inherited from AbstractNames -} -``` - -All concrete members are inherited, and can't be overriden. - - - -## Defining a Function that expects an enum class - -When defining a function that expects an enum class value (e.g. `Foo::BAR`), you need to define the expected parameter appropriately with `HH\MemberOf` or you will run into errors. - -```Hack error -enum class Foo: string { - string BAR = 'BAZ'; -} - -function do_stuff(Foo $value): void { - var_dump($value); -} - -function main(): void { - do_stuff(Foo::BAR); // expected Foo but got string -} -``` - -However, if we instead define `do_stuff()` as receiving `HH\MemberOf`, then we can use `Foo::Bar` with no issues. - -```Hack -enum class Foo: string { - string BAR = 'BAZ'; -} - -function do_stuff(HH\MemberOf $value): void { - var_dump($value); -} - -function main(): void { - do_stuff(Foo::BAR); // ok -} -``` - -## Accessing enum class types - -**An enum class type is more informative than a traditional built-in enum type.** - -Let's examine `enum E` v. `enum class EC`. - -```Hack -enum E: int { - A = 42; -} -``` - -```Hack -enum class EC: int { - int A = 42; -} -``` - -The built-in enum type of `E::A` is just `E`. All we know is that value `A` is declared within the enum: we know nothing of its underlying type. - -But if we look at the enum class `EC::A` its type is `HH\MemberOf`. We know that it's declared within the enum class `EC`, with type `int`. - -## Declaring type constants in an enum class - -Like normal classes, enum classes can declare type constants. Abstract type -constants are also supported: - -```Hack -interface IGet<+T> { - public function get(): T; -} - -class Box implements IGet { - public function __construct(private T $data)[] {} - public function get(): T { return $this->data; } - public function set(T $data): void { $this->data = $data; } -} - -abstract enum class E : IGet { - abstract const type T; - abstract Box A; - Box B = new Box(42); -} - -enum class F : IGet extends E { - const type T = string; - Box A = new Box('zuck'); -} -``` - -## Full Example: Dependent Dictionary - -First, a couple of general Hack definitions: - -```Hack file:dep_dict.hack -function expect_string(string $str): void { - echo 'expect_string called with: '.$str."\n"; -} - -interface IKey { - public function name(): string; -} - -abstract class Key implements IKey { - public function __construct(private string $name)[] {} - public function name(): string { - return $this->name; - } - public abstract function coerceTo(mixed $data): T; -} - -class IntKey extends Key { - public function coerceTo(mixed $data): int { - return $data as int; - } -} - -class StringKey extends Key { - public function coerceTo(mixed $data): string { - // random logic can be implemented here - $s = $data as string; - // let's make everything in caps - return Str\capitalize($s); - } -} -``` - -Now let’s create the base definitions for our dictionary - -```Hack file:dep_dict.hack -enum class EKeys: IKey { - // here are a default key, but this could be left empty - Key NAME = new StringKey('NAME'); -} - -abstract class DictBase { - // type of the keys, left abstract for now - abstract const type TKeys as EKeys; - // actual data storage - private dict $raw_data = dict[]; - - // generic code written once which enforces type safety - public function get(\HH\MemberOf> $key): ?T { - $name = $key->name(); - $raw_data = idx($this->raw_data, $name); - // key might not be set - if ($raw_data is nonnull) { - $data = $key->coerceTo($raw_data); - return $data; - } - return null; - } - - public function set(\HH\MemberOf> $key, T $data): void { - $name = $key->name(); - $this->raw_data[$name] = $data; - } -} -``` - -Now one just need to provide a set of keys and extends `DictBase`: - -```Hack file:dep_dict.hack -class Foo { /* user code in here */ } - -class MyKeyType extends Key { - public function coerceTo(mixed $data): Foo { - // user code validation - return $data as Foo; - } -} - -enum class MyKeys: IKey extends EKeys { - Key AGE = new IntKey('AGE'); - MyKeyType BLI = new MyKeyType('BLI'); -} - -class MyDict extends DictBase { - const type TKeys = MyKeys; -} -``` - -```Hack file:dep_dict.hack -<<__EntryPoint>> -function main(): void { - $d = new MyDict(); - $d->set(MyKeys::NAME, 'tony'); - $d->set(MyKeys::BLI, new Foo()); - // $d->set(MyKeys::AGE, new Foo()); // type error - expect_string($d->get(MyKeys::NAME) as nonnull); -} -``` diff --git a/guides/hack/11-built-in-types/36-enum-class-label.md b/guides/hack/11-built-in-types/36-enum-class-label.md deleted file mode 100644 index 5fe2ca993..000000000 --- a/guides/hack/11-built-in-types/36-enum-class-label.md +++ /dev/null @@ -1,143 +0,0 @@ -## Values v. Bindings - -With [enum types](/hack/built-in-types/enum) and [enum classes](/hack/built-in-types/enum-class), most of the focus is given to their values. -Expressions like `E::A` denote the value of `A` in `E`, but the fact that `A` was used to access it is lost. - -```Hack -enum E: int { - A = 42; - B = 42; -} - -function f(E $value): void { - switch($value) { - case E::A: echo "A "; break; - case E::B: echo "B "; break; - } - echo $value . "\n"; -} -``` -In this example, both `f(E::A)` and `f(E::B)` will echo `A 42` because `E::A` and `E::B` are effectively the value `42` and nothing more. - -## Enum Class Labels - -Sometimes, the binding that was used to access a value from an enumeration is as important as the value itself. We might want to know that `A` -was used to access `E::A`. Enum types provides a partial solution to this with the `getNames` static method, but it is only -safe to call if all the values of the enumeration are distinct. - -Enum classes provides a way to do this by using the newly introduced *Enum Class Label* expressions. For each value defined in an enum class, a corresponding -label is defined. A label is a handle to access the related value. Think of it as an indirect access. Consider the following example: - -```Hack file:label.hack -// We are using int here for readability but it works for any type -enum class E: int { - int A = 42; - int B = 42; -} -``` - -This enum class defines two constants: -- `E::A` of type `HH\MemberOf` -- `E::B` of type `HH\MemberOf` - -The main addition of labels is a new **opaque** type: `HH\EnumClasslabel`. Let's first recall its full definition: - -```Hack -newtype Label<-TEnumClass, TType> = mixed; -``` - -This type has two generic arguments which are the same as `HH\MemberOf`: -- the first one is the enum class where the label is defined -- the second one is the data type indexed by the label - -As an example, `HH\EnumClass\Label` means that the label is from the enum class `E` and points to a value of type `int`. - -Let us go back to our enum class `E`. Labels add more definitions to the mix: - -- `E#A: HH\EnumClass\Label` is the label to access `E::A` -- `E#B: HH\EnumClass\Label` is the label to access `E::B` -- `E::nameOf` is a static method expecting a label and returning its string representation: `E::nameOf(E#A) === "A"` -- `E::valueOf` is a static method expecting a label and returning its value: `E::valueOf(E#A) === E::A` - -So we can rewrite the earlier example in a more resilient way: - -```Hack file:label.hack -function full_print(\HH\EnumClass\Label $label): void { - echo E::nameOf($label) . " "; - echo E::valueOf($label) . "\n"; -} - -function partial_print(\HH\MemberOf $value): void { - echo $value . "\n"; -} -``` -Now, `full_print(E#A)` will echo `A 42` and `full_print(E#B)` will echo `B 42`. - -## Full v. Short Labels - -We refer to labels like `E#A` as *fully qualified* labels: the programmer wrote the full enum class name. -However there are some situations where Hack can infer the class name; for example, -the previous calls could be written as `full_print(#A)` and `full_print(#B)`, leaving `E` implicit. -This is only allowed when there is enough type information to infer the right enum class name. For example, `$x = #A` is not allowed and will result in a type error. - -## Equality testing - -Enum class labels can be tested for equality using the `===` operator or a switch statement: - -```Hack file:label.hack -function test_eq(\HH\EnumClass\Label $label): void { - if ($label === E#A) { echo "label is A\n"; } - switch ($label) { - case E#A: break; - case E#B: break; - } -} -``` - -Because the runtime doesn’t have all the typing information available, these tests only check the name component of a label. It means that for any two enum classes `E` and `F`, `E#A === F#A` will be true despite being from different enum classes. Also the support type (int in the case of the enum class `E`) is not taken into account either. - -```Hack -class Foo {} - -enum class F: Foo { - Foo A = new Foo(); -} - -// E#A === E#B is false -// E#A === F#A is true -``` - -## Enum class labels and abstract enum classes -Abstract enum classes support labels like any other enum class. The main difference is that an abstract enum class only provides the `nameOf` static method. -Since some of its members may be abstracted away, abstract enum classes do no provide the `valueOf()` or `getValues()` static methods. - -## Known corner cases - -### The `#` character is no longer a single-line comment -This feature relies on the fact that Hack and HHVM no longer consider the character `#` as a single-line comment. Please use `//` for such purpose. - -### Labels and values cannot be exchanged -If a method is expecting a label, one cannot pass in a value, and vice versa: `full_print(E::A)` will result in a type error and so will `partial_print(E#A)`. - -### `MemberOf` is covariant, `Label` is invariant - -Let’s recall the definition of `HH\MemberOf` and `HH\EnumClass\Label` along with some basic definitions: - -```Hack -newtype MemberOf<-TEnumClass, +TType> as TType = TType; -newtype Label<-TEnumClass, TType> = mixed; - -class A {} -class B extends A {} -enum class G: A { - A X = new A(); - B Y = new B(); -} -``` - -Firstly, `HH\MemberOf` has a `as TType` constraint. It means that since `G::X` is of type `HH\MemberOf`, it is also of type `A`. For the same reasons, `G::Y` is of type `HH\MemberOf` and `B`. -Secondly, `HH\MemberOf` is covariant in `TType`. Since `B extends A`, it means that `G::Y` is also of type `HH\MemberOf`. And because of all of that, `G::Y` is also of type `A`. - -Enum class values behave just like the underlying data they are set to. - -On the other hand, `HH\EnumClass\Label` is invariant in `TType`. It means that while `G#Y` is of type `HH\EnumClass\Label`, it is not of type `HH\EnumClass\Label`. Labels are opaque handles to access data; you can think about them as maps from names to types. Their typing has to be more strict, especially if we want to be able to extend this concept to other parts of a class (reflection like access to methods, properties, …). To make sure these possible extensions remain possible, we enforce a stricter typing for labels than for values. diff --git a/guides/hack/11-built-in-types/49-this.md b/guides/hack/11-built-in-types/49-this.md deleted file mode 100644 index 1de52a6a7..000000000 --- a/guides/hack/11-built-in-types/49-this.md +++ /dev/null @@ -1,14 +0,0 @@ -The type name `this` refers to *the current class type at run time*. As such, it can only be used from within a class, an interface, or -a trait. (The type name `this` should not be confused with [`$this`](../source-code-fundamentals/names.md), which refers to *the current -instance*, whose type is `this`.) For example: - -```Hack -interface I1 { - abstract const type T1 as arraykey; - public function get_ID(): this::T1; -} -``` - -Here, the function `get_ID` returns a value whose type is based on the type of the class that implements this interface type. - -Strictly speaking, `this` is *not* a new type name, just an alias for an existing one. diff --git a/guides/hack/11-built-in-types/54-class.md b/guides/hack/11-built-in-types/54-class.md deleted file mode 100644 index d891366d2..000000000 --- a/guides/hack/11-built-in-types/54-class.md +++ /dev/null @@ -1,38 +0,0 @@ -```yamlmeta -{ - "fbonly messages": [ - "This type is under migration, and is allowed to flow to the [classname type](/hack/built-in-types/classname) for existing string use cases. There is [an internal wiki](https://www.internalfb.com/intern/wiki/Hack_Foundation/classnameC_vs._classC/) describing the type separation." - ] -} -``` - -Hack supports passing references to classes for use in instatiation and static -member access. - -```Hack no-extract -<<__ConsistentConstruct>> -class Employee { - public static function getKind(): int { return 4; }; -} - -function f(class $cls): void { - $w = new $cls(); // create an object of $cls - - $i = $cls::getKind(); -} -``` - -Function `f` can be called with a reference to the class `Employee` or any of -its subclasses using `::class` literals (`SomeClassName::class`). - -```Hack no-extract -class Intern extends Employee { - // ... -} - -function demo(): void { - f(Employee::class); // will call: new Employee(); - f(Intern::class); // will call: new Intern(); - f(Vector::class); // typechecker error! -} -``` diff --git a/guides/hack/11-built-in-types/55-classname.md b/guides/hack/11-built-in-types/55-classname.md deleted file mode 100644 index 46fb1bae0..000000000 --- a/guides/hack/11-built-in-types/55-classname.md +++ /dev/null @@ -1,51 +0,0 @@ -```yamlmeta -{ - "fbonly messages": [ - "This type is under migration, with the class-specific use cases described below shifting to the new [class type](/hack/built-in-types/class). There is [an internal wiki](https://www.internalfb.com/intern/wiki/Hack_Foundation/classnameC_vs._classC/) describing the type separation." - ] -} -``` - -For the most part, we deal with class types directly via their names. For -example: - -```Hack no-extract -class Employee { - // ... -} - -$emp = new Employee(); -``` - -However, in some applications, it is useful to be able to abstract a class' name -rather than to hard-code it. Consider the following: - -```Hack file:employee.hack -<<__ConsistentConstruct>> -class Employee { - // ... -} - -function f(classname $clsname): void { - $w = new $clsname(); // create an object whose type is passed in -} -``` - -This function can be called with the name of the class `Employee` or any of its -subclasses. - -```Hack no-extract -class Intern extends Employee { - // ... -} - -function demo(): void { - f(Employee::class); // will call: new Employee(); - f(Intern::class); // will call: new Intern(); - f(Vector::class); // typechecker error! -} -``` - -In Hack code, the class names must be specified using "`::class` literals" -(`SomeClassName::class`). The value of an expression of a classname type can be -converted implicitly or explicitly to `string`. diff --git a/guides/hack/11-built-in-types/56-darray-varray-runtime-options.md b/guides/hack/11-built-in-types/56-darray-varray-runtime-options.md deleted file mode 100644 index e1f9f2c2e..000000000 --- a/guides/hack/11-built-in-types/56-darray-varray-runtime-options.md +++ /dev/null @@ -1,269 +0,0 @@ -As of [HHVM 4.103](https://hhvm.com/blog/2021/03/31/hhvm-4.103.html), `darray` / `varray` are aliased to `dict` / `vec` respectively. Use [Hack arrays](/hack/arrays-and-collections/hack-arrays). - -## WARNING WARNING WARNING - -_These runtime options are a migrational feature. This means that they come and go when new hhvm versions are released. Before relying on them, it is recommended to run the given example code. If this does not raise a "Hack Arr Compat Notice" this option is not available in your version of HHVM._ - -If you notice that an option doesn't apply anymore and you are running a very modern version of HHVM, please open an issue or pull request against this repository. We'll mark the EOL date of that given runtime option in the documentation. We thank you in advance. - -The [runtime options](arrays.md#php-arrays-array-varray-and-darray__runtime-options) were briefly introduced in the article on [arrays](arrays.md). This article builds upon the information given there. - -You can get a list of the runtime options that your current hhvm recognizes from this script. -This relies on the settings being in your `server.ini`. -The output will look something like this. - -```hack -function get_all_runtime_options( -): dict string, - 'local_value' => string, - 'access' => string, -)> { - return \ini_get_all() - |> Dict\filter_keys($$, $name ==> Str\contains($name, 'hack_arr')); -} - -<<__EntryPoint>> -async function main_async(): Awaitable { - foreach (get_all_runtime_options() as $name => $values) { - echo Str\format( - "%s> global_value(%s), local_value(%s), access(%s)\n", - Str\pad_right($name, 60, '-'), - $values['global_value'], - $values['local_value'], - $values['access'], - ); - } -} -``` - -*Example output (HHVM 4.115)* - -``` -hhvm.hack_arr_is_shape_tuple_notices------------------------> global_value(), local_value(), access(4) -hhvm.hack_arr_dv_arrs---------------------------------------> global_value(1), local_value(1), access(4) -hhvm.hack_arr_dv_arr_var_export-----------------------------> global_value(), local_value(), access(4) -hhvm.hack_arr_compat_cast_marked_array_notices--------------> global_value(), local_value(), access(4) -hhvm.hack_arr_compat_compact_serialize_notices--------------> global_value(), local_value(), access(4) -hhvm.hack_arr_compat_serialize_notices----------------------> global_value(), local_value(), access(4) -hhvm.hack_arr_compat_is_vec_dict_notices--------------------> global_value(), local_value(), access(4) -hhvm.hack_arr_compat_intish_cast_notices--------------------> global_value(), local_value(), access(4) -hhvm.hack_arr_compat_fb_serialize_hack_arrays_notices-------> global_value(), local_value(), access(4) -hhvm.hack_arr_compat_check_compare--------------------------> global_value(), local_value(), access(4) -hhvm.hack_arr_compat_notices--------------------------------> global_value(), local_value(), access(4) -``` - -An important note: These settings will not work when you set them at runtime using ini_set(). You must set these in your configuration file or pass them in using the `-dsettinghere=valuehere` command line argument when invoking your script from the command line. - -## Check implicit varray append - -Fullname: hhvm.hack_arr_compat_check_implicit_varray_append - -**WARNING: This option was removed in HHVM 4.64. It is now always a fatal error.** - -Before HHVM 4.64, this setting will raise a notice under the following condition. -If it does not raise a warning, this option is not available in your version of hhvm. - -```hack no-extract - -<<__EntryPoint>> -async function main_async(): Awaitable { - using _Private\print_short_errors(); - - $varray = varray[ - 'HHVM', - 'HACK', - ]; - - $varray[2] = <<` does not support implicitly appending. You can only append using an empty subscript operator `$x[] = ''` and update using a keyed subscript operator `$x[2] = ''`. The runtime will throw when you use the updating syntax in order to append. `'OutOfBoundsException' with message 'Out of bounds vec access: invalid index 2'`. - -A `varray<_>` will, before HHVM 4.64, accept you implicitly appending a key. It will remain a `varray<_>`. This is the only case where writing to a non existent index in a `varray<_>` will not cause the `varray<_>` to escalate to a `darray<_, _>`. More information about array escalation can be found below. - -## Check varray promote - -Fullname: hhvm.hack_arr_compat_check_varray_promote - -**WARNING: This option was removed in HHVM 4.64. It is now always a fatal error.** - -Before HHVM 4.64, this setting will raise a notice under the following condition. -If it does not raise a warning, this option is not available in your version of hhvm. - -```hack no-extract -<<__EntryPoint>> -async function main_async(): Awaitable { - using _Private\print_short_errors(); - - $varray = varray[ - 'HHVM', - 'HACK', - ]; - - $varray[3] = << would throw an exception here. -EOF; - - $varray = varray[ - 'HHVM', - 'HACK', - ]; - - /*HH_IGNORE_ERROR[4135] This is banned in strict mode, but needs to be illustated.*/ - unset($varray[0]); - // Using unset on an index that is not the greatest index. - - $varray = varray[ - 'HHVM', - 'HACK', - ]; - - /*HH_IGNORE_ERROR[4324] This is banned in Hack, but needs to be illustated.*/ - $varray['string'] = <<. -A vec would throw an exception here. -EOF; -} -``` - -*Output (before HHVM 4.64)* - -``` -E_NOTICE "Hack Array Compat: varray promoting to darray: out of bounds key 3" in file "hack_arr_compat_check_varray_promote.php" at line 19 -E_NOTICE "Hack Array Compat: varray promoting to darray: removing key" in file "hack_arr_compat_check_varray_promote.php" at line 30 -E_NOTICE "Hack Array Compat: varray promoting to darray: invalid key: expected int, got string" in file "hack_arr_compat_check_varray_promote.php" at line 39 -``` - -**(fatal error in HHVM 4.64 or newer)** - -These situations are sadly very common in grandfathered PHP code. - -The first situation, writing to a key out of bounds, is not permitted on a `vec<_>`. It throws and `OutOfBoundsException`. A `vec<_>` will always maintain the keys 0, 1, 2, ... and will therefore have to refuse to create the new index on the fly. - -There are two distinct intents that the programmer may have had when writing this code. - -- The keys are actually useful data. -- The keys are meant to be indexes 0, 1, 2 and the programmer assumed that he or she was writing in-bounds. - -The first case is usually pretty easy to fix. If it looks like the keys are userids, timestamps, or alike, `varray<_>` isn't the right type. Migrate the code to use `darray<_, current_value_type>`. You'll have to figure out the keytype from context. - -The second case is far less easy to give a clear fix for. - -- Chances are that there is a nearby `C\count()` doing a bounds check that might be defective. -- Is the array being filled out of order? Are all the indexes between 0 and the greatest index used after this procedure? You might be tempted to make the fill happen in order, but that will change the order that the elements are iterated over in a foreach. - -The second situation, calling unset on an element of a `varray<_>`, can have multiple intends too. - -- If the T is a nullable type, the programmer might have meant to write `null` to the index. This is more common in code written before hhvm4. -- The programmer does not care about the keys. The array is merely a meant to be used as a `KeyedContainer` and he or she just meant to remove the value from the `KeyedContainer<_, _>`. -- The programmer intended to unset the last index. - -The first case is most likely a confusion caused by a removed behavior of all legacy arrays. Before hhvm 4 accessing an key that wasn't present would log a notice and return null. An unset on an array would under these circumstances act very similarly to explicitly setting to value to null. This is however quite tricky to do right if this array is being passed around the program a lot. An unset key is actually removed from the array. This means that `C\contains_key()` will return `false`, `idx()` will return its default argument, and `??` will evaluate to the RHS. However, explicitly setting the value to `null` does not remove the key from the array. This means that `C\contains_key()` returns `true`, `idx()` will return the `null`, but `??` will be unaffected. - -The second usecase is not met by Hack arrays. There is no `Container<_>` type that allows you to append to the end and remove things by index (except for `keyset<_>`, but that has a constraint value type). You can however emulate this behavior using a `varray<_>` or `vec<_>`. Removing the first key can be done using `Vec\drop($x, 1)`. Removing the last key can be done using `\array_pop()` `C\fb\pop_back`. Removing a key from the middle can be done with the slightly unwieldy `Vec\filter_with_key($x, ($key, $_) ==> $key === 1)`. All of these will rekey the array. Any values after the key will be shifted down. This does however have a computational complexity of `O(n)`. If you need to remove a lot of keys from the middle that are next to each other, use `Vec\slice()` to save some resources. If you need to remove a ton of arbitrary keys, at different points of your function it might be better to `dict($x)`, unset on the `dict<_, _>` and rekey it back to a `varray<_>` using `varray()` or `array_values()` depending on your hhvm version. - -The third usecase used to be valid Hack. Unsetting the last index of a `varray<_>` or `vec<_>` was allowed and acted like an `\array_pop()``C\fb\pop_back`. This will currently not generate a warning, but it is unclear to me if this will continue to be allowed. The typechecker already raises a typeerror when you use unset on a non dictionary/hashmap like array type. - -The third situation, writing to a string key, is always a mistake. - -If this is a string literal, the actual type is most likely `darray<_, _>`. If this is an intergral string coming from an untyped function, it is worth investigating casting the value to an int. - -## Runtime typetests of shapes and tuples - -In HHVM 4.102 or older, shapes and tuples were implemented with `darray` and -`varray`. In HHVM 4.103 and newer, they are `dict` and `vec`; -this means that the following checks would fail before HHVM 4.103, but now -pass—for this reason, in HHVM 4.102 or older, -the `hhvm.hack_arr_is_shape_tuple_notices` -runtime option could be used to raise notices for these type tests: - -```hack -$_ = dict[] is shape(); -$_ = vec[42] is /*tuple*/(int); -``` - -*Output (before HHVM 4.103)* - -``` -Notice: Hack Array Compat: dict is shape in /home/example/hack_arr_is_shape_tuple_notices.hack on line 10 - -Notice: Hack Array Compat: vec is tuple in /home/example/hack_arr_is_shape_tuple_notices.hack on line 11 -``` - -## Check array key cast - -Fullname: hhvm.hack_arr_compat_check_array_key_cast - -**WARNING: This option was removed in HHVM 4.66. It is now always a fatal error.** - -Before HHVM 4.66, this setting will raise a notice under the following condition. -If it does not raise a warning, this option is not available in your version of hhvm. - -```hack no-extract -<<__EntryPoint>> -async function main_async(): Awaitable { - using _Private\print_short_errors(); - - $varray = varray[]; - - /*HH_IGNORE_ERROR[4324]*/ - $varray[1.1] = 'A float?!?'; - /*HH_IGNORE_ERROR[4324]*/ - $varray[true] = 'A bool?!?'; - /*HH_IGNORE_ERROR[4324]*/ - $varray[null] = 'null?!?'; - - $darray = darray[]; - - /*HH_IGNORE_ERROR[4371]*/ - $darray[1.1] = 'A float?!?'; - /*HH_IGNORE_ERROR[4371]*/ - $darray[true] = 'A bool?!?'; - /*HH_IGNORE_ERROR[4371]*/ - $darray[null] = 'null?!?'; - -} -``` - -*Output (before HHVM 4.66)* - -``` -E_NOTICE "Hack Array Compat: Implicit conversion of double to array key" in file "hack_arr_compat_check_array_key_cast.php" at line 17 -E_NOTICE "Hack Array Compat: Implicit conversion of bool to array key" in file "hack_arr_compat_check_array_key_cast.php" at line 19 -E_NOTICE "Hack Array Compat: Implicit conversion of null to array key" in file "hack_arr_compat_check_array_key_cast.php" at line 21 -E_NOTICE "Hack Array Compat: Implicit conversion of double to array key" in file "hack_arr_compat_check_array_key_cast.php" at line 26 -E_NOTICE "Hack Array Compat: Implicit conversion of bool to array key" in file "hack_arr_compat_check_array_key_cast.php" at line 28 -E_NOTICE "Hack Array Compat: Implicit conversion of null to array key" in file "hack_arr_compat_check_array_key_cast.php" at line 30 -``` - -**(fatal error in HHVM 4.66 or newer)** - -A `vec<_>` and a `dict<_, _>` only allow `arraykey` keys. -Because of legacy, the (d/v)array family needed to support non arraykey keys being set and read from. -When you set `$varray[true] = 4;`, before HHVM 4.66, hhvm will cast your `true` to a valid arraykey `1`. -The rules of casting were as follows: - -- floats are cast to ints using an `(int)` cast. -- `true` becomes 1 and `false` becomes 0. -- `null` becomes empty string. - -Deciding on the best course of action relies on context. -If the value is coming from an untyped function, it is worth investigating if the returned type might have been a mistake. -Keep in mind that a function that reaches the closing `}` before hitting a `return` statement returns `null`. - -If you want this error to go away, but you'd like to keep the current behavior (not recommended) -you can use `HH\array_key_cast()`. diff --git a/guides/hack/11-built-in-types/58-resources.md b/guides/hack/11-built-in-types/58-resources.md deleted file mode 100644 index 977679dbb..000000000 --- a/guides/hack/11-built-in-types/58-resources.md +++ /dev/null @@ -1,15 +0,0 @@ -A resource is a descriptor to some sort of external entity. (Examples include files, databases, and sockets.) Resources are only created or -consumed by the implementation; they are never created or consumed by Hack code. Each distinct resource has a unique ID of some unspecified form. - -When scripts execute in a mode having a command-line interface, the following resources -that correspond to file streams are automatically opened at program start-up: -- `HH\\stdin()` or `HH\\try_stdin()`, which map to standard input -- `HH\\stdout()` or `HH\\try_stdout()`, which map to standard output -- `HH\\stderr()` or `HH\\try_stderr()`, which map to standard error - -These streams have some unspecified type, which behaves like a subtype of type `resource`. - -The `try` variants return null when executed without a command-line interface, -while the non-`try` functions throw an exception. - -**Resources are a carryover from PHP, and their use is discouraged in Hack code.** diff --git a/guides/hack/11-built-in-types/61-null.md b/guides/hack/11-built-in-types/61-null.md deleted file mode 100644 index 2c32ad81c..000000000 --- a/guides/hack/11-built-in-types/61-null.md +++ /dev/null @@ -1,42 +0,0 @@ -The `null` type has only one possible value, the value `null`. - -You can use the `null` type when refining with `is`. - -```Hack -function number_or_default(?int $x): int { - if ($x is null) { - return 42; - } else { - return $x; - } -} -``` - -See [nullable types](../types/nullable-types.md) for a discussion of `?T` -types. - -The `null` type is also useful when writing generics. Suppose you want -to define a generic interface with a 1-argument function, but some -instances don't need an argument. - -```Hack file:traversefrom.hack -// A toy interface that allows you to iterate over something, -// setting a start point. -interface TraverseFrom { - public function startAt(Ti $_): Traversable; -} -``` - -You can use `null` to define a class implementing this interface, -making it clear that you don't care about the argument to `startAt`. - - -```Hack file:traversefrom.hack -class TraverseIntsFromStart implements TraverseFrom { - public function __construct(private vec $items) {} - - public function startAt(null $_): Traversable { - return $this->items; - } -} -``` diff --git a/guides/hack/11-built-in-types/64-nonnull.md b/guides/hack/11-built-in-types/64-nonnull.md deleted file mode 100644 index 1d56d9c98..000000000 --- a/guides/hack/11-built-in-types/64-nonnull.md +++ /dev/null @@ -1 +0,0 @@ -The type `nonnull` supports any value except `null`. diff --git a/guides/hack/11-built-in-types/70-mixed.md b/guides/hack/11-built-in-types/70-mixed.md deleted file mode 100644 index e47e7457b..000000000 --- a/guides/hack/11-built-in-types/70-mixed.md +++ /dev/null @@ -1,19 +0,0 @@ -The `mixed` type represents any value at all in Hack. - -For example, the following function can be passed anything. - -```Hack no-extract -function takes_anything(mixed $m): void {} - -function call_it(): void { - takes_anything("foo"); - takes_anything(42); - takes_anything(new MyClass()); -} -``` - -`mixed` is equivalent to `?nonnull`. `nonnull` represents any value -except `null`. - -We recommend you avoid using `mixed` whenever you can use a more -specific type. diff --git a/guides/hack/11-built-in-types/71-dynamic.md b/guides/hack/11-built-in-types/71-dynamic.md deleted file mode 100644 index 9dc670e28..000000000 --- a/guides/hack/11-built-in-types/71-dynamic.md +++ /dev/null @@ -1,94 +0,0 @@ -**This type is intended to help with code being transitioned from untyped mode to strict -mode.** - -Although `dynamic` can be used as the type of a class constant or property, or a function -return type, its primary use is as a parameter type. - -This special type is used to help capture dynamism in the existing codebase in typed code, in -a more manageable manner than `mixed`. With `dynamic`, the presence of dynamism in a function -is local to the function, and dynamic behaviors cannot leak into code that does not know about it. - -Consider the following: - -```Hack -function f(dynamic $x) : void { - $n = $x + 5; // $n is a num - $s = $x . "hello!"; // $s is a string - $y = $x->anyMethod(); // $y is dynamic -} -``` - -A value of type `dynamic` can be used in most local operations: like untyped expressions, we -can treat it like a `num` and add it, or a `string` and concatenate it, or call any method on it, as shown above. - -When using a dynamic type in an operation, the type checker infers the best possible type with -the information it has. For example, using a dynamic in an arithmetic operation like + or - result -in a `num`, using a dynamic in a string operation result in a `string`, but calling a method on a -dynamic, results in another dynamic. - -`dynamic` allows calls, property access, and bracket access without a null-check, but it can throw if the runtime value is null. - -# Coercion - -The `dynamic` type sits outside the normal type hierarchy. It is a supertype only of the bottom type `nothing` -and a subtype only of the top type `mixed`. The type interfaces with other types via coercion (`~>` in the -examples). All types coerce to `dynamic`, which allows callers to pass any type into a function that expects dynamic. Also, any type -coerces to its supertypes. Coercion points include function calls, return statements, and property assignment. - -```Hack -function f(dynamic $d): void {} -function g(arraykey $a): void {} - -function caller(int $i): void { - f($i); // int ~> dynamic - g($i); // int ~> arraykey by subtyping -} -``` - -The runtime enforces a set of types by throwing `TypeHintViolationException` when an incorrect type is provided. This set includes - -- primitive types -- classes without generics, or with reified generics -- reified generics with the `<<__Enforceable>>` attribute -- transparent type aliases to enforceable types - -Hack approximates this runtime behavior by allowing values of type `dynamic` to coerce to enforceable types at coercion points. - -```Hack error -function enforced(int $i): void {} -function notEnforced(shape('a' => int) $s): void {} - -function caller(dynamic $d): void { - enforced($d); // dynamic ~> int, runtime will throw if $d is not an int - - notEnforced($d); // Hack error, dynamic ~/> shape('a' => int), runtime will not throw if $d is not a shape -} -```.hhconfig -coercion_from_dynamic = true -``` - -Unions with dynamic are also allowed to coerce to enforceable types provided that each element of the union can coerce. - -```hack error -function expect_int(int $i): void {} -function expect_string(string $s): void {} - -function choose(bool $b, dynamic $d, int $i): void { - if ($b) { - $x = $d; - } else { - $x = $i; - } - expect_int($x); // (dynamic | int) ~> int - // dynamic ~> int because int is enforced - // int ~> int because int <: int - - expect_string($x); // Hack error, (dynamic | int) ~/> string because int ~/> string -} -```.hhconfig -coercion_from_dynamic = true -coercion_from_union = true -complex_coercion = true -``` - -Notably, unlike subtyping, coercion is *not* transitive, meaning that `int ~> dynamic` and `dynamic ~> string` does not imply that `int ~> string`. diff --git a/guides/hack/11-built-in-types/73-noreturn.md b/guides/hack/11-built-in-types/73-noreturn.md deleted file mode 100644 index e3fd06342..000000000 --- a/guides/hack/11-built-in-types/73-noreturn.md +++ /dev/null @@ -1,71 +0,0 @@ -A function that never returns a value can be annotated with the -`noreturn` type. A `noreturn` function either loops forever, throws an -an error, or calls another `noreturn` function. - -```Hack -function something_went_wrong(): noreturn { - throw new Exception('something went wrong'); -} -``` - -`invariant_violation` is an example of a library function with a `noreturn` type. - -`noreturn` informs the typesystem that code execution can not continue past a certain line. -In combination with a conditional, you can refine variables, since the typesystem will take note. -This is actually how [invariant](../expressions-and-operators/invariant) is [implemented](/hack/reference/function/HH.invariant). - -```Hack -<<__EntryPoint>> -async function main_async(): Awaitable { - $nullable_int = '_' ? 0 : null; - if (!($nullable_int is nonnull)) { - invariant_violation('$nullable_int must not be null'); - } - // If we didn't fall into the if above, $nullable_int must be an int. - takes_int($nullable_int); -} - -function takes_int(int $int): void { - echo $int; -} -``` - -If you want to, you can also use [nothing](./nothing) instead. This allows you use the return value of the function. -This makes it more explicit to the reader of your code that you are depending on the fact that this function influences typechecking. - -```Hack -function i_am_a_noreturn_function(): noreturn { - throw new Exception('stop right here'); -} - -function i_return_nothing(): nothing { - i_am_a_noreturn_function(); -} - -const ?int NULLABLE_INT = 0; - -async function main_async(): Awaitable { - example_noreturn(); - example_nothing(); -} - -function example_noreturn(): int { - $nullable_int = NULLABLE_INT; - if ($nullable_int is null) { - i_am_a_noreturn_function(); - } - return $nullable_int; -} - -function example_nothing(): int { - $nullable_int = NULLABLE_INT; - if ($nullable_int is null) { - return i_return_nothing(); - } - return $nullable_int; -} -``` - -In this example the `noreturn` function is named very plain, so you can understand that this refines. -However in the `nothing` version you don't need to know the signature of `i_return_nothing()` -to understand that `$nullable_int` will not be null after the if, since you can see the `return`. diff --git a/guides/hack/11-built-in-types/74-nothing.md b/guides/hack/11-built-in-types/74-nothing.md deleted file mode 100644 index 6c4d1bba4..000000000 --- a/guides/hack/11-built-in-types/74-nothing.md +++ /dev/null @@ -1,180 +0,0 @@ -The type `nothing` is the bottom type in the Hack typesystem. This means that there is no way to create a value of the type `nothing`. `nothing` only exists in the typesystem, not in the runtime. - -The concept of a bottom type is quite difficult to grasp, so I'll first compare it to the supertype of everything `mixed`. `mixed` is the most general thing you can imagine within the hack typesystem. Everything "extends" `mixed` if you will. `nothing` is the exact opposite of that. - -Let's work out the hierarchy of scalar types. Forget about nullable types and `dynamic` for the moment, they would make this example far more complex without adding much value. - - - `mixed` is at the top. Everything is a subtype of `mixed`, either directly (types that have no other supertypes) or indirectly (via their supertypes). - - `num` is a subtype of `mixed`. - - `arraykey` is a subtype of `mixed`. - - `bool` is a subtype of `mixed`. - - `int` is a subtype of `num` and `arraykey`. - - `float` is a subtype of `num`. - - `string` is a subtype of `arraykey`. - - `nothing` is a subtype of `int`, `float`, `string`, and `bool`. - -The important thing to note here is that `nothing` is never between two types. `nothing` only shows up right below a type with no other subtypes. - -## Usages - -When defining a function that will never return (it either throws, loops forever, or terminates the request) you can use `nothing` for the return type. This gives more information to the caller than `void` and is more flexible than [noreturn](./noreturn). `nothing` can be used in expressions (like `nullable T ?? nothing`) and it will typecheck "as if it wasn't there", since `(T | nothing)` is _just_ `T`. - -`nothing` can be used to create a `throw` expression in this way. - -```Hack -function throw_as_an_expression(\Throwable $t): nothing { - throw $t; -} - -function returns_an_int(?int $nullable_int): int { - // You can not use a `throw` statement in an expression bodied lambda. - // You need to add curly braces to allow a `throw` statement. - $throwing_lambda = () ==> { - throw new \Exception(); - }; - - $throwing_expr_lambda = () ==> throw_as_an_expression(new \Exception()); - - // You can't write a statement on the RHS of an operator, because it operates on expressions. - // The type of the `??` operator is `(nothing | int)`, which simplifies to `int`, - // so this return statement is valid. - return $nullable_int ?? throw_as_an_expression(new \Exception()); -} - -<<__EntryPoint>> -async function main_async(): Awaitable { - echo returns_an_int(1); -} -``` - -


- -When writing a new bit of functionality, you may need to pass a value to a function you can't produce without a lot of work. `nothing` can be used as a placeholder value in place of any type without causing type errors. The typechecker will continue checking the rest of your program and the runtime will throw if this code path gets executed. I have called this function `undefined`, as an homage to Haskell [undefined](https://wiki.haskell.org/Undefined). - -```Hack file:undefined.hack -type undefined = nothing; - -function undefined(): undefined { - throw new Exception('NOT IMPLEMENTED: `undefined` cannot be produced.'); -} -``` - -And here is how to use it - -```Hack file:undefined.hack -interface MyInterface { - public function isAmazed(): bool; -} - -function do_something(MyInterface $my_interface): bool { - return $my_interface->isAmazed(); -} - -<<__EntryPoint>> -async function main_async(): Awaitable { - $my_interface = undefined(); - // We won't ever reach this line, since `undefined()` will halt the program by throwing. - // We can't produce a MyInterface just yet, since there are no classes which implement it. - // `undefined` is a placeholder for now. - // We can continue writing our business logic and come back to this later. - if (do_something($my_interface)) { - // Write the body first, worry about the condition later. - } -} -``` - -You could make your staging environment remove the file which declared the `undefined()` function. That way you'll get a typechecker error when you accidentally push code that has these placeholders in it. This prevents you from accidentally deploying unfinished code to production. - -
- -When making a new / empty `Container`, Hack will infer its type to be `Container`. It is not that there are actual value of type `nothing` in the `Container`, it is just that this is a very nice way of modeling empty `Container`s. - -Should you be able to pass an empty vec where a `vec` is expected? Yes, there is no element inside that is not a `string`, so that should be fine. You can even pass the same vec into a function that takes a `vec` since there are no elements that are not of type `bool`. What are you allowed to do with the `$nothing` of this foreach? Well, you can do anything to it. Since nothing is a subtype of everything, you can pass it to any method and do all the things you want to. - -```Hack -function takes_vec_of_strings(vec $_): void {} -function takes_vec_of_bools(vec $_): void {} - -<<__EntryPoint>> -async function main_async(): Awaitable { - $empty_vec = vec[]; - takes_vec_of_bools($empty_vec); - takes_vec_of_strings($empty_vec); - - foreach ($empty_vec as $nothing) { - $nothing->whatever(); - takes_vec_of_strings($nothing); - } -} -``` - -
- -To make an interface that requires that you implement a method, without saying anything about its types. This does still make a requirement about the amount of parameters that are required parameters. - -```Hack -interface DontForgetToImplementShipIt { - public function shipIt(nothing $_): mixed; -} - -abstract class Software implements DontForgetToImplementShipIt { -} - -class HHVM extends Software { - public function shipIt(string $version): string { - return 'Shipping HHVM version '.$version.'!'; - } -} - -class HSL extends Software { - private function __construct(public bool $has_new_functions) { - } - - public function shipIt(bool $has_new_functions): HSL { - return new HSL($has_new_functions); - } -} - -class HHAST extends Software { - public function shipIt(Container $linters): void { - foreach ($linters as $linter) { - invariant( - Str\ends_with($linter, 'Linter'), - 'Linter %s does not have a name that ends in "Linter"!', - $linter, - ); - } - } -} -``` - -It is important to note that `Software::shipIt()` is not directly callable without knowing what subtype of `Software` you have. - -
- -Contravariant generic types can use `nothing` to allow all values to be passed. This acts in a similar way that `mixed` acts of covariant generics, such as `vec`. - -```Hack -final class MyClass<-T> { - public function consume(T $value): void {} - public function someOtherMethod(): void {} -} - -// We don't use the `T` from `->consume(T): void` in the function, -// so we can use `nothing` for the generic and accept any and all MyClass instances. -function some_function(MyClass $a, MyClass $b): void { - if ($a !== $b) { - $b->someOtherMethod(); - echo "different\n"; - } -} - -<<__EntryPoint>> -async function main_async(): Awaitable { - - $my_class_int = new MyClass(); - $my_class_string = new MyClass(); - - some_function($my_class_int, $my_class_string); -} -``` diff --git a/guides/hack/11-built-in-types/built-in-types-category.txt b/guides/hack/11-built-in-types/built-in-types-category.txt deleted file mode 100644 index 2eedef444..000000000 --- a/guides/hack/11-built-in-types/built-in-types-category.txt +++ /dev/null @@ -1 +0,0 @@ -Types and Generics diff --git a/guides/hack/11-built-in-types/built-in-types-summary.txt b/guides/hack/11-built-in-types/built-in-types-summary.txt deleted file mode 100644 index 54ed30fde..000000000 --- a/guides/hack/11-built-in-types/built-in-types-summary.txt +++ /dev/null @@ -1 +0,0 @@ -Built-in types known to the type checker. diff --git a/guides/hack/12-generics/01-introduction.md b/guides/hack/12-generics/01-introduction.md deleted file mode 100644 index 9beccbbb0..000000000 --- a/guides/hack/12-generics/01-introduction.md +++ /dev/null @@ -1,98 +0,0 @@ -Certain types (classes, interfaces, and traits) and their methods can be *parameterized*; that is, their declarations can have one or more -placeholder names---called *type parameters*---that are associated with types via *type arguments* when a class is instantiated, or a method -is called. A type or method having such placeholder names is called a *generic type* or *generic method*, respectively. Top-level functions -can also be parameterized giving rise to *generic functions*. - -Generics allow programmers to write a class or method with the ability to be parameterized to any set of types, all while preserving type safety. - -Consider the following example in which `VecStack` is a generic class having one type parameter, `T`: - -```Hack file:stack.hack -use namespace HH\Lib\{C, Vec}; - -interface StackLike { - public function isEmpty(): bool; - public function push(T $element): void; - public function pop(): T; -} - -class StackUnderflowException extends \Exception {} - -class VecStack implements StackLike { - private int $stackPtr; - - public function __construct(private vec $elements = vec[]) { - $this->stackPtr = C\count($elements) - 1; - } - - public function isEmpty(): bool { - return $this->stackPtr === -1; - } - - public function push(T $element): void { - $this->stackPtr++; - if (C\count($this->elements) === $this->stackPtr) { - $this->elements[] = $element; - } else { - $this->elements[$this->stackPtr] = $element; - } - } - - public function pop(): T { - if ($this->isEmpty()) { - throw new StackUnderflowException(); - } - $element = $this->elements[$this->stackPtr]; - $this->elements[$this->stackPtr] = $this->elements[0]; - $this->stackPtr--; - return $element; - } -} -``` - -As shown, the type parameter `T` is used in the declaration of the instance property `$elements`, as a parameter for `push()`, and as a return type for `pop()`. - -```Hack file:stack.hack -function useIntStack(StackLike $stInt): void { - $stInt->push(10); - $stInt->push(20); - echo 'pop => '.$stInt->pop()."\n"; // 20 - $stInt->push(30); - echo 'pop => '.$stInt->pop()."\n"; // 30 - echo 'pop => '.$stInt->pop()."\n"; // 10 - // $stInt->push(10.5); // rejected as not being type-safe -} -``` - -The line commented-out, attempts to call push with a non-`int` argument. This is rejected, because `$stInt` is a stack of `int`. - -The *arity* of a generic type or method is the number of type parameters declared for that type or method. As such, class `Stack` has arity 1. - -Here is an example of a generic function, `swap`, having one type parameter, `T`: - -```Hack -function swap(inout T $i1, inout T $i2): void { - $temp = $i1; - $i1 = $i2; - $i2 = $temp; -} - -<<__EntryPoint>> -function main(): void { - $v1 = -10; - $v2 = 123; - echo "\$v1 = ".$v1.", \$v2 = ".$v2."\n"; - swap(inout $v1, inout $v2); - echo "\$v1 = ".$v1.", \$v2 = ".$v2."\n"; - - $v3 = "red"; - $v4 = "purple"; - echo "\$v3 = ".$v3.", \$v4 = ".$v4."\n"; - swap(inout $v3, inout $v4); - echo "\$v3 = ".$v3.", \$v4 = ".$v4."\n"; -} -``` - -The function swaps the two arguments passed to it. In the case of the call with two `int` arguments, `int` is inferred as -the type corresponding to the type parameter `T`. In the case of the call with two `string` arguments, -`string` is inferred as the type corresponding to the type parameter `T`. diff --git a/guides/hack/12-generics/04-type-parameters.md b/guides/hack/12-generics/04-type-parameters.md deleted file mode 100644 index 8a00c5ec2..000000000 --- a/guides/hack/12-generics/04-type-parameters.md +++ /dev/null @@ -1,36 +0,0 @@ -A type parameter is a placeholder for a type that is supplied when a generic type is instantiated, or a generic method or function is invoked. - -A type parameter is a compile-time construct. At run-time, each type parameter is matched to a run-time type that was specified by a -type argument. - -The name of a type parameter is visible from its point of definition through the end of the type, method, or function declaration on -which it is defined. However, the name does not conflict with a name of the same spelling used in non-type contexts (such as the names -of a class constant, an attribute, a method, an enum constant, or a namespace). All type-parameter names *must* begin with the letter T. - -In the following case, class `Vector` has one type parameter, `Tv`. Method `map` also has one type parameter, `Tu`. - -```Hack no-extract -final class Vector implements MutableVector { - // ... - public function map((function(Tv): Tu) $callback): Vector { ... } -} -``` - -In the following case, class `Map` has two type parameters, `Tk` and `Tv`. Method `zip` has one, `Tu`. - -```Hack no-extract -final class Map implements MutableMap { - // ... - public function zip(Traversable $iter): Map> { ... } -} -``` - -In the following case, function `max_value` has one type parameter, `T`. - -```Hack -function max_value(T $p1, T $p2): T { - throw new Exception("unimplemented"); -} -``` - -Generic type constraints are discussed in [type constraints](type-constraints.md). diff --git a/guides/hack/12-generics/07-type-constraints.md b/guides/hack/12-generics/07-type-constraints.md deleted file mode 100644 index 28f737c82..000000000 --- a/guides/hack/12-generics/07-type-constraints.md +++ /dev/null @@ -1,82 +0,0 @@ -A *type constraint* on a generic type parameter indicates a requirement that a type must fulfill in order to be accepted as a type -argument for that type parameter. (For example, it might have to be a given class type or a subtype of that class type, or it might -have to implement a given interface.) - -A constraint can have one of three forms: -* `T as sometype`, meaning that `T` must be a subtype of `sometype` -* `T super sometype`, meaning that `T` must be a supertype of `sometype` -* `T = sometype`, meaning that `T` must be equivalent to `sometype`. (This is like saying both `T as sometype` *and* `T super sometype`.) - -Consider the following example in which function `max_val` has one type parameter, `T`, and that has a constraint, `num`: - -```Hack -function max_val(T $p1, T $p2): T { - return $p1 > $p2 ? $p1 : $p2; -} - -<<__EntryPoint>> -function main(): void { - echo "max_val(10, 20) = ".(string)(max_val(10, 20))."\n"; - echo "max_val(15.6, -20.78) = ".(string)(max_val(15.6, -20.78))."\n"; -} -``` - -Without the `num` constraint, the expression `$p1 > $p2` is ill-formed, as a greater-than operator is not defined for all types. By -constraining the type of `T` to `num`, we limit `T` to being an `int` or `float`, both of which do have that operator defined. - -Unlike an `as` constraint, `T super U` asserts that `T` must be a supertype of `U`. This kind of constraint is rather exotic, but solves -an interesting problem encountered when multiple types "collide". Here is an example of how it's used on method `concat` in the library interface -type `ConstVector`: - -```Hack no-extract -interface ConstVector<+T> { - public function concat(ConstVector $x): ConstVector; - // ... -} -``` - -Consider the case in which we call `concat` to concatenate a `Vector` and a `Vector`. As these have a common supertype, `num`, -the `super` constraint allows the checker to determine that `num` is the inferred type of `Tu`. - -Now, while a type parameter on a class can be annotated to require that it is a subtype or supertype of a particular type, for generic parameters -on classes, constraints on the type parameters can be assumed in *any* method in the class. But sometimes some methods want to use some features of -the type parameter, and others want to use some different features, and not all instances of the class will satisfy all constraints. This can be done by -specifying constraints that are *local* to particular methods. For example: - -```Hack no-extract -class MyWidget { - public function showIt(): void where Telem as IPrintable { ... } - public function countIt(): int where Telem as ICountable { ... } -} -``` - -Constraints can make use of the type parameter itself. They can also make use of generic type parameters on the method. For example: - -```Hack -class MyList { - public function flatten(): MyList where T = MyList { - throw new Exception('unimplemented'); - } -} -``` - -Here we might create a list of lists of int, of type `MyList>`, and then invoke `flatten` on it to get a `MyList`. Here's another example: - -```Hack -class MyList { - public function compact(): MyList where T = ?Tu { - throw new Exception('unimplemented'); - } -} -``` - -A `where` constraint permits multiple constraints supported; just separate the constraints with commas. For example: - -```Hack no-extract -class SomeClass { - function foo(T $x) where T as MyInterface, T as MyOtherInterface -} -``` - -If a method overrides another method that has declared `where` constraints, it's necessary to redeclare -those constraints, but only if they are actually used by the overriding method. (It's valid, and reasonable, to require less of the overriding method.) diff --git a/guides/hack/12-generics/10-variance.md b/guides/hack/12-generics/10-variance.md deleted file mode 100644 index c92b83686..000000000 --- a/guides/hack/12-generics/10-variance.md +++ /dev/null @@ -1,86 +0,0 @@ -Hack supports both generic *covariance* and *contravariance* on a type parameter. - -Each generic parameter can optionally be marked separately with a variance indicator: - * `+` for covariance - * `-` for contravariance - -If no variance is indicated, the parameter is invariant. - -## Covariance - -If `Foo` is a subtype of `Foo`, then `Foo` is covariant on `T`. 'co' means 'with'; and the subtype relationship of the generic -type goes with the subtype relationship of arguments to a covariant type parameter. Here is an example: - -```Hack -// This class is readonly. Had we put in a setter for $this->t, we could not -// use covariance. e.g., if we had function setMe(T $x), you would get this -// cov.php:9:25,25: Illegal usage of a covariant type parameter (Typing[4120]) -// cov.php:7:10,10: This is where the parameter was declared as covariant (+) -// cov.php:9:25,25: Function parameters are contravariant -class C<+T> { - public function __construct(private T $t) {} -} - -class Animal {} -class Cat extends Animal {} - -function f(C $p1): void { - \var_dump($p1); -} - -function g(varray $p1): void { - \var_dump($p1); -} - -<<__EntryPoint>> -function run(): void { - f(new C(new Animal())); - f(new C(new Cat())); // accepted - - g(vec[new Animal(), new Animal()]); - g(vec[new Cat(), new Cat(), new Animal()]); // arrays are covariant -} -``` - -A covariant type parameter is for read-only types. Thus, if the type can somehow be set, then you cannot use covariance. - -Covariance cannot be used as the type of a parameter on any method, or as the type of any mutable property, in that class. - -## Contravariance - -If `Foo` is a subtype of `Foo`, then `Foo` is contravariant on `T`. 'contra' means 'against'; and the subtype relationship -of the generic type goes against the subtype relationship of arguments to a contravariant type parameter. Here is an example: - -```Hack -// This class is write only. Had we put in a getter for $this->t, we could not -// use contravariance. e.g., if we had function getMe(T $x): T, you would get -// con.php:10:28,28: Illegal usage of a contravariant type -// parameter (Typing[4121]) -// con.php:5:10,10: This is where the parameter was declared as -// contravariant (-) -// con.php:10:28,28: Function return types are covariant -class C<-T> { - public function __construct(private T $t) {} - public function set_me(T $val): void { - $this->t = $val; - } -} - -class Animal {} -class Cat extends Animal {} - -<<__EntryPoint>> -function main(): void { - $animal = new Animal(); - $cat = new Cat(); - $c = new C($cat); - // calling set_me with Animal on an instance of C that was initialized with Cat - $c->set_me($animal); - \var_dump($c); -} -``` - -A contravariant type parameter is for write-only types. Thus, if the type can somehow be read, then you cannot use -contravariant. (e.g., serialization functions are a good use case). - -A contravariant type parameter cannot be used as the return type of any method in that class. diff --git a/guides/hack/12-generics/19-type-erasure.md b/guides/hack/12-generics/19-type-erasure.md deleted file mode 100644 index 2364997c4..000000000 --- a/guides/hack/12-generics/19-type-erasure.md +++ /dev/null @@ -1,43 +0,0 @@ -Parameterized types with generics give you type safety without runtime -checks. - -Generic type information is not available at runtime: this is called -"erasure". If you need this information, consider using [reified -generics](reified-generics). - -```Hack -function takes_ints(vec $items): vec { - return $items; -} -``` - -When the type checker runs, a call `takes_ints(vec["hello"])` will -produce a type error. At runtime, since the parameter `int` is erased, we -only check that the argument and return type is a `vec`. - -## Awaitable Types - -For async functions, Hack will also enforce the wrapped return type at -runtime. For example, the following function will produce a runtime -error: - -```Hack error -async function my_foo(): Awaitable { - return "not an int"; -} -``` - -## Erasure Limitations - -Erasure prevents you using a generic type parameter `T` in the -following situations: - - * Creating instances: `new T()` - * Calling static methods: `T::aStaticMethod()` - * Type checks: `is T` - * As the type of a static property. - * As the type of the exception in a catch block: `catch (T $exception)` - -For passing around class names for instantiation, Hack provides -[`classname`](../built-in-types/classname.md) that extends the -representation of `Foo::class`. diff --git a/guides/hack/12-generics/generic-types-and-functions-category.txt b/guides/hack/12-generics/generic-types-and-functions-category.txt deleted file mode 100644 index 2eedef444..000000000 --- a/guides/hack/12-generics/generic-types-and-functions-category.txt +++ /dev/null @@ -1 +0,0 @@ -Types and Generics diff --git a/guides/hack/12-generics/generic-types-and-functions-summary.txt b/guides/hack/12-generics/generic-types-and-functions-summary.txt deleted file mode 100644 index 5acf950c7..000000000 --- a/guides/hack/12-generics/generic-types-and-functions-summary.txt +++ /dev/null @@ -1 +0,0 @@ -Generic types, where constraints, and variance. diff --git a/guides/hack/13-contexts-and-capabilities/01-introduction.md b/guides/hack/13-contexts-and-capabilities/01-introduction.md deleted file mode 100644 index e03431a77..000000000 --- a/guides/hack/13-contexts-and-capabilities/01-introduction.md +++ /dev/null @@ -1,99 +0,0 @@ -**Note:** Context and capabilities are enabled by default since -[HHVM 4.93](https://hhvm.com/blog/2021/01/19/hhvm-4.93.html). - -Contexts and capabilities provide a way to specify a set of capabilities for a function's implementation and a permission system for its callers. These capabilities may be in terms of what functions may be used in the implementation (e.g. a pure function cannot call non-pure functions), or in terms of other language features (e.g. a pure function can not write properties on `$this`). - -Capabilities are permissions or descriptions of a permission. For example, one might consider the ability to do IO or access globals as capabilities. Contexts are a higher level representation of a set of capabilities. A function may be comprised of one or more contexts which represent the set union of the underlying capabilities. - -## Defining contexts and capabilities - -At present, all declarations of contexts and capabilities live within the typechecker and runtime. There are no plans to change this in the immediate future. - -## Basic Declarations - -A function or method may optionally choose to list one or more contexts: - -```hack no-extract -function no_listed_contexts(): void {/* some fn body */} -function empty_context()[]: void {/* some fn body */} -function one_context()[C]: void {/* some fn body */} -function many_context()[C1, C2, Cn]: void {/* some fn body */} -``` - -There exists a context named `defaults` that represents the set of capabilities present in a function prior to the introduction of this feature. When a function is not annotated with a context list, it implicitly received a list containing only the default context. - -The above declaration of `no_listed_contexts` is fully equivalent to the following: - -```hack -function no_listed_contexts()[defaults]: void {/* some fn body */} -``` - -Additionally, the context list may appear in function types: - -```hack no-extract -function has_fn_args( - (function (): void) $no_list, - (function ()[io, rand]: void) $list, - (function ()[]: void) $empty_list, -): void {/* some fn body */} - -``` - -## Interaction of Contextful Functions - -In order to invoke a function, one must have access to all capabilities required by the callee. However, the caller may have more capabilities than is required by the callee, in which case simply not all capabilities are "passed" to the callee. - -In the following example, assume the existence of a `rand` context representing the capability set `{Rand}`, an `io` context representing the capability set `{IO}`, and that the `defaults` contexts represents the capability set `{Rand, IO}`. - -```hack no-extract -/* has {} capability set */ -function pure_fun()[]: void { - return; -} - -function rand_int()[rand]: int { - return HH\Lib\PseudoRandom\int(); -} - -function rand_fun()[rand]: void { - pure_fun(); // fine: {} ⊆ {Rand} - rand_int(); // fine: {Rand} ⊆ {Rand} -} - - // recall that this has the `defaults` context -function unannotated_fun(): void { - rand_fun(); // fine: {Rand} ⊆ {IO, Rand,} -} -``` - -## Parameterized Contexts - -While most contexts and capabilities represent the binary options of existence and lack thereof, it is also possible for either/both to be parameterized. - -In the following example, assume the existence of a `throws` context representing the capability set `{Throws}`. Rather than describing that a function *can* throw, this would describe which classes of exceptions a function may throw. In that scenario, the context would require a parameter representing the exception class: `throws<-T as Exception>`. - -```hack no-extract -function throws_foo_exception()[throws]: void { // {Throws} - throw new FooException(); -} - -function throws_bar_exception()[throws]: void { // {Throws} - throw new BarException(); -} - -function throws_foo_or_bar_exception(bool $cond)[ - throws, throws // {Throws, Throws} -]: void { - if ($cond) { - throws_foo_exception(); - } else { - throws_bar_exception(); - } -} -``` - -The above would indicate that throws_foo_or_bar_exception may throw any of the listed exception classes. - -# Implications for Backwards Compatibility - -We may add additional capabilities in the future. As capabilities are specified in terms of what's permitted rather than what is not, the more restrictive your capability annotations are, the more likely it is that future changes will be incompatible with your code. This is especially true for functions that have the empty capability set. This should be considered as a tradeoff against increased confidence in more restricted code. diff --git a/guides/hack/13-contexts-and-capabilities/02-local-operations.md b/guides/hack/13-contexts-and-capabilities/02-local-operations.md deleted file mode 100644 index 8de36b0c9..000000000 --- a/guides/hack/13-contexts-and-capabilities/02-local-operations.md +++ /dev/null @@ -1,71 +0,0 @@ -**Note:** Context and capabilities are enabled by default since -[HHVM 4.93](https://hhvm.com/blog/2021/01/19/hhvm-4.93.html). - -The existence of a capability (or lack thereof) within the contexts of a function plays a direct role in the operations allowed within that function. - -Consider the following potential (although not necessarily planned) contexts (with implied matching capabilities): -* `throws`, representing the permission to throw an exception type `Te <: T` -* `io`, representing the permission to do io -* `statics`, representing the permission to access static members and global variables -* `write_prop`, representing the permission to mutate properties of objects -* `dynamic`, representing the permission to cast a value to the `dynamic` type - -In all of the below cases, the relevant local operations successfully typecheck due to the matching capabilities within the context of the function. - -```hack no-extract -function io_good()[io]: void { - echo "good"; // ok - print "also ok"; // also ok -} -``` - -```hack no-extract -class FooException extends Exception {} -class FooChildException extends FooException {} -class BarException extends Exception {} - -function throws_foo_exception()[throws]: void { - throw new FooException(); // ok: FooException <: FooException - throw new FooChildException(); // ok: FooChildException <: FooException -} - -function throws_bar_exception()[throws]: void { - throw new BarException(); // ok: BarException <: BarException -} - -function throws_foo_and_bar_exceptions()[throws, throws]: void { - throw new FooException(); // ok: FooException <: FooException - throw new FooChildException(); // ok: FooChildException <: FooException - throw new BarException(); // ok: BarException <: BarException -} -``` - -```hack no-extract -class HasAStatic { - public static int $i = 0; -} - -function reads_and_writes_static()[statics]: void { - HasAStatic::$i++; -} -``` - -```hack -class SomeClass { - public int $i = 0; -} - -function reads_and_writes_prop(SomeClass $sc)[write_props]: void { - $sc->i++; -} -``` - -```hack no-extract -function casts_to_dynamic(int $in)[dynamic]: void { - invokes_off_dynamic($in as dynamic); -} - -function invokes_off_dynamic(dynamic $in)[]: void { - $in->thisIsbananasAndDefinitelyThrowsButTypechecks(); -} -``` diff --git a/guides/hack/13-contexts-and-capabilities/03-closures.md b/guides/hack/13-contexts-and-capabilities/03-closures.md deleted file mode 100644 index ed0ac9255..000000000 --- a/guides/hack/13-contexts-and-capabilities/03-closures.md +++ /dev/null @@ -1,35 +0,0 @@ -**Note:** Context and capabilities are enabled by default since -[HHVM 4.93](https://hhvm.com/blog/2021/01/19/hhvm-4.93.html). - -As with standard functions, closures may optionally choose to list one or more contexts. Note that the outer function may or may not have its own context list. Lambdas wishing to specify a list of contexts must include a (possibly empty) parenthesized argument list. - -```hack no-extract -function some_function(): void { - $no_list = () ==> {/* some fn body */}; - $single = ()[C] ==> {/* some fn body */}; - $multiple = ()[C1, C2, Cn] ==> {/* some fn body */}; - $with_types = ()[C]: void ==> {/* some fn body */}; - // legacy functions work too - $legacy = function()[C]: void {}; -} -``` - -By default, closures require the same capabilities as the context in which they are created. - -```hack no-extract -function foo()[io]: void { // scope has {IO} - $callable1 = () ==> {/* some fn body */}; // requires {IO} - By far the most common usage -} -``` - -Explicitly annotating the closure can be used to opt-out of this implicit behaviour. This is most useful when requiring the capabilities of the outer scope result in unnecessary restrictions, such as if the closure is returned rather than being invoked within the enclosing scope. - -```hack no-extract -function foo()[io]: void { // scope has {IO} - $callable = ()[] ==> {/* some fn body */}; // requires {} - $uncallable1 = ()[rand] ==> {/* some fn body */}; // requires {Rand} - $uncallable2 = ()[defaults] ==> {/* some fn body */}; // requires the default set -} -``` - -Note that in the previous example, `$uncallable1` cannot be called as foo cannot provide the required Rand capability. `$callable` is invocable because it requires strictly fewer capabilities than `foo` can provide. diff --git a/guides/hack/13-contexts-and-capabilities/04-higher-order-functions.md b/guides/hack/13-contexts-and-capabilities/04-higher-order-functions.md deleted file mode 100644 index 3f9b45c9a..000000000 --- a/guides/hack/13-contexts-and-capabilities/04-higher-order-functions.md +++ /dev/null @@ -1,57 +0,0 @@ -**Note:** Context and capabilities are enabled by default since -[HHVM 4.93](https://hhvm.com/blog/2021/01/19/hhvm-4.93.html). - -One may define a higher order function whose context depends on the dynamic context of one or more passed in function arguments. - -```hack -function has_dependent_fn_arg( - (function()[_]: void) $f, -)[ctx $f]: void { - /* some code */ - $f(); - /* more code */ -} -``` - -One may reference the dependent context of a function argument in later arguments as well as in the return type. - -```hack no-extract -function has_double_dependent_fn_arg( - (function()[_]: void) $f1, - (function()[ctx $f1]: void) $f2, -)[rand, ctx $f1]: void { - $f1(); - $f2(); -} - -function has_dependent_return( - (function()[_]: void) $f, -)[ctx $f, io]: (function()[ctx $f]: void) { - $f(); - return $f; -} -``` - -The semantics of the argument-dependent-context are such that the higher order function's type is specialized per invocation. - -```hack no-extract -function callee( - (function()[_]: void) $f, -)[rand, ctx $f]: void { - /* some code */ - $f(); - /* more code */ -} - -function caller()[io, rand]: void { - // pass pure closure - callee(()[] ==> {/* some fn body */}); // specialized callee is {Rand} - - // pass {IO} closure - callee(()[io] ==> {echo "output"; }); // specialized callee is {Rand, IO} - // pass {IO, Rand} closure - callee(() ==> {/* some fn body */}); // callee is {Rand, IO} -} -``` - -Note that this suggests and requires that all other statements within `callee` require only the Rand capability, as the actual capabilities of the passed argument cannot be depended upon to be any specific capability. diff --git a/guides/hack/13-contexts-and-capabilities/05-contexts-and-subtyping.md b/guides/hack/13-contexts-and-capabilities/05-contexts-and-subtyping.md deleted file mode 100644 index 1ad80d609..000000000 --- a/guides/hack/13-contexts-and-capabilities/05-contexts-and-subtyping.md +++ /dev/null @@ -1,56 +0,0 @@ -**Note:** Context and capabilities are enabled by default since -[HHVM 4.93](https://hhvm.com/blog/2021/01/19/hhvm-4.93.html). - -Capabilities are contravariant. - -This implies that a closure that requires a set of capabilities Sa may be passed where the expected type is a function that requires Sb as long as Sa ⊆ Sb. - -For the following example, assume that the default context includes *at least* {Rand, IO} - -```hack no-extract -function requires_rand_io_arg((function()[rand, io]: void) $f): void { - $f(); -} - -function caller(): void { - // passing a function that requires fewer capabilities - requires_rand_io_arg(()[rand] ==> {/* some fn body */}); - // passing a function that requires no capabilities - requires_rand_io_arg(()[] ==> {/* some fn body */}); -} -``` - -Additionally, this has the standard implication on inheritance hierarchies. Note that if Sa ⊆ Sb it is the case that Sb is a subtype of Sa. - -For the following, assume the default set contains {IO, Rand, Throws}. - -```hack no-extract -class Parent_ { - public function maybeRand()[rand]: void {/* some fn body */} // {Rand} - public function maybePure(): void {/* some fn body */} // {Throws, IO, Rand} -} - -class Mid extends Parent_ { - public function maybeRand()[rand]: void {/* some fn body */} // {Rand} -> fine {Rand} ⊆ {Rand} - public function maybePure()[io]: void {/* some fn body */} // {IO} -> fine {IO} ⊆ {Throws, IO, Rand} -} - -class Child extends Mid { - public function maybeRand()[]: void {/* some fn body */} // {} -> fine {} ⊆ {Rand} - public function maybePure()[]: void {/* some fn body */} // {} -> fine {} ⊆ {IO} -} -``` - -### Capability subtyping - -In reality, there may also exist a subtyping relationship between capabilities. Thus, whenever some capability B that is subtype of capability A is available, any function or operation that requires A may be called or performed, respectively. This works identically to standard type subtyping. - -For the following, assume that the following contexts and capabilities exist: Rand, ReadFile <: Rand, rand: {Rand}, readfile: {Readfile} - -```hack no-extract -function requires_rand()[rand]: void {/* some fn body */} - -function has_readfile()[readfile]: void { - requires_rand(); // fine {readfile} ⊆ {Rand} since readfile <: rand -} -``` diff --git a/guides/hack/13-contexts-and-capabilities/06-context-constants.md b/guides/hack/13-contexts-and-capabilities/06-context-constants.md deleted file mode 100644 index 8d7e318ef..000000000 --- a/guides/hack/13-contexts-and-capabilities/06-context-constants.md +++ /dev/null @@ -1,82 +0,0 @@ -**Note:** Context and capabilities are enabled by default since -[HHVM 4.93](https://hhvm.com/blog/2021/01/19/hhvm-4.93.html). - -**Note:** Context constant *constraints* are available since HHVM 4.108. - -Classes and interfaces may define context constants: - -```hack no-extract -class WithConstant { - const ctx C = [io]; - public function has_io()[self::C]: void { - echo "I have IO!"; - } -} -``` - -They may be abstract, - -```hack -interface IWithConstant { - abstract const ctx C; -} -``` - -may have one or more bounds, - -```hack no-extract -abstract class WithConstant { - // Subclasses must require *at least* [io] - abstract const ctx CAnotherOne as [io]; - // Subclasses must require *at most* [defaults] - abstract const ctx COne super [defaults]; - // Subclasses must require *at most* [defaults] and *at least* [io, rand] - abstract const ctx CMany super [defaults] as [io, rand]; -} -``` - -and may have defaults, though only when abstract - -```hack no-extract -interface IWithConstant { - abstract const ctx C = [defaults]; - abstract const ctx CWithBound super [defaults] = [io]; -} -``` - -When inheriting a class containing a context constant with a default, the first non-abstract class that doesn’t define an implementation of that constant gets the default synthesized for it. - - -One may define a member function whose context depends on the `this` type or the exact value of context constant. - -```hack no-extract -class ClassWithConstant { - const ctx C = [io]; -} - -abstract class AnotherClassWithConstant { - abstract const ctx C; - abstract public function usesC()[this::C, ClassWithConstant::C]: void; -} -``` - -One may define a function whose context depends on the dynamic context constant of one or more passed in arguments. - -```hack no-extract -function uses_const_ctx(SomeClassWithConstant $t)[$t::C]: void { - $t->usesC(); -} -``` - -One may reference the dependent context constant of a argument in later arguments as well as in the return type. - -```hack no-extract -function uses_const_ctx_more( - SomeClassWithConstant $t, - (function()[$t::C]: void) $f -)[$t::C]: (function()[$t::C]: void) { - $f(); - $t->usesC(); - return $f; -} -``` diff --git a/guides/hack/13-contexts-and-capabilities/07-dependent-contexts-continued.md b/guides/hack/13-contexts-and-capabilities/07-dependent-contexts-continued.md deleted file mode 100644 index 7a5db8e6f..000000000 --- a/guides/hack/13-contexts-and-capabilities/07-dependent-contexts-continued.md +++ /dev/null @@ -1,45 +0,0 @@ -**Note:** Context and capabilities are enabled by default since -[HHVM 4.93](https://hhvm.com/blog/2021/01/19/hhvm-4.93.html). - -Dependent contexts may be accessed off of nullable parameters. If the dynamic value of the parameter is null, then the capability set required by that parameter is empty. - -```hack no-extract -function type_const( - ?SomeClassWithConstant $t, -)[$t::C]: void { - $t?->foo(); -} - -function fn_arg( - ?(function()[_]: void) $f, -)[ctx $f]: void { - if ($f is nonnull) { - $f(); - } -} -``` - -Parameters used for accessing a dependent context may not be reassigned. - -```hack no-extract -function nope(SomeClassWithConstant $t, (function()[_]: void) $f)[$t::C, ctx $f]: void { - // both disallowed - $t = get_some_other_value(); - $f = get_some_other_value(); -} -``` - -Dependent contexts may not be referenced within the body of a function. This restriction may be relaxed in a future version. - -```hack no-extract -function f( - (function()[_]: void $f, - SomeClassWithConstant $t, -)[rand, ctx $f, $t::C]: void { - (()[ctx $f] ==> 1)(); // Disallowed - (()[$t::C] ==> 1)(); // Disallowed - (()[rand] ==> 1)(); // Allowed, not a dependent context - (()[] ==> 1)(); // Allowed - (() ==> 1)(); // Allowed. Note that this is logically equivalent to [rand, ctx $f, $t::C] -} -``` diff --git a/guides/hack/13-contexts-and-capabilities/08-available-contexts-and-capabilities.md b/guides/hack/13-contexts-and-capabilities/08-available-contexts-and-capabilities.md deleted file mode 100644 index 710e5d6a0..000000000 --- a/guides/hack/13-contexts-and-capabilities/08-available-contexts-and-capabilities.md +++ /dev/null @@ -1,116 +0,0 @@ -**Note:** Context and capabilities are enabled by default since -[HHVM 4.93](https://hhvm.com/blog/2021/01/19/hhvm-4.93.html). - -The following contexts and capabilities are implemented at present. - -## Capabilities - -### IO - -This gates the ability to use the `echo` and `print` intrinsics within function bodies. -Additionally, built-in functions that perform output operations such as file writes and DB reads will require this capablity. - -```Hack -function does_echo_and_print(): void { - echo 'like this'; - print 'or like this'; -} -``` - -### WriteProperty - -This gates the ability to modify objects within function bodies. -Built-in functions that modify their inputs or methods that modify `$this` will require this capability. - -At present, all constructors have the ability to modify `$this`. Note that this does *not* imply that constructors can call functions requiring the WriteProperty capability. - -```Hack -// Valid example - -class SomeClass { - public string $s = ''; - public function modifyThis()[write_props]: void { - $this->s = 'this applies as well'; - } -} - -function can_write_props(SomeClass $sc)[write_props]: void { - $sc->s = 'like this'; - $sc2 = new SomeClass(); - $sc2->s = 'or like this'; -} -``` - -```Hack error -// Invalid example - -class SomeClass { - public string $s = ''; - public function modifyThis()[]: void { // pure (empty context list) - $this->s = 'this applies as well'; - } -} - -function pure_function(SomeClass $sc)[]: void { - $sc->s = 'like this'; -} -``` - -Hack Collections, being objects, require this capability to use the array access operator in a write context. - -```Hack -function modify_collection()[write_props]: void { - $v = Vector {}; - $v[] = 'like this'; - $m = Map {}; - $m['or'] = 'like this'; -} -``` - -### AccessGlobals - -This gates the ability to access static variables and globals. -Built-in functions that make use of mutable global state or expose the php-style superglobals will require this capability. - -```Hack -// Valid example - -class SomeClass { - public static string $s = ''; - public function accessStatic()[globals]: void { - self::$s; // like this - } -} - -function access_static()[globals]: void { - SomeClass::$s; // or like this -} -``` - -```Hack error -// Invalid example - -class SomeClass { - public static string $s = ''; - public function pureMethod()[]: void { - self::$s; // like this - } -} - -function pure_function()[]: void { - SomeClass::$s; // or like this -} -``` - - -## Contexts - -- `defaults` represents the capability set {IO, WriteProperty, AccessGlobals}. -- `write_props` represents the capability set {WriteProperty}. -- `globals` represents the capability set {AccessGlobals}. - -### The Empty List - -The empty context list, `[]`, has no capabilities. A function with no capabilities is the closest thing Hack has to 'pure' functions. As additional capabilities are added to Hack in the future, the restriction on these functions will increase. - -As such, this is sometimes referred to as the 'pure context'. diff --git a/guides/hack/13-contexts-and-capabilities/contexts-and-capabilties-category.txt b/guides/hack/13-contexts-and-capabilities/contexts-and-capabilties-category.txt deleted file mode 100644 index 263beb086..000000000 --- a/guides/hack/13-contexts-and-capabilities/contexts-and-capabilties-category.txt +++ /dev/null @@ -1 +0,0 @@ -Getting Started diff --git a/guides/hack/13-contexts-and-capabilities/contexts-and-capabilties-summary.txt b/guides/hack/13-contexts-and-capabilities/contexts-and-capabilties-summary.txt deleted file mode 100644 index efae5b4d4..000000000 --- a/guides/hack/13-contexts-and-capabilities/contexts-and-capabilties-summary.txt +++ /dev/null @@ -1 +0,0 @@ -Specifying capabilities and permissions for functions. diff --git a/guides/hack/14-reified-generics/01-introduction.md b/guides/hack/14-reified-generics/01-introduction.md deleted file mode 100644 index c53947263..000000000 --- a/guides/hack/14-reified-generics/01-introduction.md +++ /dev/null @@ -1,4 +0,0 @@ -**Topics covered in this section** - -* [Reified Generics](reified-generics.md) -* [Reified Generics Migration](reified-generics-migration.md) diff --git a/guides/hack/14-reified-generics/02-reified-generics.md b/guides/hack/14-reified-generics/02-reified-generics.md deleted file mode 100644 index eb5506a1a..000000000 --- a/guides/hack/14-reified-generics/02-reified-generics.md +++ /dev/null @@ -1,203 +0,0 @@ -# Reified Generics - -A _Reified Generic_ is a [Generic](/hack/generics/some-basics) with type information accessible at runtime. - -## Introduction - -Generics are currently implemented in HHVM through erasure, in which the runtime drops all information about generics. This means that generics are not available at runtime. Although the typechecker is able to use the generic types for static typechecking, we are unable to enforce generic types at runtime. - -In Hack, generics are opt-in. The goal of opt-in reified generics is to bridge the gap between generics and runtime availability while keeping erasure available to maintain performance when reification is not needed. To mark a generic as reified, simply add the `reify` keyword at the declaration site. - -## Parameter and return type verification - -```hack no-extract -class C {} - -function f(C $c): void {} - -<<__EntryPoint>> -function main(): void { - $c1 = new C(); - f($c1); // success - $c2 = new C(); - f($c2); // parameter type hint violation -} -``` - -The reified type parameter is checked as well: - -```hack no-extract -class C {} - -function f(T $x): C { - return new C(); -} - -<<__EntryPoint>> -function main(): void { - f(1); // success - f("yep"); // parameter type hint violation - f("yep"); // return type hint violation -} -``` - -## Type testing and assertion with `is` and `as` expressions - -Suppose you have a `vec` and you want to extract all types `T` from it. Prior to reified generics, you'd need to implement a new function for each type `T` but with reified generics you can do this in a generic way. Start by adding the keyword `reify` to the type parameter list. - -```Hack -function filter<<<__Enforceable>> reify T>(vec $list): vec { - $ret = vec[]; - foreach ($list as $elem) { - if ($elem is T) { - $ret[] = $elem; - } - } - return $ret; -} - -<<__EntryPoint>> -function main(): void { - filter(vec[1, "hi", true]); - // => vec[1] - filter(vec[1, "hi", true]); - // => vec["hi"] -} -``` - -Notice that the reified type parameter has the attribute `<<__Enforceable>>`. In order to use type testing and type assertion, the reified type parameter must be marked as `<<__Enforceable>>`, which means that we can fully enforce this type parameter, i.e. it does not contain any erased generics, not a function type, etc. - -```Hack no-extract -class A {} -class B {} -class C {} - -int // enforceable -A // enforceable -B // enforceable -B // enforceable -C // NOT enforceable as C's second generic is erased -``` - -## Creating an instance of a class with `new` - -Prior to reified generics, in order to create a new instance of a class without a constant class name, you'd need to pass it as `classname` which is not type safe. In the runtime, classnames are strings. - -```hack error -<<__ConsistentConstruct>> -abstract class A {} - -class B extends A {} -class C extends A {} - -function f<<<__Newable>> reify T as A>(): T { - return new T(); -} - -<<__EntryPoint>> -function main(): void { - f(); // not newable since it is abstract class - f(); // success - f(); // success -} -``` - -Notice that the reified type parameter has the attribute `<<__Newable>>`. In order for a type to be `<<__Newable>>`, the type must represent a class that's not abstract and has a consistent constructor or be a final class. Creating a new instance using the reified generics also carries across the generics given. For example, - -```Hack error -final class A {} - -function f<<<__Newable>> reify T as A>(): A { - return new T(); -} - -function demo(): void { - // creates a new A and since f's return type is A, - // this raises a type hint violation - f>(); -} -``` - -## Accessing a class constant / static class method - -```Hack -class C { - const string class_const = "hi"; - public static function h(): void {} -} - -// Without reified generics -function f(classname $x): void { - $x::class_const; - $x::h(); -} - -// With reified generics -function g(): void { - T::class_const; - T::h(); -} -``` - -Accessing static class properties (`T::$class_property`) is currently not -supported. - -## Hack Arrays - -Hack Arrays can be used as inner type for classes since we do not need to check whether each element of the `vec` is `string`. -Look at the limitations section for more information on when Hack Arrays cannot be used. - -```Hack error -class Box {} - -function foo(): Box> { - return new Box>(); // Type hint violation -} -``` - -# Limitations - -* No support for subtyping (reified type parameter on classes are invariant, they cannot be co/contra-variant - -```Hack error -class C {} // Cannot make the generic covariant -``` - -* Static class methods cannot use the reified type parameter of its class - -```Hack error -class C { - public static function f(): void { - return new T(); // Cannot use T - } -} -``` - -* Hack arrays cannot be reified when used as containers with `__Enforceable` or `__Newable` - -```Hack error -function f<<<__Enforceable>> reify T>(T $x): void { - $x is vec; // Cannot use vec - $x is T; -} - -function demo(): void { - f>(); // not enforceable -} -``` - -but can be used as inner type for classes - -* If a type parameter is reified, it must be provided at all call sites; it cannot be inferred. - -```Hack error -function f(): void {} - -function foo(): void { - f(); // need to provide the generics here -} -``` - -# Migration Features - -In order to make migrating to reified generics easier, we have added some [Migration Features](reified-generics-migration.md). diff --git a/guides/hack/14-reified-generics/03-reified-generics-migration.md b/guides/hack/14-reified-generics/03-reified-generics-migration.md deleted file mode 100644 index d6758d385..000000000 --- a/guides/hack/14-reified-generics/03-reified-generics-migration.md +++ /dev/null @@ -1,78 +0,0 @@ -# Migration Features for Reified Generics - -In order to make migrating to reified generics easier, we have added the following migration features: - -* The `<<__Soft>>` annotation on a type parameter implies the intent to switch it to reified state. If generics at call sites are not provided the type checker will raise an error, and the runtime will raise a warning so you can capture these locations through logging. The generic cannot be used in the body of the function. -* The `<<__Warn>>` annotation on a type parameter implies that if the reified generic is incorrect at parameter or return type hints locations, the runtime will raise a warning instead of type hint violation. -* The `get_type_structure()` function, given a reified type, returns the type structure representing the type. -* The `get_classname()` function, given a reified type, returns the name of the class represented by this type, or raises an exception if the type does not represent a class. - -## Example Incremental Migration - -In this part, we'll walk you through how to migrate a non reified function to a reified function. Some of these steps can be skipped depending on the use case. - -0) Beginning of time - -```Hack -class C {} -function f(C $x): void {} - -function demo(): void { - f(new C()); // OK -} -``` - -1) You have managed to write out all the type annotations (either pre-existing or by using `<<__Soft>>` annotation logging) - -```Hack error -class C<<<__Soft>> reify T> {} -function f(C $x): void {} - -function demo(): void { - f(new C()); // Typechecker error: string incompatible with int -} -``` - -2) You now want to remove `__Soft` and start using the generic. So you move `__Soft` to `__Warn`. - -```Hack error -class C<<<__Warn>> reify T> {} -function f(C $x): void {} - -function demo(): void { - f(new C()); // Runtime warning: string incompatible with int -} -``` - -3) By using logging, you have added `__Soft` to everywhere it's used and now it will be safe to remove `__Warn`. - -```Hack error -class C<<<__Warn>> reify T> {} -function f(C< <<__Soft>> int> $x): void {} - -function demo(): void { - f(new C()); // Runtime warning: string incompatible with int -} -``` - -4) `__Warn` goes away - -```Hack error -class C {} -function f(C< <<__Soft>> int> $x): void {} - -function demo(): void { - f(new C()); // Runtime warning: string incompatible with int -} -``` - -5) Fix the use site - -```Hack -class C {} -function f(C $x): void {} - -function demo(): void { - f(new C()); // OK -} -``` diff --git a/guides/hack/14-reified-generics/reified-generics-category.txt b/guides/hack/14-reified-generics/reified-generics-category.txt deleted file mode 100644 index 2eedef444..000000000 --- a/guides/hack/14-reified-generics/reified-generics-category.txt +++ /dev/null @@ -1 +0,0 @@ -Types and Generics diff --git a/guides/hack/14-reified-generics/reified-generics-summary.txt b/guides/hack/14-reified-generics/reified-generics-summary.txt deleted file mode 100644 index 2adb1afd5..000000000 --- a/guides/hack/14-reified-generics/reified-generics-summary.txt +++ /dev/null @@ -1 +0,0 @@ -Generics with type information accessible at runtime. diff --git a/guides/hack/15-asynchronous-operations/01-introduction.md b/guides/hack/15-asynchronous-operations/01-introduction.md deleted file mode 100644 index 5f474d645..000000000 --- a/guides/hack/15-asynchronous-operations/01-introduction.md +++ /dev/null @@ -1,164 +0,0 @@ -Asynchronous operations allow cooperative multi-tasking. Code that utilizes the async infrastructure can hide I/O latency and data -fetching. So, if we have code that has operations that involve some sort of waiting (e.g., network access or database queries), async -minimizes the downtime our program has to be stalled because of it as the program will go do other things, most likely other I/O somewhere else. - -Async is **not multithreading**---HHVM still executes a program's code in one main request thread—but other operations (e.g., MySQL queries) -can now execute without taking up time in that thread that code could be using for other purposes. - -## A Page as A Dependency Tree - -Imagine we have a page that contains two components: one stores data in MySQL, the other fetches from an API via cURL. Both cache results in -Memcached. The dependencies could be modeled like this: - -![Dependency Tree](/images/async/async-dependency.png) - -Code structured like this gets the most benefit from async. - -## Synchronous/Blocking IO: Sequential Execution - -If we do not use asynchronous programming, each step will be executed one-after-the-other: - -![Sequential Execution](/images/async/async-sequential.png) - -## Asynchronous Execution - -All code executes in the main request thread, but I/O does not block it, and multiple I/O or other async tasks can execute concurrently. If -code is constructed as a dependency tree and uses async I/O, this will lead to various parts of the code transparently interleaving instead of -blocking each other: - -![Asynchronous](/images/async/async-always-busy.png) - -Importantly, the order in which code executes is not guaranteed; for example, if the cURL request for Component A is slow, execution of the -same code could look more like this: - -![Asynchronous with slow cURL](/images/async/async-slow-curl.png) - -The reordering of different task instructions in this way allow us to hide I/O [latency](https://en.wikipedia.org/wiki/Latency_\(engineering\)). So, -while one task is currently sitting at an I/O instruction (e.g., waiting for data), another task's instruction, with hopefully less latency, -can execute in the meantime. - -## Limitations - -The two most important limitations are: - - All code executes in the main request thread - - Blocking APIs (e.g., `mysql_query()` and `sleep()`) do not get automatically converted to async functions; this would be unsafe as it could -change the execution order of unrelated code that might not be designed for that possibility. - -For example, given the following code: - -```Hack -use namespace HH\Lib\Vec; - -async function do_cpu_work(): Awaitable { - print("Start CPU work\n"); - $a = 0; - $b = 1; - - $list = vec[$a, $b]; - - for ($i = 0; $i < 1000; ++$i) { - $c = $a + $b; - $list[] = $c; - $a = $b; - $b = $c; - } - print("End CPU work\n"); -} - -async function do_sleep(): Awaitable { - print("Start sleep\n"); - \sleep(1); - print("End sleep\n"); -} - -async function run(): Awaitable { - print("Start of main()\n"); - await Vec\from_async(vec[do_cpu_work(), do_sleep()]); - print("End of main()\n"); -} - -<<__EntryPoint>> -function main(): void { - \HH\Asio\join(run()); -} -``` - -New users often think of async as multithreading, so expect `do_cpu_work()` and `do_sleep()` to execute in parallel; however, this will not -happen because there are no operations that can be moved to the background: - - `do_cpu_work()` only contains code with no builtins, so executes in, and blocks, the main request thread - - While `do_sleep()` does call a builtin, it is not an async builtin; so, it also must block the main request thread - -![multithreaded model vs async model](/images/async/limitations.png) - -## Async In Practice: cURL - -A naive way to make two cURL requests without async could look like this: - -```Hack -function curl_A(): mixed { - $ch = \curl_init(); - \curl_setopt($ch, \CURLOPT_URL, "http://example.com/"); - \curl_setopt($ch, \CURLOPT_RETURNTRANSFER, 1); - return \curl_exec($ch); -} - -function curl_B(): mixed { - $ch = \curl_init(); - \curl_setopt($ch, \CURLOPT_URL, "http://example.net/"); - \curl_setopt($ch, \CURLOPT_RETURNTRANSFER, 1); - return \curl_exec($ch); -} - -<<__EntryPoint>> -function main(): void { - $start = \microtime(true); - $a = curl_A(); - $b = curl_B(); - $end = \microtime(true); - echo "Total time taken: ".\strval($end - $start)." seconds\n"; -} -``` - -In the example above, the call to `curl_exec` in `curl_A` is blocking any other processing. Thus, even though `curl_B` is an independent call -from `curl_A`, it has to sit around waiting for `curl_A` to finish before beginning its execution: - -![No Async](/images/async/curl-synchronous.png) - -Fortunately, HHVM provides an async version of `curl_exec`: - -```Hack -use namespace HH\Lib\Vec; - -async function curl_A(): Awaitable { - $x = await \HH\Asio\curl_exec("http://example.com/"); - return $x; -} - -async function curl_B(): Awaitable { - $y = await \HH\Asio\curl_exec("http://example.net/"); - return $y; -} - -async function async_curl(): Awaitable { - $start = \microtime(true); - list($a, $b) = await Vec\from_async(vec[curl_A(), curl_B()]); - $end = \microtime(true); - echo "Total time taken: ".\strval($end - $start)." seconds\n"; -} - -<<__EntryPoint>> -function main(): void { - \HH\Asio\join(async_curl()); -} -``` - -The async version allows the scheduler to run other code while waiting for a response from cURL. The most likely behavior is that as we're -also awaiting a call to `curl_B`, the scheduler will choose to call it, which in turn starts another async call to `curl_exec`. As HTTP requests -are generally slow, the main thread will then be idle until one of the requests completes: - -![Async](/images/async/curl-async.png) - -This execution order is the most likely, but not guaranteed; for example, if the `curl_B` request is much faster than the `curl_A` HTTP request, -`curl_B` may complete before `curl_A`. - -The amount that async speeds up this example can vary greatly (e.g., depending on network conditions and DNS caching), but can be significant. diff --git a/guides/hack/15-asynchronous-operations/07-awaitables.md b/guides/hack/15-asynchronous-operations/07-awaitables.md deleted file mode 100644 index f9d5460c0..000000000 --- a/guides/hack/15-asynchronous-operations/07-awaitables.md +++ /dev/null @@ -1,130 +0,0 @@ -```yamlmeta -{ - "namespace": "HH\\Asio" -} -``` - -An *awaitable* is the key construct in `async` code. An awaitable is a first-class object that represents a possibly asynchronous -operation that may or may not have completed. We `await` the awaitable until the operation has completed. - -An `Awaitable` represents a particular execution; this means that awaiting the -same awaitable twice **will not** execute the code twice. For example, -while the result of both `await`s below is `42`, the `print()` call (and the -`return`) only happen once: - -```Hack -$x = async { print("Hello, world\n"); return 42; }; -\var_dump(await $x); -\var_dump(await $x); -``` - -This can be surprising when the result depends on the call stack; [exceptions](exceptions) -are the most common case of this. - -## `Awaitable` - -Awaitables are represented by the interface called `Awaitable`. While there are several classes that implement `Awaitable`, there is no -need to concern ourselves with their implementation details. `Awaitable` is the only interface we need. - -The type returned from an async function is `Awaitable`, where `T` is the final result type (e.g., `int`) of the awaited value. - -```Hack -async function foo(): Awaitable { - throw new Exception('unimplemented'); -} - -async function demo(): Awaitable { - $x = foo(); // $x will be an Awaitable - $x = await foo(); // $x will be an int -} -``` - -```Hack -async function f(): Awaitable { - return 2; -} - -// We call f() and get back an Awaitable -// Once the function is finished executing and we await the awaitable (or in -// this case, explicitly join since this call is not in an async function) to get -// the explicit result of the function call, we will get back 2. - -<<__EntryPoint>> -function join_main(): void { - var_dump(\HH\Asio\join(f())); -} -``` - -All `async` functions must return an `Awaitable`. Calling an `async` function will therefore yield an object implementing the `Awaitable` -interface, and we must `await` or `join` it to obtain an end result from the operation. When we `await`, we are pausing the current task until -the operation associated with the `Awaitable` handle is complete, leaving other tasks free to continue executing. `join` is similar; however it -blocks all other operations from completing until the `Awaitable` has returned. - -## Awaiting - -In most cases, we will prefer to `await` an `Awaitable`, so that other tasks can execute while our blocking operation completes. Note however, -that only `async` functions can yield control to other asyncs, so `await` may therefore only be used in an `async` function. For other locations, -such as a `main` block, we will need to use `join`, as will be shown below. - -### Batching Awaitables - -Many times, we will `await` on one `Awaitable`, get the result, and move on. For example: - -```Hack -async function foo(): Awaitable { - return 3; -} - -<<__EntryPoint>> -async function single_awaitable_main(): Awaitable { - $aw = foo(); // awaitable of type Awaitable - $result = await $aw; // an int after $aw completes - var_dump($result); -} -``` - -We will normally see something like `await f();` which combines the retrieval of the awaitable with the waiting and retrieving of the result -of that awaitable. The example above separates it out for illustration purposes. - -At other times, we will gather a bunch of awaitables and `await` them all before moving on. - -Here we are using one of the library helper-functions in order to batch a bunch of awaitables together to then `await` upon: -* `HH\Lib\Vec\from_async`: vec of awaitables with consecutive integer keys -* `HH\Lib\Dict\from_async`: dict of awaitables with integer or string keys - -```Hack -async function quads(float $n): Awaitable { - return $n * 4.0; -} - -<<__EntryPoint>> -async function quads_m(): Awaitable { - $awaitables = dict['five' => quads(5.0), 'nine' => quads(9.0)]; - $results = await Dict\from_async($awaitables); - - \var_dump($results['five']); // float(20) - \var_dump($results['nine']); // float(36) -} -``` - -## Join - -Sometimes we want to get a result out of an awaitable when the function we are in is *not* `async`. For this there is `HH\Asio\join`, which -takes an `Awaitable` and blocks until it resolves to a result. - -This means that invocations of async functions from the top-level scope cannot be awaited, and must be joined. - -```Hack -async function get_raw(string $url): Awaitable { - return await \HH\Asio\curl_exec($url); -} - -<<__EntryPoint>> -function join_main(): void { - $result = \HH\Asio\join(get_raw("http://www.example.com")); - \var_dump(\substr($result, 0, 10)); -} -``` - -We should **not** call `join` inside an `async` function. This would defeat the purpose of `async`, as the awaitable and any dependencies will -run to completion synchronously, stopping any other awaitables from running. diff --git a/guides/hack/15-asynchronous-operations/10-exceptions.md b/guides/hack/15-asynchronous-operations/10-exceptions.md deleted file mode 100644 index 3e6630cc0..000000000 --- a/guides/hack/15-asynchronous-operations/10-exceptions.md +++ /dev/null @@ -1,136 +0,0 @@ -In general, an async operation has the following pattern: -* Call an `async` function -* Get an awaitable back -* `await` the awaitable to get a result - -If an exception is thrown within an `async` function body, the function does not -technically throw - it returns an `Awaitable` that throws when resolved. This -means that if an `Awaitable` is resolved multiple times, the same exception -object instance will be thrown every time; as it is the same object every time, -its data will be unchanged, **including backtraces**. - -```Hack -async function exception_thrower(): Awaitable { - throw new \Exception("Return exception handle"); -} - -async function basic_exception(): Awaitable { - // the handle does not throw, but result will be an Exception objection. - // Remember, this is the same as: - // $handle = exception_thrower(); - // await $handle; - await exception_thrower(); -} - -<<__EntryPoint>> -function main(): void { - HH\Asio\join(basic_exception()); -} -``` - -The use of `from_async` ignores any successful awaitable results and just throw an exception of one of the -awaitable results, if one of the results was an exception. - -```Hack -async function exception_thrower(): Awaitable { - throw new \Exception("Return exception handle"); -} - -async function non_exception_thrower(): Awaitable { - return 2; -} - -async function multiple_waithandle_exception(): Awaitable { - $handles = vec[exception_thrower(), non_exception_thrower()]; - // You will get a fatal error here with the exception thrown - $results = await Vec\from_async($handles); - // This won't happen - var_dump($results); -} - -<<__EntryPoint>> -function main(): void { - HH\Asio\join(multiple_waithandle_exception()); -} -``` - -To get around this, and get the successful results as well, we can use the [utility function](utility-functions.md) -[`HH\Asio\wrap`](/hack/reference/function/HH.Asio.wrap/). It takes an awaitable and returns the expected result or the exception -if one was thrown. The exception it gives back is of the type [`ResultOrExceptionWrapper`](/hack/reference/interface/HH.Asio.ResultOrExceptionWrapper/). - -```Hack no-extract -namespace HH\Asio { - interface ResultOrExceptionWrapper { - public function isSucceeded(): bool; - public function isFailed(): bool; - public function getResult(): T; - public function getException(): Exception; - } -} -``` - -Taking the example above and using the wrapping mechanism, this is what the code looks like: - -```Hack -async function exception_thrower(): Awaitable { - throw new Exception(); -} - -async function non_exception_thrower(): Awaitable { - return 2; -} - -async function wrapping_exceptions(): Awaitable { - $handles = vec[ - HH\Asio\wrap(exception_thrower()), - HH\Asio\wrap(non_exception_thrower()), - ]; - // Since we wrapped, the results will contain both the exception and the - // integer result - $results = await Vec\from_async($handles); - var_dump($results); -} - -<<__EntryPoint>> -function main(): void { - HH\Asio\join(wrapping_exceptions()); -} -``` - -## Memoized Async Exceptions -Because [`__Memoize`](../attributes/predefined-attributes#__memoize) caches the awaitable itself, **if an async function -is memoized and throws, you will get the same exception backtrace on every -failed call**. - -For example, both times an exception is caught here, `foo` is in the backtrace, -but `bar` is not, as the call to `foo` led to the creation of the memoized -awaitable: - -```Hack -<<__Memoize>> -async function throw_something(): Awaitable { - throw new Exception(); -} - -async function foo(): Awaitable { - await throw_something(); -} - -async function bar(): Awaitable { - await throw_something(); -} - -<<__EntryPoint>> -async function main(): Awaitable { - try { - await foo(); - } catch (Exception $e) { - var_dump($e->getTrace()[2] as shape('function' => string, ...)['function']); - } - try { - await bar(); - } catch (Exception $e) { - var_dump($e->getTrace()[2] as shape('function' => string, ...)['function']); - } -} -``` diff --git a/guides/hack/15-asynchronous-operations/13-async-blocks.md b/guides/hack/15-asynchronous-operations/13-async-blocks.md deleted file mode 100644 index f42851680..000000000 --- a/guides/hack/15-asynchronous-operations/13-async-blocks.md +++ /dev/null @@ -1,103 +0,0 @@ -Inside a lengthy async function, it's generally a good idea to group together data fetches that are independent of the rest of the -function. This reduces unneeded waiting for I/O. - -To express this grouping inline, we would usually have to use a helper function; however, an async block allows for the immediate execution -of a grouping of code, possibly within zero-argument, async lambdas. - -## Syntax - -The syntax for an async block is: - -``` -async { - // grouped together calls, usually await. - < statements > -} -``` - -## Usage - -Async blocks have two main use-cases. Remember, this is essentially syntactic sugar to make life easier. -- Inline simple async statements that would before have required a function call to execute. -- Replace the call required by an async lambda to return an actual `Awaitable`. - -```Hack -async function get_int_async(): Awaitable { - return 4; -} - -async function get_float_async(): Awaitable { - return 1.2; -} - -async function get_string_async(): Awaitable { - return "Hello"; -} - -async function call_async((function(): Awaitable) $gen): Awaitable { - return await $gen(); -} - -async function use_async_lambda(): Awaitable { - // To use an async lambda with no arguments, you would need to have a helper - // function to return an actual Awaitable for you. - $x = await call_async( - async () ==> { - $y = await get_float_async(); - $z = await get_int_async(); - return \round($y) + $z; - }, - ); - \var_dump($x); -} - -async function use_async_block(): Awaitable { - // With an async block, no helper function is needed. It is all built-in to the - // async block itself. - $x = await async { - $y = await get_float_async(); - $z = await get_int_async(); - return \round($y) + $z; - }; - \var_dump($x); -} - -async function call_async_function(): Awaitable { - // Normally we have to call a simple async function and get its value, even - // if it takes no arguments, etc. - $x = await get_string_async(); - \var_dump($x); -} - -async function use_async_block_2(): Awaitable { - // Here we can inline our function right in the async block - $x = await async { - return "Hello"; - }; - \var_dump($x); -} - -<<__EntryPoint>> -function main(): void { - \HH\Asio\join(use_async_lambda()); - \HH\Asio\join(use_async_block()); - \HH\Asio\join(call_async_function()); - \HH\Asio\join(use_async_block_2()); -} -``` - -## Limitations - -The typechecker does not allow the use of an async block immediately on the right-hand side of the `==>` in a lambda-creation expression. - -In async named-functions, `async` immediately precedes `function`, which, in turn, immediately precedes the parameters. In async -lambdas, `async` also immediately precedes the parameters. - -So: - -```Hack no-extract -$x = async () ==> { ... } // good -$x = () ==> async { ... } // bad -``` - -Basically, this is just a safety guard to reduce the likelihood of unintended behavior. diff --git a/guides/hack/15-asynchronous-operations/14-concurrent.md b/guides/hack/15-asynchronous-operations/14-concurrent.md deleted file mode 100644 index 90bc98c4d..000000000 --- a/guides/hack/15-asynchronous-operations/14-concurrent.md +++ /dev/null @@ -1,66 +0,0 @@ -`concurrent` concurrently awaits all `await`s within a `concurrent` block and it works with [`await`-as-an-expression](await-as-an-expression.md) as well! - -Note: [concurrent doesn't mean multithreading](some-basics#limitations) - -## Syntax - -```Hack no-extract -concurrent { - $x = await x_async(); - await void_async(); - $sum = await y_async() + await z_async()(); -} -$y = $x + $sum; -``` - -## Order-of-execution - -Each of the statements in a `concurrent` block should be thought of as running concurrently. This means there shouldn't be any dependencies between the statements in a `concurrent` block. - -Similar to `await`-as-an-expression, `concurrent` blocks don't provide a guaranteed order-of-execution between expressions being evaluated for any statement in the `concurrent` block. We guarantee that modifications to locals will happen after all other expressions resolve and will happen in the order in which they would happen outside a `concurrent` block. - -For this example, we provide no guarantee on the execution order of the calls to `x()`, `y_async()` and `z_async()`. The assignments into `$result` are guaranteed to be well ordered however. - -```Hack no-extract -$result = vec[]; -concurrent { - $result[] = x() + await y_async(); - $result[] = await z_async(); -} -``` - -## Exceptions - -If any statement in a `concurrent` block throws, there are no guarantees about which (if any) awaited values were assigned or which exception will be propagated if more than one of them threw. For example if you have: - -```Hack no-extract -$x = 0; -try { - concurrent { - $x = await async { return 1; }; - await async { throw new Exception('foo'); }; - await async { throw new Exception('bar'); }; - } -} catch (Exception $e) { - var_dump($x, $e->getMessage()); -} -``` -Then it is explicitly undefined whether `var_dump` will see `$x === 0` or `$x === 1` and whether the message will be 'foo' or 'bar'. - -If you need granular exception handling, consider using nested try-catch blocks inside the concurrent block: - -```Hack no-extract -concurrent { - $x = await async { - try { - ... - return ; - } catch (...) { - return ; - } - }; - $y = await async { - // same here - }; -} -``` diff --git a/guides/hack/15-asynchronous-operations/15-await-as-an-expression.md b/guides/hack/15-asynchronous-operations/15-await-as-an-expression.md deleted file mode 100644 index f672ba366..000000000 --- a/guides/hack/15-asynchronous-operations/15-await-as-an-expression.md +++ /dev/null @@ -1,78 +0,0 @@ -To strike a balance between flexibility, latency, and performance, we require that the `await`s only appear in **unconditionally consumed expression positions**. This means that from the closest statement, the result of the `await` must be used under all non-throwing cases. This is important because all `await`s for a statement will run together, we don't want to over-run code if its result might not be utilized. - -All `await`s within the same statement will execute concurrently. - -## Examples - -```Hack no-extract -$sum = - await x_async() + // yes! - await y_async(); // yes! -$tuple = tuple( - await foo_async(), // yes! - 42, -); -$result = foo( - await bar_async(), // yes! - await baz_async(), // yes! -); -if (await x_async()) { // yes! - // Conditional but separate statement - await y_async(); // yes! -} -$x = - await x_async() && // yes! - // Conditional expression - await y_async(); // no! -$y = await x_async() // yes! - ? await y_async() // no! - : await z_async(); // no! -$x = await async { // yes! - await x_async(); // yes! -} -``` - -## Order-of-execution - -Similar to other aspects of `await`, we do not guarantee an order of execution of the expressions within a statement that contains `await`, but you should assume it could be significantly different than if the `await` wasn't present. **If you want stronger guarantees over order-of-execution, separate `await`s into their own statements.** - -In this example, you should make no assumptions about the order in which `a_async()`, `b()`, `c_async()` or `d()` are executed, but you can assume that both `await`'ed functions (`a_async()` and `c_async()`) will be concurrently awaited. - -```Hack no-extract -$x = foo( - await a_async(), - b(), - await c_async(), - d(), -); -``` - -## Limitations - -To further help protect against depending on order-of-execution, we've -banned assignment or updating variables as-an-expression for -statements that contain an `await`. - -```Hack no-extract -// Yes! -$x = await x_async(); -// No, assignment as an expression -await foo_async($x = 42); -// No, we even disallow separate assignment -(await bar_async()) + ($x = 42); -// Yes! -$x = f(inout $y, await x_async()); -// Yes, embedded call w/ inout is considered an expression -await bar_async(baz(inout $x)); -``` - -Hack doesn't currently support nested `await`s. - -```Hack error -// Syntax error. -$y = await foo_async(await bar_async()); - -// Must be written as this instead. -$x = await bar_async(); -$y = await foo_async($x); -``` diff --git a/guides/hack/15-asynchronous-operations/16-utility-functions.md b/guides/hack/15-asynchronous-operations/16-utility-functions.md deleted file mode 100644 index d4ed55538..000000000 --- a/guides/hack/15-asynchronous-operations/16-utility-functions.md +++ /dev/null @@ -1,31 +0,0 @@ -Async can be used effectively with the basic, built in infrastructure in HHVM, along with some HSL functions. This basic infrastructure includes: -* [`async`](../asynchronous-operations/introduction.md), [`await`](../asynchronous-operations/awaitables), [`Awaitable`](../asynchronous-operations/awaitables) -* `HH\Lib\Vec\from_async()`, `HH\Lib\Dict\from_async()` - -However, there are cases when we want to convert some collection of values to awaitables or we want to filter some awaitables out -of a collection of awaitables. These types of scenarios come up when we are creating multiple awaitables to await in parallel. Some -of the functions that help with this are: - -Name | Returns | Description ------|---------|------------ -`HH\Lib\Vec\filter_async` | `Awaitable>` | Returns a new vec containing only the values for which the given async predicate returns `true`. -`HH\Lib\Vec\from_async` | `Awaitable>` | Returns a new vec with each value awaited in parallel. -`HH\Lib\Vec\map_async` | `Awaitable>` | Returns a new vec where each value is the result of calling the given async function on the original value. -`HH\Lib\Dict\filter_async` | `Awaitable>` | Returns a new dict containing only the values for which the given async predicate returns `true`. -`HH\Lib\Dict\filter_with_key_async` | `Awaitable>` | Like `filter_async`, but lets you utilize the keys of your dict too. -`HH\Lib\Dict\from_async` | `Awaitable>` | Returns a new dict where each value is the result of calling the given async function on the original value. -`HH\Lib\Dict\from_keys_async` | `Awaitable>` | Returns a new dict where each value is the result of calling the given async function on the corresponding key. -`HH\Lib\Dict\map_async` | `Awaitable>` | Returns a new dict where each value is the result of calling the given async function on the original value. -`HH\Lib\Keyset\filter_async` | `Awaitable>` | Returns a new keyset containing only the values for which the given async predicate returns `true`. -`HH\Lib\Keyset\from_async` | `Awaitable>` | Returns a new keyset containing the awaited result of the given Awaitables. -`HH\Lib\Keyset\map_async` | `Awaitable>` | Returns a new keyset where the value is the result of calling the given async function on the original values in the given traversable. - -## Other Convenience Functions - -There are three convenience-functions tailored for use with async. They are: - -Name | Returns | Description ------|---------|------------ -`HH\Asio\usleep(int)` | `Awaitable` | Wait a given length of time before an async function does more work. -`HH\Asio\later()` | `Awaitable` | Reschedule the work of an async function until some undetermined point in the future. -`HH\Asio\wrap(Awaitable)` | `Awaitable>` | Wrap an `Awaitable` into an `Awaitable` of `ResultOrExceptionWrapper`. diff --git a/guides/hack/15-asynchronous-operations/19-extensions.md b/guides/hack/15-asynchronous-operations/19-extensions.md deleted file mode 100644 index a7d01e59b..000000000 --- a/guides/hack/15-asynchronous-operations/19-extensions.md +++ /dev/null @@ -1,322 +0,0 @@ -Async in and of itself is a highly useful construct that can provide possible time-saving through its cooperative multitasking -infrastructure. Async is especially useful with database access and caching, web resource access, and dealing with streams. - -## MySQL - -The async MySQL extension provides a Hack API to query MySQL and similar databases. All relevant methods return an `Awaitable`, -which gives your code control over how it spends the time until the result is ready. - -The [full API](../reference/class/AsyncMysqlConnection/) contains all of the classes and methods available for accessing MySQL via async; we -will only cover a few of the more common scenarios here. - -The primary class for connecting to a MySQL database is [`AsyncMysqlConnectionPool`](../reference/class/AsyncMysqlClient/) and its -primary method is the `async` [`connect`](../reference/class/AsyncMysqlClient/connect/). - -The primary class for querying a database is [`AsyncMysqlConnection`](../reference/class/AsyncMysqlConnection/) with the three main query methods: -`AsyncMysqlConnection::query`, `AsyncMysqlConnection::queryf`, and `AsyncMysqlConnection::queryAsync` -all of which are `async`. The naming conventions for async methods have not been applied consistently. -There is also a method which turns a raw string into an SQL escaped string `AsyncMysqlConnection::escapeString`. -This method should only be used in combination with `AsyncMysqlConnection::query`. - -## Choosing a query method - -### `AsyncMysqlConnection::queryAsync` -This method is the go-to for safe SQL queries. It handles escaping user input automatically and the `%Q` placeholder can be used to insert query fragments into other query fragments. - -For example: - - selecting a post by ID -```SQL -SELECT title, body FROM posts WHERE id %=d -``` - - Advanced search, which may allow the user to specify a handful of parameters -```SQL -SELECT %LC FROM %T WHERE %Q -``` - - Inserting _n_ rows in one big INSERT INTO statement -```SQL -INSERT INTO %T (%LC) VALUES (%Q) -``` - -For a list of all placeholders supported by `queryAsync`, see `HH\Lib\SQL\QueryFormatString`. -Most placeholders are documented with examples here `AsyncMysqlConnection::queryf`. -The types for the `%Lx` placeholders is not a Hack Collection when using queryAsync, but a Hack array instead. -The documentation for `%Q` is flat out wrong for using `queryAsync` and should be ignored. - -### `AsyncMysqlConnection::query` -This method is **dangerous** when used wrong. It accepts a _raw string_ and passes it to the database without scanning for dangerous characters or doing any automatic escaping. -If your query contains ANY unescaped input, you are putting your database at risk. - -Using this method is preferred for one use case: - -When you can type out the query outright, without string interpolation or string concatenation. -You can pass in a _hardcoded_ query. This can be preferred over `queryAsync` and `queryf`, since you can write your SQL string literals without having to write a `%s` placeholder. Which makes it easier to change the query later without the risk of messing up which parameter goes with which `%s`. - -This method can also be used to create queries by doing string manipulation. If you are doing this, you, the developer, must take responsibility for sanitizing the data. Escape everything that needs to be escaped and make triple sure there is not a sneaky way to get raw user data into the concatenated string at any point. As said, this method is dangerous and this is why. - -### `AsyncMysqlConnection::queryf` -Is an older API which does what `queryAsync` does, but with more restrictions. It uses Hack Collections instead of Hack arrays for its `%Lx` arguments. There is no way to create fragments of queries for safe query building. It is also not possible to build a query without having an `\AsyncMysqlConnection`. New code should use `queryAsync` instead. - -## Getting results -The primary class for retrieving results from a query is an abstract class called `AsyncMysqlResult`, which itself has two concrete -subclasses called [`AsyncMysqlQueryResult`](../reference/class/AsyncMysqlQueryResult/) and -[`AsyncMysqlErrorResult`](../reference/class/AsyncMysqlErrorResult/). The main methods on these classes are -[`vectorRows`](../reference/class/AsyncMysqlQueryResult/vectorRows/) | [`vectorRowsTyped`](../reference/class/AsyncMysqlQueryResult/vectorRowsTyped/) and [`mapRows`](../reference/class/AsyncMysqlQueryResult/mapRows/) | [`mapRowsTyped`](../reference/class/AsyncMysqlQueryResult/mapRowsTyped/), which are *non-async*. - -### When to use the `____Typed` variant over its untyped counterpart. - -The typed functions will help you by turning database integers into Hack `int`s and _some, but not all_ fractional numbers into Hack `float`s. -This is almost always preferred, except for cases where the result set includes unsigned 64-bit integers (UNSIGNED BIGINT). -These numbers may be larger than the largest representable signed 64-bit integer and can therefore not be used in a Hack program. -The runtime currently returns the largest signed 64-bit integer for all values which exceed the maximum signed 64-bit integer. - -The untyped function will return all fields as either a Hack `string` or a Hack `null`. So an integer `404` in the database would come back as `"404"`. - -Here is a simple example that shows how to get a user name from a database using this extension: - -```Hack no-extract -async function get_connection(): Awaitable { - // Get a connection pool with default options - $pool = new AsyncMysqlConnectionPool(darray[]); - // Change credentials to something that works in order to test this code - return await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); -} - -async function fetch_user_name( - AsyncMysqlConnection $conn, - int $user_id, -): Awaitable { - // Your table and column may differ, of course - $result = await $conn->queryf( - 'SELECT name from test_table WHERE userID = %d', - $user_id, - ); - // There shouldn't be more than one row returned for one user id - invariant($result->numRows() === 1, 'one row exactly'); - // A vector of vector objects holding the string values of each column - // in the query - $vector = $result->vectorRows(); - return $vector[0][0]; // We had one column in our query -} - -async function get_user_info( - AsyncMysqlConnection $conn, - string $user, -): Awaitable>> { - $result = await $conn->queryf( - 'SELECT * from test_table WHERE name %=s', - $user, - ); - // A vector of map objects holding the string values of each column - // in the query, and the keys being the column names - $map = $result->mapRows(); - return $map; -} - -<<__EntryPoint>> -async function async_mysql_tutorial(): Awaitable { - $conn = await get_connection(); - if ($conn !== null) { - $result = await fetch_user_name($conn, 2); - var_dump($result); - $info = await get_user_info($conn, 'Fred Emmott'); - var_dump($info is vec<_>); - var_dump($info[0] is dict<_, _>); - } -} -``` - -### Connection Pools - -The async MySQL extension does *not* support multiplexing; each concurrent query requires its own connection. However, the extension -does support connection pooling. - -The async MySQL extension provides a mechanism to pool connection objects so we don't have to create a new connection every time we -want to make a query. The class is [`AsyncMysqlConnectionPool`](../reference/class/AsyncMysqlConnectionPool/) and one can be created like this: - -```hack no-extract -function get_pool(): AsyncMysqlConnectionPool { - return new AsyncMysqlConnectionPool( - darray['pool_connection_limit' => 100], - ); // See API for more pool options -} - -async function get_connection(): Awaitable { - $pool = get_pool(); - $conn = await $pool->connect( - CI::$host, - CI::$port, - CI::$db, - CI::$user, - CI::$passwd, - ); - return $conn; -} - -<<__EntryPoint>> -async function run(): Awaitable { - $conn = await get_connection(); - var_dump($conn); -} -``` - -It is ***highly recommended*** that connection pools are used for MySQL connections; if for some reason we really need one, single asynchronous -client, there is an [`AsyncMysqlClient`](../reference/class/AsyncMysqlClient/) class that provides a -[`connect`](../reference/class/AsyncMysqlClient/connect/) method. - -## MCRouter - -MCRouter is a memcached protocol-routing library. To help with [memcached](http://php.net/manual/en/book.memcached.php) deployment, it -provides features such as connection pooling and prefix-based routing. - -The async MCRouter extension is basically an async subset of the Memcached extension that is part of HHVM. The primary class is -`MCRouter`. There are two ways to create an instance of an MCRouter object. The -[`createSimple`](../reference/class/MCRouter/createSimple/) method takes a vector of server addresses where memcached is running. The -more configurable [`__construct`](../reference/class/MCRouter/__construct/) method allows for more option tweaking. After getting an object, -we can use the `async` versions of the core memcached protocol methods like [`add`](../reference/class/MCRouter/add/), -[`get`](../reference/class/MCRouter/get/) and [`del`](../reference/class/MCRouter/del/). - -Here is a simple example showing how one might get a user name from memcached: - -```hack no-extract -function get_mcrouter_object(): MCRouter { - $servers = Vector {\getenv('HHVM_TEST_MCROUTER')}; - $mc = MCRouter::createSimple($servers); - return $mc; -} - -async function add_user_name( - MCRouter $mcr, - int $id, - string $value, -): Awaitable { - $key = 'name:'.$id; - await $mcr->set($key, $value); -} - -async function get_user_name(\MCRouter $mcr, int $user_id): Awaitable { - $key = 'name:'.$user_id; - try { - $res = await HH\Asio\wrap($mcr->get($key)); - if ($res->isSucceeded()) { - return $res->getResult(); - } - return ""; - } catch (\MCRouterException $ex) { - echo $ex->getKey().\PHP_EOL.$ex->getOp(); - return ""; - } -} - -<<__EntryPoint>> -async function run(): Awaitable { - $mcr = get_mcrouter_object(); - await add_user_name($mcr, 1, 'Joel'); - $name = await get_user_name($mcr, 1); - var_dump($name); // Should print "Joel" -} -``` - -If an issue occurs when using this protocol, two possible exceptions can be thrown: `MCRouterException` when something goes wrong with -a core option, like deleting a key; `MCRouterOptionException` when the provide option list can't be parsed. - -## cURL - -Hack currently provides two async functions for [cURL](http://curl.haxx.se/). - -### `curl_multi_await` - -cURL provides a data transfer library for URLs. The async cURL extension provides two functions, one of which is a wrapper around the -other. `curl_multi_await` is the async version of HHVM's `curl_multi_select`. It waits until there is activity on the cURL handle and -when it completes, we use `curl_multi_exec` to process the result, just as we would in the non-async situation. - -```hack no-extract -async function curl_multi_await(resource $mh, float $timeout = 1.0): Awaitable; -``` - -### `curl_exec` - -The function `HH\Asio\curl_exec` is a wrapper around `curl_multi_await`. It is easy to use as we don't necessarily have to worry about -resource creation since we can just pass a string URL to it. - -```hack no-extract -namespace HH\Asio { - async function curl_exec(mixed $urlOrHandle): Awaitable; -} -``` - -Here is an example of getting a vector of URL contents, using a lambda expression to cut down on the code verbosity that would come with -full closure syntax: - -```hack no-extract -function get_urls(): vec { - return vec[ - "http://example.com", - "http://example.net", - "http://example.org", - ]; -} - -async function get_combined_contents( - vec $urls, -): Awaitable> { - // Use lambda shorthand syntax here instead of full closure syntax - $handles = Vec\map_with_key( - $urls, - ($idx, $url) ==> HH\Asio\curl_exec($url), - ); - $contents = await Vec\from_async($handles); - echo C\count($contents)."\n"; - return $contents; -} - -<<__EntryPoint>> -function main(): void { - HH\Asio\join(get_combined_contents(get_urls())); -} -``` - -## Streams - -The async stream extension has one function, [`stream_await`](../reference/function/stream_await/), which is functionally similar -to HHVM's [`stream_select`](http://php.net/manual/en/function.stream-select.php). It waits for a stream to enter a state (e.g., -`STREAM_AWAIT_READY`), but without the multiplexing functionality of [`stream_select`](http://php.net/manual/en/function.stream-select.php). We -can use [HH\Lib\Vec\from_async](../reference/function/HH.Lib.Vec.from_async/) to await multiple stream handles, but the resulting combined awaitable won't be complete -until all of the underlying streams have completed. - -```Hack no-extract -async function stream_await(resource $fp, int $events, float $timeout = 0.0): Awaitable; -``` - -The following example shows how to use [`stream_await`](../reference/function/stream_await/) to write to resources: - -```Hack -function get_resources(): vec { - $r1 = fopen('php://stdout', 'w'); - $r2 = fopen('php://stdout', 'w'); - $r3 = fopen('php://stdout', 'w'); - - return vec[$r1, $r2, $r3]; -} - -async function write_all(vec $resources): Awaitable { - $write_single_resource = async function(resource $r) { - $status = await stream_await($r, STREAM_AWAIT_WRITE, 1.0); - if ($status === STREAM_AWAIT_READY) { - fwrite($r, str_shuffle('ABCDEF').\PHP_EOL); - } - }; - // You will get 3 shuffled strings, each on a separate line. - await Vec\from_async(\array_map($write_single_resource, $resources)); -} - -<<__EntryPoint>> -function main(): void { - HH\Asio\join(write_all(get_resources())); -} -``` diff --git a/guides/hack/15-asynchronous-operations/22-generators.md b/guides/hack/15-asynchronous-operations/22-generators.md deleted file mode 100644 index b122011db..000000000 --- a/guides/hack/15-asynchronous-operations/22-generators.md +++ /dev/null @@ -1,153 +0,0 @@ -[Generators](http://php.net/manual/en/language.generators.overview.php) provide a more compact way to write an -[iterator](http://php.net/manual/en/language.oop5.iterations.php). Generators work by passing control back and forth between the -generator and the calling code. Instead of returning once or requiring something that could be memory-intensive like an array, generators -yield values to the calling code as many times as necessary in order to provide the values being iterated over. - -Generators can be `async` functions; an async generator behaves similarly to a normal generator except that each yielded value is an -`Awaitable` that is `await`ed upon. - -## Async Iterators - -To yield values or key/value pairs from async generators, we return [HH\AsyncIterator](/hack/reference/interface/HH.AsyncIterator/) or -[HH\AsyncKeyedIterator](/hack/reference/interface/HH.AsyncKeyedIterator/), respectively. - -Here is an example of using the [async utility function](../asynchronous-operations/utility-functions.md) -[`usleep`](/hack/reference/function/HH.Asio.usleep/) to imitate a second-by-second countdown clock. Note that in the -`happy_new_year` `foreach` loop we have the syntax `await as`. This is shorthand for calling `await $ait->next()`. - -```Hack -const int SECOND = 1000000; // microseconds - -async function countdown(int $from): AsyncIterator { - for ($i = $from; $i >= 0; --$i) { - await \HH\Asio\usleep(SECOND); - // Every second, a value will be yielded back to the caller, happy_new_year() - yield $i; - } -} - -async function happy_new_year(int $start): Awaitable { - // Get the AsyncIterator that enables the countdown - $ait = countdown($start); - foreach ($ait await as $time) { - // we are awaiting the returned awaitable, so this will be an int - if ($time > 0) { - echo $time."\n"; - } else { - echo "HAPPY NEW YEAR!!!\n"; - } - } -} - -<<__EntryPoint>> -function run(): void { - \HH\Asio\join(happy_new_year(5)); // 5 second countdown -} -``` - -We must use `await as`; otherwise we'll not get the iterated value. - -Although `await as` is just like calling `await $gen->next()`, we should always use `await as`. Calling the -[`AsyncGenerator`](/hack/reference/class/HH.AsyncGenerator/) methods directly is rarely needed. Also note that on async iterators, -`await as` or a call to [`next`](/hack/reference/class/HH.AsyncGenerator/next/) actually returns a value (instead of `void` like in a normal iterator). - -## Sending and Raising - -**Calling these methods directly should be rarely needed; `await as` should be the most common way to access values returned by an iterator.** - -We can send a value to a generator using [`send`](/hack/reference/class/HH.AsyncGenerator/send/) and raise an exception upon a -generator using [`raise`](/hack/reference/class/HH.AsyncGenerator/raise/). - -If we are doing either of these two things, our generator must return `AsyncGenerator`. An `AsyncGenenator` has three type -parameters: the key, the value. And the type being passed to [`send`](/hack/reference/class/HH.AsyncGenerator/send/). - -```Hack -const int HALF_SECOND = 500000; // microseconds - -async function get_name_string(int $id): Awaitable { - // simulate fetch to database where we would actually use $id - await \HH\Asio\usleep(HALF_SECOND); - return \str_shuffle("ABCDEFG"); -} - -async function generate(): AsyncGenerator { - $id = yield 0 => ''; // initialize $id - // $id is a ?int; you can pass null to send() - while ($id is nonnull) { - $name = await get_name_string($id); - $id = yield $id => $name; // key/string pair - } -} - -async function associate_ids_to_names(vec $ids): Awaitable { - $async_generator = generate(); - // You have to call next() before you send. So this is the priming step and - // you will get the initialization result from generate() - $result = await $async_generator->next(); - \var_dump($result); - - foreach ($ids as $id) { - // $result will be an array of ?int and string - $result = await $async_generator->send($id); - \var_dump($result); - } -} - -<<__EntryPoint>> -function run(): void { - $ids = vec[1, 2, 3, 4]; - \HH\Asio\join(associate_ids_to_names($ids)); -} -``` - -Here is how to raise an exception to an async generator. - -```Hack -const int HALF_SECOND = 500000; // microseconds - -async function get_name_string(int $id): Awaitable { - // simulate fetch to database where we would actually use $id - await \HH\Asio\usleep(HALF_SECOND); - return \str_shuffle("ABCDEFG"); -} - -async function generate(): AsyncGenerator { - $id = yield 0 => ''; // initialize $id - // $id is a ?int; you can pass null to send() - while ($id is nonnull) { - $name = ""; - try { - $name = await get_name_string($id); - $id = yield $id => $name; // key/string pair - } catch (\Exception $ex) { - \var_dump($ex->getMessage()); - $id = yield 0 => ''; - } - } -} - -async function associate_ids_to_names(vec $ids): Awaitable { - $async_generator = generate(); - // You have to call next() before you send. So this is the priming step and - // you will get the initialization result from generate() - $result = await $async_generator->next(); - \var_dump($result); - - foreach ($ids as $id) { - if ($id === 3) { - $result = await $async_generator->raise( - new \Exception("Id of 3 is bad!"), - ); - } else { - $result = await $async_generator->send($id); - } - \var_dump($result); - } -} - -<<__EntryPoint>> -function run(): void { - $ids = vec[1, 2, 3, 4]; - \HH\Asio\join(associate_ids_to_names($ids)); -} -``` diff --git a/guides/hack/15-asynchronous-operations/28-guidelines.md b/guides/hack/15-asynchronous-operations/28-guidelines.md deleted file mode 100644 index 617edbdf0..000000000 --- a/guides/hack/15-asynchronous-operations/28-guidelines.md +++ /dev/null @@ -1,512 +0,0 @@ -It might be tempting to just sprinkle `async`, `await` and `Awaitable` on all code. And while it is OK to have more `async` functions than -not—in fact, we should generally *not be afraid* to make a function `async` since there is no performance penalty for doing so—there are -some guidelines to follow in order to make the most efficient use of `async`. - -## Be Liberal, but Careful, with Async - -Should code be async or not? It's okay to start with the answer *Yes* and then find a reason to say *No*. For example, a simple "hello world" -program can be made async with no performance penalty. And while there likely won't be any gain, there won't be any loss, either; the code is -simply ready for any future changes that may require async. - -These two programs are, for all intents and purposes, equivalent. - -```Hack -function get_hello(): string { - return "Hello"; -} - -<<__EntryPoint>> -function run_na_hello(): void { - \var_dump(get_hello()); -} -``` - -```Hack -async function get_hello(): Awaitable { - return "Hello"; -} - -<<__EntryPoint>> -async function run_a_hello(): Awaitable { - $x = await get_hello(); - \var_dump($x); -} -``` - -Just make sure you are following the rest of the guidelines. Async is great, but you still have to consider things like caching, batching -and efficiency. - -## Use Async Extensions - -For the common cases where async would provide maximum benefit, HHVM provides convenient extension libraries to help make writing code -much easier. Depending on the use case scenario, we should liberally use: -* [MySQL](extensions.md#mysql) for database access and queries. -* [cURL](extensions.md#curl) for web page data and transfer. -* [McRouter](extensions.md#mcrouter) for memcached-based operations. -* [Streams](extensions.md#streams) for stream-based resource operations. - -## Do Not Use Async in Loops - -If you only remember one rule, remember this: - -**DON'T `await` IN A LOOP** - -It totally defeats the purpose of async. - -```Hack -class User { - public string $name; - - protected function __construct(string $name) { - $this->name = $name; - } - - public static function get_name(int $id): User { - return new User(\str_shuffle("ABCDEFGHIJ").\strval($id)); - } -} - -async function load_user(int $id): Awaitable { - // Load user from somewhere (e.g., database). - // Fake it for now - return User::get_name($id); -} - -async function load_users_await_loop(vec $ids): Awaitable> { - $result = vec[]; - foreach ($ids as $id) { - $result[] = await load_user($id); - } - return $result; -} - -<<__EntryPoint>> -function runMe(): void { - $ids = vec[1, 2, 5, 99, 332]; - $result = \HH\Asio\join(load_users_await_loop($ids)); - \var_dump($result[4]->name); -} -``` - -In the above example, the loop is doing two things: -1. Making the loop iterations the limiting factor on how this code is going to run. By the loop, we are guaranteed to get the users sequentially. -2. We are creating false dependencies. Loading one user is not dependent on loading another user. - -Instead, we will want to use our async-aware mapping function, `Vec\map_async`. - -```Hack -class User { - public string $name; - - protected function __construct(string $name) { - $this->name = $name; - } - - public static function get_name(int $id): User { - return new User(\str_shuffle("ABCDEFGHIJ").\strval($id)); - } -} - -async function load_user(int $id): Awaitable { - // Load user from somewhere (e.g., database). - // Fake it for now - return User::get_name($id); -} - -async function load_users_no_loop(vec $ids): Awaitable> { - return await Vec\map_async( - $ids, - async $id ==> await load_user($id), - ); -} - -<<__EntryPoint>> -function runMe(): void { - $ids = vec[1, 2, 5, 99, 332]; - $result = \HH\Asio\join(load_users_no_loop($ids)); - \var_dump($result[4]->name); -} -``` - -## Considering Data Dependencies Is Important - -Possibly the most important aspect in learning how to structure async code is understanding data dependency patterns. Here is the general -flow of how to make sure async code is data dependency correct: -1. Put each sequence of dependencies with no branching (chain) into its own `async` function. -2. Put each bundle of parallel chains into its own `async` function. -3. Repeat to see if there are further reductions. - -Let's say we are getting blog posts of an author. This would involve the following steps: -1. Get the post ids for an author. -2. Get the post text for each post id. -3. Get comment count for each post id. -4. Generate final page of information - -```Hack -class PostData { - // using constructor argument promotion - public function __construct(public string $text) {} -} - -async function fetch_all_post_ids_for_author( - int $author_id, -): Awaitable> { - - // Query database, etc., but for now, just return made up stuff - return vec[4, 53, 99]; -} - -async function fetch_post_data(int $post_id): Awaitable { - // Query database, etc. but for now, return something random - return new PostData(\str_shuffle("ABCDEFGHIJKLMNOPQRSTUVWXYZ")); -} - -async function fetch_comment_count(int $post_id): Awaitable { - // Query database, etc., but for now, return something random - return \rand(0, 50); -} - -async function fetch_page_data( - int $author_id, -): Awaitable> { - - $all_post_ids = await fetch_all_post_ids_for_author($author_id); - // An async closure that will turn a post ID into a tuple of - // post data and comment count - $post_fetcher = async function(int $post_id): Awaitable<(PostData, int)> { - list($post_data, $comment_count) = await Vec\from_async(vec[ - fetch_post_data($post_id), - fetch_comment_count($post_id), - ]); - invariant($post_data is PostData, "This is good"); - invariant($comment_count is int, "This is good"); - return tuple($post_data, $comment_count); - }; - - // Transform the array of post IDs into an vec of results, - // using the Vec\map_async function - return await Vec\map_async($all_post_ids, $post_fetcher); -} - -async function generate_page(int $author_id): Awaitable { - $tuples = await fetch_page_data($author_id); - $page = ""; - foreach ($tuples as $tuple) { - list($post_data, $comment_count) = $tuple; - // Normally render the data into HTML, but for now, just create a - // normal string - $page .= $post_data->text." ".$comment_count.\PHP_EOL; - } - return $page; -} - -<<__EntryPoint>> -function main(): void { - print \HH\Asio\join(generate_page(13324)); // just made up a user id -} -``` - -The above example follows our flow: -1. One function for each fetch operation (post ids, post text, comment count). -2. One function for the bundle of data operations (post text and comment count). -3. One top function that coordinates everything. - -## Consider Batching - -Wait handles can be rescheduled. This means that they can be sent back to the queue of the scheduler, waiting until other awaitables have -run. Batching can be a good use of rescheduling. For example, say we have high latency lookup of data, but we can send multiple keys for -the lookup in a single request. - -```Hack -async function b_one(string $key): Awaitable { - $subkey = await Batcher::lookup($key); - return await Batcher::lookup($subkey); -} - -async function b_two(string $key): Awaitable { - return await Batcher::lookup($key); -} - -async function batching(): Awaitable { - $results = await Vec\from_async(vec[b_one('hello'), b_two('world')]); - \printf("%s\n%s\n", $results[0], $results[1]); -} - -<<__EntryPoint>> -function main(): void { - HH\Asio\join(batching()); -} - -class Batcher { - private static vec $pendingKeys = vec[]; - private static ?Awaitable> $aw = null; - - public static async function lookup(string $key): Awaitable { - // Add this key to the pending batch - self::$pendingKeys[] = $key; - // If there's no awaitable about to start, create a new one - if (self::$aw === null) { - self::$aw = self::go(); - } - // Wait for the batch to complete, and get our result from it - $results = await self::$aw; - return $results[$key]; - } - - private static async function go(): Awaitable> { - // Let other awaitables get into this batch - await \HH\Asio\later(); - // Now this batch has started; clear the shared state - $keys = self::$pendingKeys; - self::$pendingKeys = vec[]; - self::$aw = null; - // Do the multi-key roundtrip - return await multi_key_lookup($keys); - } -} - -async function multi_key_lookup( - vec $keys, -): Awaitable> { - - // lookup multiple keys, but, for now, return something random - $r = dict[]; - foreach ($keys as $key) { - $r[$key] = \str_shuffle("ABCDEF"); - } - return $r; -} -``` - -In the example above, we reduce the number of roundtrips to the server containing the data information to two by batching the first lookup -in `b_one` and the lookup in `b_two`. The `Batcher::lookup` method helps enable this reduction. The call to `await HH\Asio\later` in -`Batcher::go` allows `Batcher::go` to be deferred until other pending awaitables have run. - -So, `await Vec\from_async(vec[b_one('hello'), b_two('world')]);` has two pending awaitables. If `b_one` is called first, it calls `Batcher::lookup`, which -calls `Batcher::go`, which reschedules via `later`. Then HHVM looks for other pending awaitables. `b_two` is also pending. It calls -`Batcher::lookup` and then it gets suspended via `await self::$aw` because `Batcher::$aw` is no longer `null`. Now `Batcher::go)` resumes, -fetches, and returns the result. - -## Don't Forget to Await an Awaitable - -What do you think happens here? - -```Hack -async function speak(): Awaitable { - echo "one"; - await \HH\Asio\later(); - echo "two"; - echo "three"; -} - -<<__EntryPoint>> -async function forget_await(): Awaitable { - $handle = speak(); // This just gets you the handle -} -``` - -The answer is, the behavior is undefined. We might get all three echoes; we might only get the first echo; we might get nothing at all. The -only way to guarantee that `speak` runs to completion is to `await` it. `await` is the trigger to the async scheduler that allows HHVM to -appropriately suspend and resume `speak`; otherwise, the async scheduler will provide no guarantees with respect to `speak`. - -## Minimize Undesired Side Effects - -In order to minimize any unwanted side effects (e.g., ordering disparities), the creation and awaiting of awaitables should happen as close -together as possible. - -```Hack -async function get_curl_data(string $url): Awaitable { - return await \HH\Asio\curl_exec($url); -} - -function possible_side_effects(): int { - \sleep(1); - echo "Output buffer stuff"; - return 4; -} - -async function proximity(): Awaitable { - $handle = get_curl_data("http://example.com"); - possible_side_effects(); - await $handle; // instead you should await get_curl_data("....") here -} - -<<__EntryPoint>> -function main(): void { - \HH\Asio\join(proximity()); -} -``` - -In the above example, `possible_side_effects` could cause some undesired behavior when we get to the point of awaiting the handle associated -with getting the data from the website. - -Basically, don't depend on the order of output between runs of the same code; i.e., don't write async code where ordering is important. Instead -use dependencies via awaitables and `await`. - -## Memoization May be Good, But Only Awaitables - -Given that async is commonly used in operations that are time-consuming, memoizing (i.e., caching) the result of an async call can definitely be worthwhile. - -The [`<<__Memoize>>`](../attributes/predefined-attributes.md#__memoize) attribute does the right thing, so, use that. However, if to get -explicit control of the memoization, *memoize the awaitable* and not the result of awaiting it. - -```Hack -abstract final class MemoizeResult { - private static async function time_consuming(): Awaitable { - await \HH\Asio\usleep(5000000); - return "This really is not time consuming, but the sleep fakes it."; - } - - private static ?string $result = null; - - public static async function memoize_result(): Awaitable { - if (self::$result === null) { - self::$result = - await self::time_consuming(); // don't memoize the resulting data - } - return self::$result; - } -} -<<__EntryPoint>> -function runMe(): void { - $t1 = \microtime(true); - \HH\Asio\join(MemoizeResult::memoize_result()); - $t2 = \microtime(true) - $t1; - $t3 = \microtime(true); - \HH\Asio\join(MemoizeResult::memoize_result()); - $t4 = \microtime(true) - $t3; - \var_dump($t4 < $t2); // The memoized result will get here a lot faster -} -``` - -On the surface, this seems reasonable. We want to cache the actual data associated with the awaitable. However, this can cause an undesired -race condition. Imagine that there are two other async functions awaiting the result of `memoize_result`, call them `A` and `B`. The following -sequence of events can happen: -1. `A` gets to run, and `await`s `memoize_result`. -2. `memoize_result` finds that the memoization cache is empty (`$result` is `null`), so it `await`s `time_consuming`. It gets suspended. -3. `B` gets to run, and `await`s `memoize_result`. Note that this is a new awaitable; it's not the same awaitable as in 1. -4. `memoize_result` again finds that the memoization cache is empty, so it awaits `time_consuming` again. Now the time-consuming operation will -be done twice. - -If `time_consuming` has side effects (e.g., a database write), then this could end up being a serious bug. Even if there are no side effects, it's -still a bug; the time-consuming operation is being done multiple times when it only needs to be done once. - -Instead, memoize the awaitable: - -```Hack -abstract final class MemoizeAwaitable { - private static async function time_consuming(): Awaitable { - await \HH\Asio\usleep(5000000); - return "Not really time consuming but sleep."; // For type-checking purposes - } - - private static ?Awaitable $handle = null; - - public static function memoize_handle(): Awaitable { - if (self::$handle === null) { - self::$handle = self::time_consuming(); // memoize the awaitable - } - return self::$handle; - } -} - -<<__EntryPoint>> -function runMe(): void { - $t1 = \microtime(true); - \HH\Asio\join(MemoizeAwaitable::memoize_handle()); - $t2 = \microtime(true) - $t1; - $t3 = \microtime(true); - \HH\Asio\join(MemoizeAwaitable::memoize_handle()); - $t4 = \microtime(true) - $t3; - \var_dump($t4 < $t2); // The memoized result will get here a lot faster -} -``` - -This simply caches the handle and returns it verbatim; [Async Vs Awaitable](async-vs.-awaitable.md) explains this in more detail. - -This would also work if it were an async function that awaited the handle after caching. This may seem unintuitive, because the function -`await`s every time it's executed, even on the cache-hit path. But that's fine: on every execution except the first, `$handle` is not `null`, so -a new call to `time_consuming` will not be started. The result of the one existing instance will be shared. - -Either approach works, but the non-async caching wrapper can be easier to reason about. - -## Use Lambdas Where Possible - -The use of lambdas can cut down on code verbosity that comes with writing full closure syntax. Lambdas are quite useful in conjunction -with the [async utility helpers](utility-functions.md). For example, look how the following three ways to accomplish the same thing can be -shortened using lambdas. - -```Hack -async function fourth_root(num $n): Awaitable { - return sqrt(sqrt((float)$n)); -} - -async function normal_call(): Awaitable> { - $nums = vec[64, 81]; - return await Vec\map_async($nums, fourth_root<>); -} - -async function closure_call(): Awaitable> { - $nums = vec[64, 81]; - $froots = async function(num $n): Awaitable { - return sqrt(sqrt((float)$n)); - }; - return await Vec\map_async($nums, $froots); -} - -async function lambda_call(): Awaitable> { - $nums = vec[64, 81]; - return await Vec\map_async($nums, async $num ==> sqrt(sqrt((float)$num))); -} - -async function use_lambdas(): Awaitable { - $nc = await normal_call(); - $cc = await closure_call(); - $lc = await lambda_call(); - \var_dump($nc); - \var_dump($cc); - \var_dump($lc); -} - -<<__EntryPoint>> -function main(): void { - HH\Asio\join(use_lambdas()); -} -``` - -## Integrating async and non-async functions - -If you need to call an async function from a non-async function, the best approach is to refactor so that the caller is also async. Sometimes this might need refactoring an unmanageable number of recursive call sites, so an alternative is available - but best avoided: - -Imagine we are making a call to an `async` function `join_async` from a non-async scope. If refactoring to an entirely async call stack is not possible, `HH\Asio\join()` can be used to resolve the awaitable: - -```Hack -async function join_async(): Awaitable { - return "Hello"; -} - -// In an async function, you would await an awaitable. -// In a non-async function, or the global scope, you can -// use `join` to force the the awaitable to run to its completion. - -<<__EntryPoint>> -function main(): void { - $s = \HH\Asio\join(join_async()); - \var_dump($s); -} -``` - -**THIS IS A COUNTEREXAMPLE**: in real-world code, the entrypoint should be made async instead. - -`HH\Asio\join()` is not just a blocking form of `await`: no other Hack code in the current request will be executed until the awaitable you pass to `join()` is completed, blocking the entire request until then. - -## Remember Async Is NOT Multi-threading - -Async functions are not running at the same time. They are CPU-sharing via changes in wait state in executing code (i.e., pre-emptive -multitasking). Async still lives in the single-threaded world of normal Hack! - -## `await` Is Not a General Expression - -To strike a balance between flexibility, latency, and performance, we require -that `await`s only appear in **unconditionally consumed expression positions**. -For more details, see [Await As An Expression](await-as-an-expression). diff --git a/guides/hack/15-asynchronous-operations/31-examples.md b/guides/hack/15-asynchronous-operations/31-examples.md deleted file mode 100644 index 271d3da57..000000000 --- a/guides/hack/15-asynchronous-operations/31-examples.md +++ /dev/null @@ -1,261 +0,0 @@ -Here are some examples representing a slew of possible async scenarios. Obviously, this does not cover all possible situations, but they -provide an idea of how and where async can be used effectively. Some of these examples are found spread out through the rest of the async -documentation; they are added here again for consolidation purposes. - -## Basic - -This example shows the basic tenets of async, particularly the keywords used: - -```Hack -// async specifies a function will return an awaitable. Awaitable means -// that the awaitable will ultimately return a string when complete -async function trivial(): Awaitable { - return "Hello"; -} - -<<__EntryPoint>> -async function call_trivial(): Awaitable { - // These first two lines could be combined into - // $result = await trivial(); - // but wanted to show the process - - // get awaitable that you can wait for completion - $aw = trivial(); - // wait for the operation to complete and get the result - $result = await $aw; - echo $result; // "Hello" -} -``` - -## Joining - -To get the result of an awaitable in a non-async function, use `join`: - -```Hack -async function join_async(): Awaitable { - return "Hello"; -} - -// In an async function, you would await an awaitable. -// In a non-async function, or the global scope, you can -// use `join` to force the the awaitable to run to its completion. - -<<__EntryPoint>> -function main(): void { - $s = \HH\Asio\join(join_async()); - \var_dump($s); -} -``` - -## Async Closures and Lambdas - -Closure and lambda expressions can involve async functions: - -```Hack -<<__EntryPoint>> -async function closure_async(): Awaitable { - // closure - $hello = async function(): Awaitable { - return 'Hello'; - }; - // lambda - $bye = async ($str) ==> $str; - - // The call style to either closure or lambda is the same - $rh = await $hello(); - $rb = await $bye("bye"); - - echo $rh." ".$rb.\PHP_EOL; -} -``` - -## Data Fetching - -This shows a way to organize async functions such that we have a nice clean data dependency graph: - -```Hack -class PostData { - // using constructor argument promotion - public function __construct(public string $text) {} -} - -async function fetch_all_post_ids_for_author( - int $author_id, -): Awaitable> { - - // Query database, etc., but for now, just return made up stuff - return vec[4, 53, 99]; -} - -async function fetch_post_data(int $post_id): Awaitable { - // Query database, etc. but for now, return something random - return new PostData(\str_shuffle("ABCDEFGHIJKLMNOPQRSTUVWXYZ")); -} - -async function fetch_comment_count(int $post_id): Awaitable { - // Query database, etc., but for now, return something random - return \rand(0, 50); -} - -async function fetch_page_data( - int $author_id, -): Awaitable> { - - $all_post_ids = await fetch_all_post_ids_for_author($author_id); - // An async closure that will turn a post ID into a tuple of - // post data and comment count - $post_fetcher = async function(int $post_id): Awaitable<(PostData, int)> { - concurrent { - $post_data = await fetch_post_data($post_id); - $comment_count = await fetch_comment_count($post_id); - } - return tuple($post_data, $comment_count); - // alternatively: - $_return = tuple( - await fetch_post_data($post_id), - await fetch_comment_count($post_id), - ); - }; - - // Transform the array of post IDs into a vec of results, - // using the Vec\map_async function - return await Vec\map_async($all_post_ids, $post_fetcher); -} - -async function generate_page(int $author_id): Awaitable { - $tuples = await fetch_page_data($author_id); - $page = ""; - foreach ($tuples as $tuple) { - list($post_data, $comment_count) = $tuple; - // Normally render the data into HTML, but for now, just create a - // normal string - $page .= $post_data->text." ".$comment_count.\PHP_EOL; - } - return $page; -} - -<<__EntryPoint>> -function main(): void { - print \HH\Asio\join(generate_page(13324)); // just made up a user id -} -``` - -## Batching - -Use rescheduling (via `HH\Asio\later`) to batch up operations to send multiple keys in a single request over a high latency network (for -example purposes, the network isn't high latency, but just returns something random): - -```Hack -async function b_one(string $key): Awaitable { - $subkey = await Batcher::lookup($key); - return await Batcher::lookup($subkey); -} - -async function b_two(string $key): Awaitable { - return await Batcher::lookup($key); -} - -async function batching(): Awaitable { - $results = await Vec\from_async(vec[b_one('hello'), b_two('world')]); - \printf("%s\n%s\n", $results[0], $results[1]); -} - -<<__EntryPoint>> -function main(): void { - \HH\Asio\join(batching()); -} - -class Batcher { - private static vec $pendingKeys = vec[]; - private static ?Awaitable> $aw = null; - - public static async function lookup(string $key): Awaitable { - // Add this key to the pending batch - self::$pendingKeys[] = $key; - // If there's no awaitable about to start, create a new one - if (self::$aw === null) { - self::$aw = self::go(); - } - // Wait for the batch to complete, and get our result from it - $results = await self::$aw; - return $results[$key]; - } - - private static async function go(): Awaitable> { - // Let other awaitables get into this batch - await \HH\Asio\later(); - // Now this batch has started; clear the shared state - $keys = self::$pendingKeys; - self::$pendingKeys = vec[]; - self::$aw = null; - // Do the multi-key roundtrip - return await multi_key_lookup($keys); - } -} - -async function multi_key_lookup( - vec $keys, -): Awaitable> { - - // lookup multiple keys, but, for now, return something random - $r = dict[]; - foreach ($keys as $key) { - $r[$key] = \str_shuffle("ABCDEF"); - } - return $r; -} -``` - -## Polling - -We can use rescheduling in a polling loop to allow other awaitables to run. A polling loop may be needed where a service does not have -an async function to add to the scheduler: - -```Hack -// Of course, this is all made up :) -class Polling { - private int $count = 0; - public function isReady(): bool { - $this->count++; - if ($this->count > 10) { - return true; - } - return false; - } - public function getResult(): int { - return 23; - } -} - -async function do_polling(Polling $p): Awaitable { - echo "do polling 1".\PHP_EOL; - // No async function in Polling, so loop until we are ready, but let - // other awaitables go via later() - while (!$p->isReady()) { - await \HH\Asio\later(); - } - echo "\ndo polling 2".\PHP_EOL; - return $p->getResult(); -} - -async function no_polling(): Awaitable { - echo '.'; - return \str_shuffle("ABCDEFGH"); -} - -async function polling_example(): Awaitable { - $handles = vec[do_polling(new Polling())]; - // To make this semi-realistic, call no_polling a bunch of times to show - // that do_polling is waiting. - for ($i = 0; $i < 50; $i++) { - $handles[] = no_polling(); - } - - $results = await Vec\from_async($handles); -} - -<<__EntryPoint>> -function main(): void { - \HH\Asio\join(polling_example()); -} -``` diff --git a/guides/hack/15-asynchronous-operations/asynchronous-operations-category.txt b/guides/hack/15-asynchronous-operations/asynchronous-operations-category.txt deleted file mode 100644 index 74de90a5c..000000000 --- a/guides/hack/15-asynchronous-operations/asynchronous-operations-category.txt +++ /dev/null @@ -1 +0,0 @@ -Control Flow diff --git a/guides/hack/15-asynchronous-operations/asynchronous-operations-summary.txt b/guides/hack/15-asynchronous-operations/asynchronous-operations-summary.txt deleted file mode 100644 index 858f4d6c7..000000000 --- a/guides/hack/15-asynchronous-operations/asynchronous-operations-summary.txt +++ /dev/null @@ -1 +0,0 @@ -Asynchronous functions, await, and the concurrent keyword. diff --git a/guides/hack/16-readonly/01-introduction.md b/guides/hack/16-readonly/01-introduction.md deleted file mode 100644 index 68656a0c5..000000000 --- a/guides/hack/16-readonly/01-introduction.md +++ /dev/null @@ -1,48 +0,0 @@ -`readonly` is a keyword used to create immutable references to [Objects](/hack/classes/introduction) and their properties. - -### How does it work? -Expressions in Hack can be annotated with the `readonly` keyword. When an object or reference is readonly, there are two main constraints on it: -* **Readonlyness:** Object properties cannot be modified (i.e. mutated). -* **Deepness:** All nested properties of a readonly value are readonly. - - -### Readonlyness -Object properties of `readonly` values cannot be modified (i.e. mutated). - -```Hack error -class Bar { - public function __construct( - public Foo $foo, - ){} -} -class Foo { - public function __construct( - public int $prop, - ) {} -} - -function test(readonly Foo $x) : void { - $x->prop = 4; // error, $x is readonly, its properties cannot be modified -} -``` - -### Deepness -All nested properties of `readonly` objects are readonly. - -``` Hack error -function test(readonly Bar $x) : void { - $foo = $x->foo; - $foo->prop = 3; // error, $foo is readonly -} -``` - -### How is `readonly` different from contexts and capabilities that control property mutation (such as `write_props`)? -[Contexts](/hack/contexts-and-capabilities/available-contexts-and-capabilities) such as `write_props` affect an entire function (and all of its callees), whereas readonly affects specific values / expressions. - - -### Topics covered in this section -* [Syntax](syntax.md): Basic syntax for readonly keyword -* [Subtyping](subtyping.md): Rules and semantics for interacting with readonly and mutable values -* [Explicit Readonly Keywords](explicit-readonly-keywords.md): Positions where the readonly keyword is explicitly required -* [Containers and Collections](containers-and-collections.md): Interactions between collections of readonly values -* [Advanced Features and Semantics](advanced-semantics.md): More complex features and interactions diff --git a/guides/hack/16-readonly/02-syntax.md b/guides/hack/16-readonly/02-syntax.md deleted file mode 100644 index 9c5bd07be..000000000 --- a/guides/hack/16-readonly/02-syntax.md +++ /dev/null @@ -1,106 +0,0 @@ -The `readonly` keyword can be applied to various positions in Hack. - -## Parameters and return values -Parameters and return values of any callable (e.g. a function or method) can be marked `readonly`. - -```Hack -class Bar { - public function __construct( - public Foo $foo, - ){} -} -class Foo { - public function __construct( - public int $prop, - ) {} -} - -function getFoo(readonly Bar $x): readonly Foo { - return $x->foo; -} -``` - -A readonly *parameter* signals that the function/method will not modify that parameter when called. A readonly *return type* signals that the function returns a readonly reference to an object that cannot be modified. - -## Static and regular properties -Static and regular properties marked as `readonly` cannot be modified. - -```Hack -class Bar {} -class Foo { - private static readonly ?Bar $static_bar = null; - public function __construct( - private readonly Bar $bar, - ){} -} -``` -A readonly property represents a property that holds a readonly reference (specifically, that the nested object within the property cannot be modified). - - -## Lambdas and function type signatures -`readonly` is allowed on inner parameters and return types on function typehints. - -```Hack -class Bar {} -function call( - (function(readonly Bar) : readonly Bar) $f, - readonly Bar $arg, - ) : readonly Bar { - return readonly $f($arg); -} -``` - -## Expressions -`readonly` can appear on expressions to convert mutable values to readonly. -```Hack -class Foo {} -function foo(): void { - $x = new Foo(); - $y = readonly $x; -} -``` - -## Functions / Methods -`readonly` can appear as a modifier on instance methods, signaling that `$this` is readonly (i.e, that the method promises not to modify the instance). - -``` Hack error -class C { - public function __construct(public int $prop) {} - public readonly function foo() : void { - $this->prop = 4; // error, $this is readonly. - } -} -``` -Note that readonly objects can only call readonly methods, since they promise not to modify the object. - -``` Hack error -class Data {} -class Box { - public function __construct(public Data $data) {} - public readonly function getData(): readonly Data { - return $this->data; - } - public function setData(Data $d) : void { - $this->data = $d; - } -} -function readonly_method_example(readonly Box $b): void { - $y = readonly $b->getData(); // ok, $y is readonly - $b->setData(new Data()); // error, $b is readonly, it can only call readonly methods -} -``` - -## Closures and function types -A function type can be marked readonly: `(readonly function(T1): T)`. Denoting a function/closure as readonly adds the restriction that the function/closure captures all values as readonly: - -``` Hack error -function readonly_closure_example(): void { - $x = new Foo(); - $f = readonly () ==> { - $x->prop = 4; // error, $x is readonly here! - }; -} -``` -One way to make sense of this behavior is to think of closures as an object whose properties are the values it captures, which implement a special invocation function that executes the closure. A readonly closure is then defined as a closure whose invocation function is annotated with readonly. - -Readonly closures affect Hack’s type system; readonly closures are subtypes of their mutable counterparts. That is, a `(readonly function(T1):T2)` is a strict subtype of a `(function(T1): T2)`. diff --git a/guides/hack/16-readonly/03-subtyping.md b/guides/hack/16-readonly/03-subtyping.md deleted file mode 100644 index c1d4703d2..000000000 --- a/guides/hack/16-readonly/03-subtyping.md +++ /dev/null @@ -1,64 +0,0 @@ -From a typing perspective, one can think of a readonly object as a [supertype](/hack/types/supertypes-and-subtypes) of its mutable counterpart. -For example, readonly values cannot be passed to a function that takes mutable values. - -```Hack error -class Foo { - public int $prop = 0; -} - -function takes_mutable(Foo $x): void { - $x->prop = 4; -} - -function test(): void { - $z = readonly new Foo(); - takes_mutable($z); // error, takes_mutable's first parameter - // is mutable, but $z is readonly -} -``` - -Similarly, functions cannot return readonly values unless they are annotated to return readonly. - -```Hack error -class Foo {} -function returns_mutable(readonly Foo $x): Foo { - return $x; // error, $x is readonly -} -function returns_readonly(readonly Foo $x): readonly Foo { - return $x; // correct -} -``` - -Note that non-readonly (i.e. mutable) values *can* be passed to a function that takes a readonly parameter: - -```Hack -class Foo {} -// promises not to modify $x -function takes_readonly(readonly Foo $x): void { -} - -function test(): void { - $z = new Foo(); - takes_readonly($z); // ok -} -``` - -Similarly, class properties cannot be set to readonly values unless they are declared as readonly properties. - -```Hack error -class Bar {} -class Foo { - public function __construct( - public readonly Bar $ro_prop, - public Bar $mut_prop - ){} -} - -function test( - Foo $x, - readonly Bar $bar, -) : void { - $x->mut_prop = $bar; // error, $bar is readonly but the prop is mutable - $x->ro_prop = $bar; // ok -} -``` diff --git a/guides/hack/16-readonly/04-explicit-readonly-keywords.md b/guides/hack/16-readonly/04-explicit-readonly-keywords.md deleted file mode 100644 index 90f4064e9..000000000 --- a/guides/hack/16-readonly/04-explicit-readonly-keywords.md +++ /dev/null @@ -1,51 +0,0 @@ -There are a few places where an explicit readonly keyword is required when using readonly values. - -## Calling a readonly function -Calling a function or method that returns readonly requires wrapping the result in a readonly expression. - -```Hack - -class Foo {} -function returns_readonly(): readonly Foo { - return readonly new Foo(); -} - -function test(): void { - $x = readonly returns_readonly(); // this is required to call returns_readonly() -} - -``` -## Accessing readonly properties -Accessing a readonly property (i.e. a property annotated readonly at the declaration, not accessing a property off of a readonly object) requires readonly annotation. - -```Hack - -class Bar {} -class Foo { - public function __construct( - public readonly Bar $bar, - ) {} -} - -function test(Foo $f): void { - $bar = readonly $f->bar; // this is required -} -``` - -## Interactions with [Coeffects](https://docs.hhvm.com/hack/contexts-and-capabilities/available-contexts-and-capabilities) -If your function has the `ReadGlobals` capability but not the `AccessGlobals` capability (i.e. is marked `read_globals` or `leak_safe`), it can only access class static variables if they are wrapped in a readonly expression: - -```Hack -<> -class Bar {} -class Foo { - public static readonly ?Bar $bar = null; -} - -function read_static()[read_globals]: void { - $y = readonly Foo::$bar; // keyword required -} -function read_static2()[leak_safe]: void { - $y = readonly Foo::$bar; // keyword required -} -``` diff --git a/guides/hack/16-readonly/05-containers-and-collections.md b/guides/hack/16-readonly/05-containers-and-collections.md deleted file mode 100644 index e15c8bebc..000000000 --- a/guides/hack/16-readonly/05-containers-and-collections.md +++ /dev/null @@ -1,45 +0,0 @@ -## Basics -Readonly values cannot be written to normal container types (such as`vec`, `Vector`, or `dict`): - -```Hack error -class Foo {} -function container_example(readonly Foo $x) : void { - $container = vec[]; - $container[] = $x; // error, $x is readonly -} -``` - -To use readonly values within a container, you can either declare the values in an array literal, or declare an array type (i.e. `vec` or `dict`) as readonly and append to it. -Note that the entire container literal is readonly if any of its contents are readonly. - -```Hack -class Foo {} -function container_example2(readonly Foo $x) : void { - $container = readonly vec[]; // container is now a readonly vec - $container_literal = vec[new Foo(), readonly new Foo()]; // $container_literal is readonly -} -``` - -Foreaching over a readonly container results in readonly values: - -```Hack error -class Foo { - public function __construct(public int $prop) {} -} -function container_foreach(readonly vec $vec): void { - foreach($vec as $elem) { - $elem->prop = 3; // error, $elem is readonly - } -} -``` - -### Readonly and Collection types -Readonly has only limited support with object collection types like `Vector`, `Map` and `Pair`. Specifically, you can declare readonly collection literals of readonly values to create a readonly collection type (i.e a `readonly Vector`), but since collection types themselves are mutable objects, you cannot append to or modify a readonly collection. - -```Hack error -class Foo {} -function collection_example(): void { - $v = Vector { new Foo(), readonly new Foo() }; // $v is readonly since at least one of its contents is readonly - $v[] = new Foo(); // error, $v is readonly and not a value type, so it cannot be appended -} -``` diff --git a/guides/hack/16-readonly/06-advanced-semantics.md b/guides/hack/16-readonly/06-advanced-semantics.md deleted file mode 100644 index 09e251e87..000000000 --- a/guides/hack/16-readonly/06-advanced-semantics.md +++ /dev/null @@ -1,60 +0,0 @@ -This page lists some more complicated interactions and nuances with readonly. - -## `readonly (function (): T)` versus `(readonly function(): T)`: references vs. objects -A `(readonly function(): T)` may look very similar to a `readonly (function(): T)`, but they are actually different. The first denotes a readonly closure object, which at definition time, captured readonly values. The second denotes a readonly **reference** to a regular, mutable closure object: - -```Hack -function readonly_closures_example2( - (function (): T) $regular_f, - (readonly function(): T) $ro_f, -) : void { - $ro_regular_f = readonly $regular_f; // readonly (function(): T) - $ro_f; // (readonly function(): T) - $ro_ro_f = readonly $ro_f; // readonly (readonly function(): T) -} -``` - -Since calling a mutable closure object can modify itself (and its captured values), a readonly reference to a regular closure **cannot** be called. - -```Hack error -function readonly_closure_call( - (function (): T) $regular_f, - (readonly function(): T) $ro_f, -) : void { - $ro_regular_f = readonly $regular_f; // readonly (function(): T) - $ro_regular_f(); // error, $ro_regular_f is a readonly reference to a regular function -} -``` - -But a readonly closure object can have readonly references and call them, since they cannot modify the original closure object on call: - -```Hack error -function readonly_closure_call2( - (function (): T) $regular_f, - (readonly function(): T) $ro_f, - ) : void { - $ro_regular_f = readonly $regular_f; // readonly (function(): T) - $ro_regular_f(); // error, $ro_regular_f is a readonly reference to a regular function - $ro_ro_f = readonly $ro_f; // readonly (readonly function(): T) - $ro_ro_f(); // safe - } -``` - -## Converting to non-readonly -Sometimes you may encounter a readonly value that isn’t an object (e.g.. a readonly int, due to the deepness property of readonly). In those cases, instead of returning a readonly int, you’ll want a way to tell Hack that the value you have is actually a value type. You can use the function `HH\Readonly\as_mut()` to convert any primitive type from readonly to mutable. - -Use `HH\Readonly\as_mut()` strictly for primitive types and value-type collections of primitive types (i.e. a vec of int). - -```Hack - -class Foo { - public function __construct( - public int $prop, - ) {} - - public readonly function get() : int { - $result = $this->prop; // here, $result is readonly, but its also an int. - return \HH\Readonly\as_mut($this->prop); // convert to a non-readonly value - } -} -``` diff --git a/guides/hack/16-readonly/readonly-category.txt b/guides/hack/16-readonly/readonly-category.txt deleted file mode 100644 index 74de90a5c..000000000 --- a/guides/hack/16-readonly/readonly-category.txt +++ /dev/null @@ -1 +0,0 @@ -Control Flow diff --git a/guides/hack/16-readonly/readonly-summary.txt b/guides/hack/16-readonly/readonly-summary.txt deleted file mode 100644 index 40676a232..000000000 --- a/guides/hack/16-readonly/readonly-summary.txt +++ /dev/null @@ -1 +0,0 @@ -Specialized feature for performantly controlling object mutability diff --git a/guides/hack/17-modules/01-introduction.md b/guides/hack/17-modules/01-introduction.md deleted file mode 100644 index 62be4a299..000000000 --- a/guides/hack/17-modules/01-introduction.md +++ /dev/null @@ -1,54 +0,0 @@ -Modules are an experimental feature for organizing code and separating your internal and external APIs. Modules are collections of Hack files that share an identity or utility. - -## Module definitions -You can define a new module with a `new module` declaration: - -```hack file:foomodule.hack -//// module.hack -new module foo {} -``` -Modules do not share a namespace with other symbols. Module names can contain periods `.` to help delineate between directories or logical units. Periods in module names do not currently have any semantic meaning. - -```hack -//// module_foo.hack -new module foo {} -//// module_foobar.hack -new module foo.bar {} -//// module_foobartest.hack -new module foo.bar.test {} -``` - -## Module membership -Any Hack file can be placed in a defined module by writing `module ` at the top of the file. - -```hack no-extract -module foo; -class Foo { - // ... -} -``` - -## Module level visibility: `internal` -By placing your code in a module, you can use a new visibility keyword: `internal`. An `internal` symbol can only be accessed from within the module. - -```hack file:foomodule.hack -//// foo_class.hack -module foo; - -public class Foo {} -internal class FooInternal { - public function foo(): void {} - internal function bar(): void {} -} -internal function foo_fun(): void {} -``` - -An internal symbol cannot be accessed outside of the module it's defined in. - -```hack no-extract -module bar; - -public function bar_test(): void { - $x = new FooInternal(); // error! FooInternal is internal to module foo. -} -``` diff --git a/guides/hack/17-modules/02-defining-modules.md b/guides/hack/17-modules/02-defining-modules.md deleted file mode 100644 index a36fdb493..000000000 --- a/guides/hack/17-modules/02-defining-modules.md +++ /dev/null @@ -1,38 +0,0 @@ -## Defining modules -You can define a module with the `new module` syntax. A module, just like any other toplevel entity (classes, functions, etc), can have at most one definition. - -```hack -new module foo {} -``` -Module names live in their own namespace, and do not conflict with classes, functions, etc. Module names are **not** affected by namespaces. - -```Hack no-extract -namespace Bar; -module foo; -function foo(): void {} -``` - -Currently, module bodies are empty. This will change in future versions of Hack as we build more support for modules and organizing their relationships. - -# Module membership -A module can be thought of as a logical structure of code organized into a list of files. To add a file to a module, use the `module foo;` syntax at the top of the file. - -```Hack no-extract -// This file is now a member of module foo -module foo; -class MyFoo { - // ... -} -``` -A file can have at most one module membership statement, and the statement must be before any symbol in the file (File attributes and namespace declarations can appear before module membership statements, as they are not referenceable symbols). For clarity, module definitions (i.e. `new module`) cannot be placed within any module. - -```hack error -module foo; // ok -module bar; // not okay: duplicate module membership statement -``` - -```hack error -module bar; -// not okay: module definitions must live outside of files already in a module -new module foo {} -``` diff --git a/guides/hack/17-modules/03-using-internal.md b/guides/hack/17-modules/03-using-internal.md deleted file mode 100644 index 477ba23fb..000000000 --- a/guides/hack/17-modules/03-using-internal.md +++ /dev/null @@ -1,109 +0,0 @@ -## Internal and module level visibility -One goal of using modules is to separate a code unit's public and private APIs. If a file is part of a module, its toplevel functions, classes, interfaces, traits, enums, and typedefs can be marked `internal`. An internal toplevel symbol cannot be referenced outside of its module. If a symbol is not internal, it is `public`, and it's part of the public API of the module. You can optionally use the `public` keyword on toplevel symbols to denote them as public. - -```hack no-extract -module foo; -internal class FooInternal {} -internal trait TFoo {} -internal interface IFoo {} -internal newtype TInternal = FooInternal; -internal function foo_internal(): void {} -``` - -```hack no-extract -module bar; -// error: FooInternal is internal, it cannot be referenced outside of its module -public function foo(): FooInternal {} -``` - -Methods and properties within classes also gain a new visibility `internal`, which means that they can only be accessed or called within the module. - -```hack no-extract -module foo; -public class FooPublic { - internal function foo(): void { - echo "foo!\n"; - } - internal int $prop = 5; - public function bar(): void { - echo "bar!\n"; - } -} -``` - -An internal method or property can be called anywhere from within a module. `internal` replaces the visibility keyword of the method or propertiy (i.e. `protected`, `public` or `private`). Note that **method and property visibilities do not have to match the visibility of the class itself**: an internal class can have public methods, and a public class can have internal methods. You can think of the visibility on a toplevel symbol to represent where a symbol is allowed to be referenced, whereas the visibility of a method or property to represent where that individual member can be accessed. - -If you try calling an internal method or accessing a property from outside of the module, you'll get a runtime error. - -```hack no-extract -module bar; -<<__EntryPoint>> -function test(): void { - $x = new FooPublic(); // ok since Foo is a public class - $x->bar(); // prints "bar!" - $x->foo(); // error, foo is an internal method being called from outside the module. - $x->prop = 5; // error, $x::prop is an internal property being accessed outside of the module. -} -``` - -You'll also get an error if you reference an internal symbol in any code outside of the module it's defined in (i.e., in typehints, constructor classnames, is/as statements): -```hack no-extract -module bar; -<<__EntryPoint>> -function test(IFoo $x): void { - //^^^^ error, IFoo is internal to module foo - $a = new FooInternal(); // error - $b = FooInternal::class; // error - $c = $x as FooInternal; // error - $d = foo_internal<>; // error -} -``` - - -We will go over the inheritance and override rules in a different section. - - -## Referencing internal symbols in your public API -Public symbols within your module generally cannot reference internal symbols directly. - -```hack no-extract -module foo; -internal class Secret { - internal function mySecret(): int { - return 42; - } -} -public function foo(): Secret { // error, public API users wouldn't know what a Secret is - return new Secret(); -} -``` - -In order to expose Secret to outside users, you can use a public interface. -```hack no-extract -module foo; -public interface PublicFoo { - public function myPublic(): int; -} -internal class Secret implements PublicFoo { - public function myPublic(): int { - return $this->mySecret(); - } - internal function mySecret(): int { - return 42; - } -} -public function foo(): PublicFoo { // - return new Secret(); -} -``` -At runtime, if code from another module calls `foo`, it will receive a Secret object. However, statically, any function that calls foo must respect the defined PublicFoo interface. - -```hack no-extract -module bar; -<<__EntryPoint>> -public function test(): void { - $x = foo(); // $x has type Secret at runtime - $x->myPublic(); // returns 42 - $x->mySecret(); // typechecker error, $x is type Public, it does not have a method called mySecret(). -} -``` diff --git a/guides/hack/17-modules/04-inheritance.md b/guides/hack/17-modules/04-inheritance.md deleted file mode 100644 index 9465e6f6e..000000000 --- a/guides/hack/17-modules/04-inheritance.md +++ /dev/null @@ -1,70 +0,0 @@ -## Inheriting methods and properties -In general, override rules for internal class members are consistent with that of private and protected: you can only override a class member with a visibility that's at least as visible as the previous. - -```hack no-extract -module foo; -class Foo { - internal function foo(): void {} - - public function bar(): void {} - - internal function baz(): void {} -} -class Bar extends Foo { - <<__Override>> - public function foo(): void {} // ok - - <<__Override>> - internal function bar(): void {} // error, overriding a public method with a lower visibility - - <<__Override>> - private function baz(): void {} // ok -} -``` - -Note that `internal` and `protected` do not encompass each other in terms of visibility. Therefore, you can never override an internal member with a protected one, or vice versa. - -The same rule applies when implementing an interface: - -```hack no-extract -interface IFoo { - public function bar(): void; - internal function baz(): void; -} -class Foo implements IFoo { - // You must implement a public function in an interface with another public one - public function bar(): void {} - // You **can** implement an internal function in an interface with a public one - public function baz(): void {} -} -``` - - -## Inheriting toplevel symbols -Unlike with methods and properties, within the same module, an internal class can override a public one, and vice versa. - -```hack no-extract -public class Bar {} -internal class Foo extends Bar {} -public class Baz extends Foo {} -``` -You can think of this behavior as freely choosing which symbols in your module to export to your public API. Since the visibility of a toplevel entity only affects how it is statically referenced, no inheritance rules need to be applied when overriding them. - -You cannot, however, extend an internal class, implement an internal interface, or use an internal trait from a different module. - -```hack -//// newmodule.hack -new module foo {} - -//// foo.hack -module foo; -internal interface IFoo { - //... -} -class Foo implements IFoo {} // ok -``` - -```hack no-extract -module bar; -class Bar implements IFoo {} // error, IFoo is internal to module foo -``` diff --git a/guides/hack/17-modules/05-traits.md b/guides/hack/17-modules/05-traits.md deleted file mode 100644 index 3c32efd7e..000000000 --- a/guides/hack/17-modules/05-traits.md +++ /dev/null @@ -1,80 +0,0 @@ -Traits have special behavior in Hack when used with modules. - -## Marking traits internal -An internal trait can only be used within the module it's defined. Internal traits can have public, protected, or internal methods. - -```hack -//// newmodule.hack -new module foo {} - -//// foo.hack -module foo; -internal trait TFoo { - public function foo(): void {} - internal function bar(): void {} -} -``` - -```hack no-extract -module bar; -public class Bar { - use TFoo; // error, TFoo is internal -} -``` - -## Public traits - -Hack supports two different module semantics for public traits. - -By default, since public traits by nature can have their implementations copied to any class in any other module, public traits cannot access any internal symbols or implementations from the module they are defined in. You can think of public traits as not belonging to any specific module, even if they are defined within one. - -```hack no-extract -module foo; -internal class Foo {} -// Assume TFoo is defined as before -public trait TBar { - use TFoo; // error, TBar is a public trait, it cannot access internal symbols in module foo - public function foo(): mixed { - return new Foo(); // error, TBar is a public trait, it cannot access internal symbols in module foo - } -} -``` - -As experimental feature, the programmer can however declare a public trait to belong to the module where the trait was itself defined, by adding the `<<__ModuleLevelTrait>>` attribute to the trait definition. By doing so the methods of the trait can access the internal symbols and implementations of the module they are defined in. For instance the following code is accepted: - -```hack no-extract -/// file a.php -<> - -module A; - -internal function foo(): void { echo "I am foo in A\n"; } - -<<__ModuleLevelTrait>> -public trait T { - public function getFoo(): void { - foo(); // both getFoo and foo belong to module A - } -} - -/// file b.php -module B; - -class C { use T; } - -<<__EntryPoint>> -function bar(): void { - (new C())->getFoo(); // prints "I am foo in A" -} -``` - -Module level traits are especially useful in conjunction with the `<<__Sealed(...)>>` attribute to export selectively internal module functionalities, mimicking C++ friends modules. - - -Public traits cannot have internal methods or properties, as they may be used by classes outside of any module. - -```hack no-extract -public trait TBar { - internal function foo(): void {} // error, public traits cannot have internal methods or properties -} -``` diff --git a/guides/hack/17-modules/06-type-aliases.md b/guides/hack/17-modules/06-type-aliases.md deleted file mode 100644 index 6a533d11c..000000000 --- a/guides/hack/17-modules/06-type-aliases.md +++ /dev/null @@ -1,47 +0,0 @@ -Type aliases have special rules when it comes to internal types depending on which kind of type alias is used. - -## Internal type aliases -A type alias declared with `type` can be marked internal. Just as with classes, this means that the type can only be referenced from within the module. - -```hack -//// newmodule.hack -new module foo {} - -//// foo.hack -module foo; -internal class Foo {} -internal type FooInternal = Foo; -internal newtype FooOpaque = FooInternal; -internal newtype FooOpaque2 as Foo = Foo; -``` - -Internal newtypes can also be constrained by other internal types, since they can only be used from within the module. - -## Public Opaque type aliases -Since public opaque type aliases hide their implementations from users outside of the current file, you can implement them with internal types. The opaque type alias acts as an empty interface for the internal type. You cannot, however, constrain them with an internal type, since a public user would not know what type it's being constrained by. - -```hack no-extract -newtype FooOpaque = FooInternal; // ok -newtype FooErr as FooInternal = FooInternal; // error, FooInternal is an internal type, cannot be used as constraint -``` - -## Public transparent type aliases -Transparent type aliases leak their implementation, so they cannot be implemented by internal types. - -```no-extract -type FooOpaque = FooInternal; // error, cannot use internal type FooInternal in transparent type FooOpaque. -``` - -## Module-level type aliases -We also introduce a new type alias known as a **module-level** type alias. You can create one using the syntax `module newtype TFoo as ... = ...`. -A module-level type alias is opaque outside of the module it's defined in, and transparent inside (rather than just being opaque outside of the file it's defined in). Since they hide their implementations from outside the module, you can use internal types from within a module to implement them. They still cannot be constrained by internal types. - -```hack no-extract -module newtype FooModule = FooInternal; // ok -module newtype FooModuleErr as FooInternal = FooInternal; // error, FooInternal is an internal type, cannot be used as a constraint -``` -Since the purpose of module newtypes is to create an interface surrounding a module boundary, you cannot mark module newtypes themselves internal. - -```hack error -internal module newtype FooModuleErr2 = int; // Parse error -``` diff --git a/guides/hack/17-modules/07-closures-and-function-pointers.md b/guides/hack/17-modules/07-closures-and-function-pointers.md deleted file mode 100644 index 9d64e65dd..000000000 --- a/guides/hack/17-modules/07-closures-and-function-pointers.md +++ /dev/null @@ -1,58 +0,0 @@ -Within a module, you can create a pointer to an internal function and pass it anywhere for use. Pointers to internal functions can only be created from within a module, but can be called and acccessed from anywhere. - -```hack -//// newmodule.hack -new module foo {} - -//// foo.hack -module foo; -internal function f() : void { - echo "Internal f\n"; -} -public function getF(): (function():void) { - return f<>; -} -``` - -```hack no-extract -module bar; -public function test(): void { - $f = getF(); - $f(); // prints "Internal f"; -} -``` - -Similarly, a closure can access internal symbols from the module it's -defined in, but can be called from any location in code. - -```hack -//// newmodule.hack -new module foo {} - -//// foo.hack -module foo; -internal function f() : void { - echo "Internal f\n"; -} -public function getF(): (function():void) { - return () ==> { f(); }; // ok -} -``` - -```hack no-extract -module bar; -public function test(): void { - $f = getF(); - $f(); // prints "Internal f"; -} -``` - -However, calling a function via string invocation must respect module boundaries. That is, if you try to call a function from outside of the current module using a string invocation, the runtime will throw an error. (The typechecker already bans this type of dynamic behavior). - -```hack no-extract -module bar; -public function test(): void { - $f = "f"; - $f(); // runtime error, f is internal to module foo -} -``` diff --git a/guides/hack/17-modules/08-reflection-and-migration.md b/guides/hack/17-modules/08-reflection-and-migration.md deleted file mode 100644 index 5754a67df..000000000 --- a/guides/hack/17-modules/08-reflection-and-migration.md +++ /dev/null @@ -1,49 +0,0 @@ -## Reflection - -You can reflect on the module of a class or function using its corresponding methods. - -```Hack no-extract -ReflectionClass::getModule(); -ReflectionFunctionAbstract::getModule(); -``` - -You can check if a class, method or property is internal with the `isInternalToModule()` function. - -```hack no-extract -ReflectionClass::isInternalToModule(); -ReflectionFunctionAbstract::isInternalToModule(); -``` - -## Migration and <<__SoftInternal>> -When migrating existing code to use internal, you can use the <<__SoftInternal>> attribute to help detect dynamic usages of the code outside of the module. -Internal symbols with <<__SoftInternal>> will raise a warning in HHVM instead of an exception. - -```hack -//// newmodule.hack -new module foo {} - -//// foo.hack -module foo; -class Cls { - <<__SoftInternal>> - internal function foo_soft(): void { - echo "Hello from foo_soft\n"; - } -} -``` - -Calling Cls::foo_soft() from outside the code: - -```hack no-extract -module bar; -<<__EntryPoint>> -function test(): void { - Cls::foo_soft(); -} -``` -will result in the following output from HHVM: - -``` -Warning: Accessing soft internal method Cls::foo_soft in module foo from module bar is not allowed in test.php on line 4 -Hello from foo_soft -``` diff --git a/guides/hack/17-modules/modules-category.txt b/guides/hack/17-modules/modules-category.txt deleted file mode 100644 index 263beb086..000000000 --- a/guides/hack/17-modules/modules-category.txt +++ /dev/null @@ -1 +0,0 @@ -Getting Started diff --git a/guides/hack/17-modules/modules-summary.txt b/guides/hack/17-modules/modules-summary.txt deleted file mode 100644 index a57c17325..000000000 --- a/guides/hack/17-modules/modules-summary.txt +++ /dev/null @@ -1 +0,0 @@ -Language support for organizing code. diff --git a/guides/hack/18-packages/01-introduction.md b/guides/hack/18-packages/01-introduction.md deleted file mode 100644 index 513785067..000000000 --- a/guides/hack/18-packages/01-introduction.md +++ /dev/null @@ -1,25 +0,0 @@ -Packages are an extension to modules for HHVM and Hack which allows developers to more easily configure which files to build and deploy. - -## Package definitions -A **package** is defined by a set of modules meant to be deployed together. Packages are configured in a toml file called `PACKAGES.toml` located at the root of your codebase (next to .hhconfig). - -```toml PACKAGES.toml -[packages] - -[packages.production] -uses=["prod.*", "my_prod"] # Package contains all modules that start with `prod`, and the module "my_prod". - -[packages.test] -uses=["test.*"] -includes=["production"] # Package depends on the production package -``` - -Every module can be in at most one package, so the same module cannot be part of two packages. Therefore, the same glob cannot appear in the uses clause of two different modules. - -## Overlaps in module globs -- It is an error for the same module glob to appear in multiple package definitions. Given a module with name foo.bar, we resolve what package the module belongs to with the following precedence: -- If a package lists foo.bar directly in its use clause, foo.bar belongs to that package. If multiple packages list foo.bar directly, we throw an error at package definition. -- If no package directly references the module, but a package has a prefix which matches foo.bar (in this case, foo.* for example), foo.bar belongs to the package with that prefix. If multiple packages list a prefix of the module, we take the most specific prefix, i.e. the longest prefix that matches. -- If no package references the module in its use clause, the module belongs to the default package. - -Once you've defined a set of packages, you can deploy them using [deployments](./deployments.md). diff --git a/guides/hack/18-packages/02-deployments.md b/guides/hack/18-packages/02-deployments.md deleted file mode 100644 index 04ef56135..000000000 --- a/guides/hack/18-packages/02-deployments.md +++ /dev/null @@ -1,34 +0,0 @@ -Once you've defined a set of packages, you can deploy them using **deployments**. - -## Deployments -A **deployment** is defined as a set of packages. Deployments are also defined in PACKAGES.toml: - -```toml PACKAGES.toml -[packages] - -[packages.production] -uses=["prod.*", "my_prod"] # Package contains all modules that start with `prod`, and the module "my_prod". - -[packages.test] -uses=["test.*"] -includes=["production"] # Package depends on the production package - -[deployments] -[deployments.production] -packages=["production"] - -[deployments.test] -packages=["test", "production"] # Since the test package includes production, they must be deployed together. -``` - -When building in [repo authoritative](../../hhvm/advanced-usage/repo-authoritative.md) mode, you can pass in the build configuration `Eval.ActiveDeployment = ` to set the active deployment. HHVM will then include only the files in the active deployment when building. - -## Deployment domains -In CLI-server mode, HHVM can direct different domains to different deployments, allowing you to treat a web request as if it were built in repo mode with a specific deployment. You can set the `domains` value of to any deployment to a list of regexes: - -```toml -[deployments.production] -packages=["production"] -domains=["^.*my_website\.com"] -``` -The domains field matches on the `Host` field of any web request that HHVM serves. In this example, traffic that hits `my_website.com` will be treated as if the active deployment were production. Note that a hostname can match multiple regexes, but the **first** deployment listed which has a regex that matches the hostname will be used. diff --git a/guides/hack/18-packages/03-cross-package-calls.md b/guides/hack/18-packages/03-cross-package-calls.md deleted file mode 100644 index 702e707d1..000000000 --- a/guides/hack/18-packages/03-cross-package-calls.md +++ /dev/null @@ -1,176 +0,0 @@ -Symbols across packages are not directly visible to each other, since they may be in different builds. Accessing a symbol that belongs in a module that is in a different package will generally result in an error. Consider the following PACKAGES.toml: - -```toml -[packages] - -[packages.production] -uses=["prod.*", "my_prod"] # Package contains all modules that start with `prod`, and the module "my_prod". - -[packages.test] -uses=["test.*"] -includes=["production"] # Package depends on the production package - -[deployments] -[deployments.production] -packages=["production"] - -[deployments.test] -packages=["test", "production"] # Since the test package includes production, they must be deployed together. -``` - -```hack file:example1.hack -//// test/__MODULE__.hack -new module test.foo { -} -``` -```hack file:example1.hack -//// prod/__MODULE__.hack -new module prod.bar { -} -``` - -```hack file:example1.hack -//// test.hack -module test.foo; -class Foo { -} -``` - -```hack file:example1.hack -//// prod/prod.hack -module prod.bar; -class Bar {} -<<__EntryPoint>> -public function bad_call(): void { - // $x = new FooTest(); - // typechecker error: FooTest is in module test.foo - // which is not visible to package fb-www -} -``` -At runtime, the call will succeed only if the active deployment in HHVM is set to a deployment that contains the `test` package. - -A package that inclues another package can freely access all of its symbols. For example, in our original PACKAGES.toml, since the tests package includes prod, we can call production code from the test package: - -```hack file:example1.hack -//// test_bar.hack -module test.foo; -<<__EntryPoint>> -public function test_bar(): void { - $x = new Bar(); // ok -} - -``` - - -## Experimental: Accessing symbols across packages - -Sometimes, one may want to check at runtime whether a certain package is in the active deployment, and if so, behave differently. To do so, you can use a new `package` syntax. `package ` desugars down to `package_exists()`, and the typechecker intelligently allows you to access symbols within certain blocks when conditioned on `package` syntax. To access cross package syntax, enable the unstable feature "package". - -```hack no-extract -module test.foo; -class TestFoo implements IFoo { - //... - public function testMethod(): void {} -} -``` - -```hack no-extract -<> -module prod.bar; -interface IFoo { - //... -} -class Foo implements IFoo { - //... -} - -class FooLoader { - public async function genLoad(): Awaitable { - if (package test) { - // Typechecker allows this because it's within a if package block. - return new TestFoo(); - } else { - return new Foo(); - } - } -} -``` - -You may also want to mark an entire method or function as cross package, which asserts that the method is only called when a package is loaded. You can do so by marking a method with the `<<__CrossPackage()>>` attribute. - -```hack no-extract -<> -module prod.bar; // in package prod -class Foo { - <<__CrossPackage("test")>> - public function getTest(): TestFoo { - return new TestFoo(); - } -} -``` -A cross package method can reference types from the package it requires. Calling a cross package method at runtime may lead to undefined class errors, if the intended symbols are not in an active deployment. At typecheck time, cross package methods can only be called when you statically know a package is loaded (via a package loaded expression, for example). - -```hack no-extract -<> -public function test(): void { - $x = new Foo(); - $y = null; - if (package test) { - $y = $x->getTest(); - $y->testMethod(); // ok, package test is loaded - } - $z = $x->getTest(); // error, cannot call a cross package method getTest since it requires package test to be loaded. - - // error, $y is in a different package unaccessible by this package, so is opaque. - // please wrap this in a package statement - $y?->testMethod(); -} -``` - -If a package loaded expression is the only expression in an invariant statement, then for the rest of the scope of the current block, that package is accessible. -```hack no-extract -invariant(package test, "Test package is loaded"); -$x = new TestFoo(); -``` -You can nest package statements to access multiple loaded packages at once. - -```hack no-extract -if (package foo) { - if (package bar) { - // can access foo or bar - } else { - // can access foo - } -} -``` -## Runtime behavior - -Cross package methods are primarily a typechecker feature, in that they allow you to express types and prove to the typechecker that a method exists. At runtime, the set of loaded packages is determined primarily by the active deployment (or the deployment matching the current request in non repo-authoritative mode). At runtime, `package foo` desugars to `package_exists(“foo”)`, which, just like other `*_exists` functions, returns true if "foo" is in the active deployment. `foo` is a static string in this context, and we throw a naming error at typecheck time if `foo` is not a valid package name. At runtime, calling `package_exists` or using `package` syntax on a non existent package will simply return false. - -## Inheritance and subtyping - -Note that you cannot implement an interface or extend a class from a different package, unless the current package includes that package (otherwise, you wouldn't know whether the class you were extending always existed). -```hack no-extract -module prod.foo; -class FooBad extends TestFoo {} // error, TestFoo is in package test. prod.foo is in package prod, which does not include test. -``` - -A method or function being cross package is **covariant** on its type. This means that regular, non cross-package functions are subtypes of cross package functions, but not vice versa. This also means that a non cross package method can override a cross package method, but not the other way around. Semantically, you can think of the Cross Package attribute as an extra argument on the method or function, as it requires a specific condition to be true before allowing the function to be called. - -```hack no-extract -<> -module prod.foo; -class FooLoader { - public function get(): IFoo { - return new Foo(); - } -} - -class FooLoaderBad extends FooLoader { - // error, cannot override non cross package method with cross package one. - <<__Override, __CrossPackage("test")>> - public function get(): IFoo { - return new TestFoo(); - } -} -``` diff --git a/guides/hack/18-packages/04-configuration-spec.md b/guides/hack/18-packages/04-configuration-spec.md deleted file mode 100644 index abaf42b53..000000000 --- a/guides/hack/18-packages/04-configuration-spec.md +++ /dev/null @@ -1,71 +0,0 @@ -This page has detailed documentation of each field in PACKAGES.toml. - -``` -# PACKAGES.toml -[packages] - -[packages.prod] -uses = ["prod.*"] -includes = ["default"] -soft_includes = ["test_soft"] - -[packages.test_strict] -uses = ["test.*"] -includes = ["prod", "test_soft", "default"] - -# Code that’s in test but may be dynamically called from prod -[packages.test_soft] -uses = ["test_soft.*"] -includes = ["prod", "default"] - -[packages.default] # default package with everything else -uses=[".*"] - -[deployments.test-website] -packages = ["test_strict", "test_soft", "prod", "default"] -domains = ['.*test\.my-website\.com'] - -[deployments.prod-website] -packages = ["prod", "default"] -soft_packages = ["test_soft"] -domains = ['.*\.my-website\.com'] -``` - - -A PACKAGES.toml file contains two main sections: packages and deployments. -The packages section lists all available packages and their respective dependencies. Each package is defined as a nested table with a unique name, and can have two fields: - -**uses:** a list of module globs that this package depends on. For example, `prod.*` means that this package uses the module `prod` and all modules that start with `prod.*`. A module can only be part of a single package, and match the most specific glob when deciding which package it’s a part of. - -**includes:** a string list of other package names that this package depends on. Any package `A` that is included by a package `B` must be deployed in any deployment that B is present in. - -**soft_includes:** a string list of package names that this package may depend on dynamically. Accessing a package that’s soft included from this package will raise a Hack error. Any package `A` that is soft included by a package `B` must be at least soft deployed in any deployment that `B` is present in. - -The deployments section lists all deployments and their respective packages and domains. Each deployment is defined as a nested table with a unique name, and can have two fields: -packages: a list of packages that are in this deployment. The list must be transitively closed, that is, any package that is (non softly) included by any package in this list must also be in the list. - -**soft_packages:** a list of packages that are included in this deployment at runtime, but will log when accessed. Any packages that are soft included by any package in the deployment must be either in this list or the list of hard included packages above. -domains: a list of domains where this deployment is accessible on sandboxes. A domain is listed as a list of regular expressions. In sandboxes, HHVM matches these regular expressions on the Host field of any request. When choosing which deployment is considered active in sandbox mode, HHVM will take the first eligible deployment which contains a domain regex that matches a given host. - -Note that any code that isn’t in a module is considered part of the default module, which is simply a module with the name `default`. The default module can be globbed into any package, the same way any other module can be: - -``` -[[packages.with_default]] -uses=["default", "prod.*"] # prod can call code outside of modules - -[[packages.no_default]] # foo cannot call code outside of modules -uses=["foo"] -``` - - -A common use case is to put the default module into a default package which globs ".*", which contains the default module. Then you can include that package in all deployments (and have other packages depend on it). - -``` -[packages.default] # default package with everything else -uses=[".*"] - - -[packages.foo] -uses=["foo.*"] -includes=["default"] -``` diff --git a/guides/hack/18-packages/packages-category.txt b/guides/hack/18-packages/packages-category.txt deleted file mode 100644 index 263beb086..000000000 --- a/guides/hack/18-packages/packages-category.txt +++ /dev/null @@ -1 +0,0 @@ -Getting Started diff --git a/guides/hack/18-packages/packages-summary.txt b/guides/hack/18-packages/packages-summary.txt deleted file mode 100644 index 6ffe6e62f..000000000 --- a/guides/hack/18-packages/packages-summary.txt +++ /dev/null @@ -1 +0,0 @@ -Combine modules into separate builds and deployments. diff --git a/guides/hack/20-attributes/01-introduction.md b/guides/hack/20-attributes/01-introduction.md deleted file mode 100644 index 058af72ce..000000000 --- a/guides/hack/20-attributes/01-introduction.md +++ /dev/null @@ -1,65 +0,0 @@ -Attributes attach metadata to Hack definitions. - -Hack provides built-in attributes that can change runtime or -typechecker behavior. - -```Hack -<<__Memoize>> -function add_one(int $x): int { - return $x + 1; -} -``` - -You can attach multiple attributes to a definition, and attributes can -have arguments. - -``` Hack -<<__ConsistentConstruct>> -class OtherClass { - <<__Memoize, __Deprecated("Use FooClass methods instead")>> - public function addOne(int $x): int { - return $x + 1; - } -} -``` - -## Defining an attribute - -You can define your own attribute by implementing an attribute -interface in the HH namespace. - -```Hack file:contributors.hack -class Contributors implements HH\ClassAttribute { - public function __construct(private string $author, private ?keyset $maintainers = null) {} - public function getAuthor(): string { - return $this->author; - } - public function getMaintainers(): keyset { - return $this->maintainers ?? keyset[$this->author]; - } -} - -<> -class MyClass {} - -<> -class YourClass {} -``` - -Other common attribute interfaces are `HH\FunctionAttribute`, -`HH\MethodAttribute` and `HH\PropertyAttribute`, but see [the Hack -interface reference](/hack/reference/interface/) for the full list. - - -## Accessing attribute arguments - -You need to use reflection to access attribute arguments. - -Given the `MyClass` example defined above: - -```Hack file:contributors.hack -$rc = new ReflectionClass('MyClass'); -$my_class_contributors = $rc->getAttributeClass(Contributors::class); -$my_class_contributors?->getAuthor(); // "John Doe" -$my_class_contributors?->getMaintainers(); // keyset["ORM Team", "Core Library Team"] -``` diff --git a/guides/hack/20-attributes/07-predefined-attributes.md b/guides/hack/20-attributes/07-predefined-attributes.md deleted file mode 100644 index 62307f326..000000000 --- a/guides/hack/20-attributes/07-predefined-attributes.md +++ /dev/null @@ -1,534 +0,0 @@ -The following attributes are defined: -* [__AcceptDisposable](#__acceptdisposable) -* [__AutocompleteSortText](#__autocompletesorttext) -* [__ConsistentConstruct](#__consistentconstruct) -* [__Deprecated](#__deprecated) -* [__Docs](#__docs) -* [__DynamicallyCallable](#__dynamicallycallable) -* [__DynamicallyConstructible](#__dynamicallyconstructible) -* [__EnableMethodTraitDiamond](#__enablemethodtraitdiamond) -* [__Enforceable](#__enforceable) -* [__EntryPoint](#__entrypoint) -* [__Explicit](#__explicit) -* [__LateInit](#__lateinit) -* [__LSB](#__lsb) -* [__Memoize](#__memoize) -* [__MemoizeLSB](#__memoizelsb) -* [__MockClass](#__mockclass) -* [__ModuleLevelTrait](#__moduleleveltrait) -* [__Newable](#__newable) -* [__Override](#__override) -* [__PHPStdLib](#__phpstdlib) -* [__ReturnDisposable](#__returndisposable) -* [__Sealed](#__sealed) -* [__Soft](#__soft) - -## __AcceptDisposable - -This attribute can be applied to a function parameter that has a type that implements interface `IDisposable` or `IAsyncDisposable`. - -See [object disposal](../classes/object-disposal.md) for an example of its use. - -## __AutocompleteSortText - -When we are displaying autocomplete suggestions, we sort method suggestions -alphabetically. To override what text is used for sorting a specific method in -the autocomplete suggestions, use the `__AutocompleteSortText` attribute. - -```Hack file:base.hack -class Dog { - <<__AutocompleteSortText('!getName')>> - public function getName(): string { - return "Clifford"; - } - - public function getOwner(): string { - return "Emily"; - } - - public function getFriends(): vec { - return vec["Cleo"]; - } -} -``` - -In the above example, autocomplete suggestions would typically show in the -order: `getFriends`, `getName`, `getOwner` - -But since the `__AutocompleteSortText` is used, the order is: `getName`, -`getFriends`, `getOwner` - -## __ConsistentConstruct - -When a method is overridden in a derived class, it must have exactly the same number, type, and order of parameters as that in the base -class. However, that is not usually the case for constructors. Having a family of constructors with different signatures can cause a problem, -however, especially when using `new static`. - -This attribute can be applied to classes; it has no attribute values. Consider the following example: - -```Hack -<<__ConsistentConstruct>> -class Base { - public function __construct() {} - - public static function make(): this { - return new static(); - } -} - -class Derived extends Base { - public function __construct() { - parent::__construct(); - } -} - -function demo(): void { - $v2 = Derived::make(); -} -``` - -When `make` is called on a `Derived` object, `new static` results in `Derived`'s constructor being called knowing only the parameter list -of `Base`'s constructor. As such, `Derived`'s constructor must either have the exact same signature as `Base`'s constructor, or the same -plus an ellipsis indicating a trailing variable-argument list. - -## __Deprecated - -If you mark a function with `__Deprecated`, the Hack typechecker will find all static invocations of that function and mark them as errors so that you can find those invocations and fix them as needed. For runtime invocations, any function marked with `__Deprecated` will still be called successfully, but with runtime logging so that you can find and fix those dynamic invocations later. - -Consider the following example: - -```Hack -<<__Deprecated("This function has been replaced by do_that", 7)>> -function do_this(): void { /* ... */ } -``` - -The presence of this attribute on a function has no effect, unless that function is actually called, in which case, for each call to that -function, HHVM raises a notice containing the text from the first attribute value. The optional `int`-typed second attribute -value (in this case, 7) indicates a *sampling rate*. - -Every 1/sampling-rate calls (as in, 1/7) to that function will raise a notice at runtime. If omitted, the default sampling rate is 1 -(i.e. all calls raise notices). - -To disable runtime notices, use a sampling rate of 0. - -## __Docs - -Associates a documentation URL with a type. - -```Hack file:base.hack -<<__Docs("http://www.example.com/my_framework")>> -class MyFrameworkBaseClass {} -``` - -The IDE will include this URL when hovering over the -`MyFrameworkBaseClass` type name. - -```Hack file:base.hack -class MyClass extends MyFrameworkBaseClass {} -``` - -Docs URLs are also inherited. Hovering over the `MyClass` type name -will also show the docs URL. - -## __DynamicallyCallable - -Allows a function or method to be called dynamically, based on a -string of its name. HHVM will warn on error (depending on -configuration) on dynamic calls to functions or methods without this attribute. - -## __DynamicallyConstructible - -Allows this class to be instantiated dynamically, based on a string of -its name. HHVM will warn on error (depending on configuration) on -dynamic instantiations of classes without this attribute. - -## __EnableMethodTraitDiamond - -This attribute can be applied to a class or trait to enable resolution of traits used along multiple paths. - -See [using a trait](../traits-and-interfaces/using-a-trait.md) for an example of its use. - - -## __Enforceable - -A type is _enforceable_ if it can be used in `is` and `as` expressions. Examples of non-enforceable types are function types and erased (non-reified) generics. The `__Enforceable` attribute is used to annotate abstract type constants so they can only be instantiated with enforceable types, and thus used in `is` and `as` expressions. The attribute restricts deriving type constants to values that are valid for a type test. - -```Hack error -abstract class A { - abstract const type Tnoenf; - <<__Enforceable>> - abstract const type Tenf; - - public function f(mixed $m): void { - $m as this::Tenf; // OK - - $m as this::Tnoenf; // Hack error - } -} - -class B1 extends A { - const type Tnoenf = (function (): void); // ok - const type Tenf = (function (): void); // Hack error, function types cannot be used in type tests -} - -class B2 extends A { - const type Tnoenf = (function (): void); // ok - const type Tenf = int; // ok -} -``` - -Similarly, the `__Enforceable` attribute can also be used to annotate reified generics, enabling the generic to be used in a type test expression. - -## __Explicit - -Requires callers to explicitly specify the value for a generic -type. Normally Hack allows generics to be inferred at the call site. - -```Hack error -function values_are_equal<<<__Explicit>> T>(T $x, T $y): bool { - return $x === $y; -} - -function example_usage(int $x, int $y, string $s): void { - values_are_equal($x, $y); - - // Without <<__Explicit>>, this code would be fine, even though - // it always returns false. - values_are_equal($x, $s); -} -``` - -## __EntryPoint - -A Hack program begins execution at a top-level function referred to as the *entry-point function*. A top-level function can be designated as such using this attribute, which -has no attribute values. For example: - -```Hack -<<__EntryPoint>> -function main(): void { - printf("Hello, World!\n"); -} -``` - -Note: An entry-point function will *not* be automatically executed if the file containing such a function is included via require or the autoloader. - -## __LateInit - -Hack normally requires properties to be initialized, either with an -initial value on the property definition or inside the constructor. - -`__LateInit` disables this check. - -```Hack -class Foo {} - -class Bar { - <<__LateInit>> private Foo $f; - - public function trustMeThisIsCalledEarly(): void { - $this->f = new Foo(); - } -} -``` - -**This is intended for testing**, where it's common to have a setup -function that initializes values. - -Accessing a property that is not initialized produces a runtime error. - -`__LateInit` can also be used with static properties. - -```Hack -class Foo {} - -class Bar { - <<__LateInit>> private static Foo $f; - - public static function trustMeThisIsCalledEarly(): void { - self::$f = new Foo(); - } -} -``` - -It may be clearer to write your code using a memoized static method -instead of a static property with `__LateInit`. - -## __LSB - -Marks this property as implicitly redeclared on all subclasses. This ensures each subclass has its own value for the property. - -## __Memoize - -The presence of this attribute causes the designated method to automatically cache each value it looks up and returns, so future calls with -the same parameters can be retrieved more efficiently. The set of parameters is hashed into a single hash key, so changing the type, number, -and/or order of the parameters can change that key. Functions with variadic parameters can not be memoized. - -This attribute can be applied to functions and static or instance methods; it has no attribute values. Consider the following example: - -```Hack no-extract -class Item { - <<__Memoize>> - public static function get_name_from_product_code(int $productCode): string { - if (name-in-cache) { - return name-from-cache; - } else { - return Item::get_name_from_storage($productCode); - } - } - private static function get_name_from_storage(int $productCode): string { - // get name from alternate store - return ...; - } -} -``` - -`Item::get_name_from_storage` will only be called if the given product code is not in the cache. - -The types of the parameters are restricted to the following: `null`, `bool`, `int`, `float`, `string`, any object type that implements -`IMemoizeParam`, enum constants, tuples, shapes, and arrays/collections containing any supported element type. - -The interface type `IMemoizeParam` assists with memoizing objects passed to async functions. - -You can clear the cache with `HH\clear_static_memoization`. This should only be used **in tests** where: -- the component being tested is meant to be immutable/idempotent for the entire request -- the test needs to cover multiple initial states, where only one would truly be reachable in a single request - -NOTE: Putting the `__Memoize` attribute on a static method will cause it to bind -to the declaring class. When you do this, any uses of `static::` constructs to -retrieve definitions from subclasses can cause unexpected results (they will -actually access the declaring class, similar to equivalent `self::` constructs). -Consider using `__MemoizeLSB` instead on static methods. - -### Exceptions - -Thrown exceptions are not memoized, showing by the increasing counter in this -example: - -```Hack -class CountThrows { - private int $count = -1; - <<__Memoize>> - public function doStuff(): void { - $this->count += 1; - throw new \Exception('Hello '.$this->count); - } -} - -<<__EntryPoint>> -function main(): void { - $x = new CountThrows(); - for($i = 0; $i < 2; ++$i) { - try { - $x->doStuff(); - } catch (\Exception $e) { - \var_dump($e->getMessage()); - } - } -} -``` - -### Awaitables and Exceptions -As memoize caches an [Awaitable](../asynchronous-operations/awaitables) itself, this means that **if an async function -is memoized and throws, you will get the same exception backtrace on every -failed call**. - -For more information and examples, see [Memoized Async Exceptions](../asynchronous-operations/exceptions#memoized-async-exceptions). - -## __MemoizeLSB - -This is like [<<__Memoize>>](#__memoize), but the cache has Late Static Binding. Each subclass has its own memoize cache. - -You can clear the cache with `HH\clear_lsb_memoization`. This should only be used **in tests** where: -- the component being tested is meant to be immutable/idempotent for the entire request -- the test needs to cover multiple initial states, where only one would truly be reachable in a single request - -## __MockClass -```yamlmeta -{ - "fbonly messages": [ - "Mock classes are intended for test infrastructure. They should not be added or used directly in Facebook's WWW repository." - ] -} -``` -Mock classes are useful in testing frameworks when you want to test functionality provided by a legitimate, user-accessible class, -by creating a new class (many times a child class) to help with the testing. However, what if a class is marked as `final` or a method in a -class is marked as `final`? Your mocking framework would generally be out of luck. - -The `__MockClass` attribute allows you to override the restriction of `final` on a class or method within a class, so that a -mock class can exist. - -```Hack no-extract -final class FinalClass { - public static function f(): void { - echo __METHOD__, "\n"; - } -} - -// Without this attribute HHVM would throw a fatal error since you are trying -// to extend a final class. With it, you can run the code as you normally would. -// That said, you will still get Hack typechecker errors, since it does not -// recognize this attribute as anything intrinsic, but these can be suppressed. - -/* HH_IGNORE_ERROR [2049] */ -<<__MockClass>> -/* HH_IGNORE_ERROR [4035] */ -final class MockFinalClass extends FinalClass { - public static function f(): void { - echo __METHOD__, "\n"; - - // Let's say we were testing the call to the parent class. We wouldn't - // be able to do this in HHVM without the __MockClass attribute. - parent::f(); - } -} - -<<__EntryPoint>> -function main(): void { - $o = new MockFinalClass(); - $o::f(); -} -``` - -Mock classes *cannot* extend types `vec`, `dict`, and `keyset`, or the Hack legacy types `Vector`, `Map`, and `Set`. - -## __ModuleLevelTrait - -Can be used on public traits. The elements of a trait annotated with `<<__ModuleLevelTrait>>` are considered to belong to the module where the trait is defined, and can access other internal symbols of the module. For more information see [Traits and Modules](../modules/traits.md). - -## __Newable - -This attribute is used to annotate reified type parameters to ensure that they are only instantiated with classes on which `new` can be safely called. A common pattern, defining a function that creates instances of a class passed as type parameter, is: - -```Hack -final class A {} - -function f<<<__Newable>> reify T as A>(): T { - return new T(); -} -``` - -The class `A` must either be final (as in the example) or annotated with `__ConsistentConstruct`. The `__Newable` attribute ensures that the function `f` is only be applied to a _non-abstract_ class, say `C`, while the `as A` constraint guarantees that the interface of the constructor of `C` is uniquely determined by the interface of the constructor of class `A`. The generic type `T` must be reified so that the runtime has access to it, refer to [Generics: Reified Generics](../generics/reified-generics.md) for details. - -A complete example thus is: - -```Hack -<<__ConsistentConstruct>> -abstract class A { - public function __construct(int $x, int $y) {} -} - -class B extends A {} - -function f<<<__Newable>> reify T as A>(int $x, int $y): T { - return new T($x,$y); -} - -<<__EntryPoint>> -function main(): void { - f(3,4); // success, equivalent to new B(3,4) -} -``` - -Omitting either the `__Newable` attribute for `T`, or the `__ConsistentConstruct` for the abstract class `A` will result in a type-checker error. - - -## __Override - -Methods marked with `__Override` must be used with inheritance. - -For classes, `__Override` ensures that a parent class has a method -with the same name. - -```Hack -class Button { - // If we rename 'draw' to 'render' in the parent class, - public function draw(): void { /* ... */ } -} -class CustomButton extends Button { - // then the child class would get a type error. - <<__Override>> - public function draw(): void { /* ... */ } -} -``` - -For traits, `__Override` ensures that trait users have a method that -is overridden. - -```Hack -class Button { - public function draw(): void { /* ... */ } -} - -trait MyButtonTrait { - <<__Override>> - public function draw(): void { /* ... */ } -} - -class ExampleButton extends Button { - // If ExampleButton did not have an inherited method - // called 'draw', this would be an error. - use MyButtonTrait; -} -``` - -It is often clearer to use constraints on traits instead. The above -trait could also be written like this. - -```Hack -class Button { - public function draw(): void { /* ... */ } -} - -trait MyButtonTrait { - // This makes the relationship with Button explicit. - require extends Button; - - public function draw(): void { /* ... */ } -} - -class ExampleButton extends Button { - use MyButtonTrait; -} -``` - -## __PHPStdLib - -This attribute tells the type checker to ignore a function or class, -so type errors are reported on any code that uses it. - -This is useful when gradually deprecating PHP features. - -`__PHPStdLib` only applies on `.hhi` files by default, but can apply -everywhere with the option `deregister_php_stdlib`. - -## __ReturnDisposable - -This attribute can be applied to a function that returns a value whose type implements interface `IDisposable` or `IAsyncDisposable`. - -See [object disposal](../classes/object-disposal.md) for an example of its use. - -## __Sealed - -A class that is *sealed* can be extended directly only by the classes named in the attribute value list. Similarly, an interface that is sealed -can be implemented directly only by the classes named in the attribute value list. Classes named in the attribute value list can themselves be -extended arbitrarily unless they are final or also sealed. In this way, sealing provides a single-level restraint on inheritance. -For example: - -```Hack -<<__Sealed(X::class, Y::class)>> -abstract class A {} - -class X extends A {} -class Y extends A {} - -<<__Sealed(Z::class)>> -interface I {} - -class Z implements I {} -``` - -Only classes `X` and `Y` can directly extend class `A`, and only class `Z` can directly implement interface `I`. - -## __Soft - -Disable type enforcement. See [soft types](/hack/types/soft-types). diff --git a/guides/hack/20-attributes/attributes-category.txt b/guides/hack/20-attributes/attributes-category.txt deleted file mode 100644 index 1dcccc5c6..000000000 --- a/guides/hack/20-attributes/attributes-category.txt +++ /dev/null @@ -1 +0,0 @@ -Classes, Interfaces, Traits diff --git a/guides/hack/20-attributes/attributes-summary.txt b/guides/hack/20-attributes/attributes-summary.txt deleted file mode 100644 index 3e15d1942..000000000 --- a/guides/hack/20-attributes/attributes-summary.txt +++ /dev/null @@ -1 +0,0 @@ -Attaching metadata to Hack programs, built-in attributes and defining your own. diff --git a/guides/hack/21-XHP/01-setup.md b/guides/hack/21-XHP/01-setup.md deleted file mode 100644 index 8511e67a1..000000000 --- a/guides/hack/21-XHP/01-setup.md +++ /dev/null @@ -1,64 +0,0 @@ -XHP provides a native XML-like representation of output. - -After adding the required dependencies, read the [Introduction](/hack/XHP/introduction). - -## The XHP-Lib Library -While XHP syntax is a part of the Hack language, implementation is in [XHP-Lib](https://github.com/hhvm/xhp-lib/), a library that needs to be installed with [Composer](https://getcomposer.org/). - -* XHP-Lib includes the base classes and interfaces, and definitions of standard HTML elements. -* Support for namespaced XHP classes (elements like `

`) is enabled by default since HHVM 4.73. - -### XHP-Lib Versions -We stongly recommend using XHP-Lib v4, which includes XHP namespace support. XHP-Lib v3 is not officially maintained. - -**Important:** All of the guides in this section are written with the assumption that XHP-Lib v4 is used, but there are notes pointing out any major differences—look for the **Historical note** sections. - -**XHP namespaces are not enabled in Facebook's WWW repository**, so all *Historical note* sections apply. - -#### XHP-Lib v4 -Used when XHP namespace support is enabled. Declares all base classes, interfaces and elements in namespaces (e.g. standard HTML elements are in `Facebook\XHP\HTML`). It is also more strict (e.g. disallows most mutations after an element is rendered) and deprecates some features (e.g. attribute "clobbering" in `XHPHTMLHelpers`). - -To install, add `facebook/xhp-lib` to your `composer.json` manually, or run `composer require facebook/xhp-lib ^4.0` - -#### XHP-Lib v3 -Used in older HHVM versions or when XHP namespace support is disabled. Declares everything in the root namespace, with the exception of `Facebook\XHP\ChildValidation`. - -To install, add `facebook/xhp-lib` to your `composer.json` manually, or run `composer require facebook/xhp-lib ^3.0` - -### Enable Namespace Support -We recommend using HHVM 4.73 or newer, since it's more thoroughly tested and doesn't require any extra configuration, however, XHP namespace support can be enabled in older HHVM versions (since around HHVM 4.46) by adding the following flags to your `.hhconfig`: - -``` -enable_xhp_class_modifier = true -disable_xhp_element_mangling = true -``` - -And to `hhvm.ini` (or provided via `-d` when executing `hhvm`): - -``` -hhvm.hack.lang.enable_xhp_class_modifier=true -hhvm.hack.lang.disable_xhp_element_mangling=true -``` - -### Disable Namespace Support -In HHVM 4.73 or newer, XHP namespace support can be disabled by setting these to `false`. - -``` -hhvm.hack.lang.enable_xhp_class_modifier=false -hhvm.hack.lang.disable_xhp_element_mangling=false -``` - -If these flags are disabled, or if you're using an older version of HHVM: - -- XHP classes cannot be declared in namespaces (only in the root namespace) -- any code that uses XHP classes also cannot be in a namespace, as HHVM previously didn't have any syntax to reference XHP classes across namespaces -- note that the above two rules are not consistently enforced by the typechecker or the runtime, but violating them can result in various bugs -- it is, however, possible to use namespaced code from inside XHP class declarations - -Make sure to also use the correct version of XHP-Lib based on whether XHP namespace support is enabled in your HHVM version. - -## HHVM Configuration Flags -These are not enabled by default in any HHVM version, but we recommend enabling them in any new Hack projects: - -- `disable_xhp_children_declarations = true` disables the old way of declaring allowed children, which has been deprecated in favor of the `Facebook\XHP\ChildValidation\Validation` trait. See [Children](extending#children) for more information. -- `check_xhp_attribute = true` enables the typechecker to check that all required attributes are provided. Otherwise, these would only be errors at runtime. diff --git a/guides/hack/21-XHP/04-introduction.md b/guides/hack/21-XHP/04-introduction.md deleted file mode 100644 index 2076df390..000000000 --- a/guides/hack/21-XHP/04-introduction.md +++ /dev/null @@ -1,207 +0,0 @@ -XHP provides a native XML-like representation of output (which is usually HTML). This allows UI code to be typechecked, and automatically -avoids several common issues such as cross-site scripting (XSS) and double-escaping. It also applies other validation rules, e.g., `` -must contain ``. - -Using traditional interpolation, a simple page could look like this: - -```hack no-extract -$user_name = 'Fred'; -echo "<tt>Hello <strong>$user_name</strong></tt>"; -``` - -However, with XHP, it looks like this: - -```hack no-extract -$user_name = 'Fred'; -$xhp = <tt>Hello <strong>{$user_name}</strong></tt>; -echo await $xhp->toStringAsync(); -``` - -The first example uses string interpolation to output the HTML, while the second has no quotation marks—meaning that the syntax is -fully understood by Hack—but this does not mean that all you need to do is remove quotation marks. Other steps needed include: - - Use curly braces to include variables - e.g., `"<a>$foo</a>"` becomes `<a>{$foo}</a>`. - - As XHP is XML-like, all elements must be closed - e.g., `"<br>"` becomes `<br />`. - - Make sure your HTML is properly nested. - - Remove all HTML/attribute escaping - e.g., you don't need to call `htmlspecialchars` before including a variable in your XHP -output; and if you do, it will be double-escaped. - -## Why use XHP? - -The initial reason for most users is because it is *safe by default*: all variables are automatically escaped in a -context-appropriate way (e.g., there are different rules for escaping attribute values vs. text nodes). In addition, XHP -is understood by the typechecker, making sure that you don't pass invalid attribute values. A common example of this is `border="3"`, -but `border` is an on/off attribute, so a value of 3 doesn't make sense. - -For users experienced with XHP, the biggest advantage is that it is easy to add custom 'elements' with your own behavior, -which can then be used like plain HTML elements. For example, this site defines an `<a_post>` tag that has the same interface -as a standard `<a>` tag, but makes a POST request instead of a GET request: - -```hack no-extract -use namespace Facebook\XHP\Core as x; -use type Facebook\XHP\HTML\{XHPHTMLHelpers, a, form}; - - -final xhp class a_post extends x\element { - use XHPHTMLHelpers; - - attribute string href @required; - attribute string target; - - <<__Override>> - protected async function renderAsync(): Awaitable<x\node> { - $id = $this->getID(); - - $anchor = <a>{$this->getChildren()}</a>; - $form = ( - <form - id={$id} - method="post" - action={$this->:href} - target={$this->:target} - class="postLink"> - {$anchor} - </form> - ); - - $anchor->setAttribute( - 'onclick', - 'document.getElementById("'.$id.'").submit(); return false;', - ); - $anchor->setAttribute('href', '#'); - - return $form; - } -} -``` - -A little CSS is needed so that the `<form>` doesn't create a block element: - -``` -form.postLink { - display: inline; -} -``` - -At this point, the new element can be used like any built-in element: - -```hack no-extract -use type Facebook\XHP\HTML\a; -use type HHVM\UserDocumentation\a_post; - -<<__EntryPoint>> -async function intro_examples_a_a_post(): Awaitable<void> { - $get_link = <a href="http://www.example.com">I'm a normal link</a>; - $post_link = - <a_post href="http://www.example.com">I make a POST REQUEST</a_post>; - - echo await $get_link->toStringAsync(); - echo "\n"; - echo await $post_link->toStringAsync(); -} -```.expectf -<a href="http://www.example.com">I'm a normal link</a> -<form id="%s" method="post" action="http://www.example.com" class="postLink"><a onclick="document.getElementById("%s").submit(); return false;" href="#">I make a POST REQUEST</a></form> -``` - -## Runtime Validation - -Since XHP objects are first-class and not just strings, a whole slew of validation can occur to ensure that your UI does not have subtle bugs: - -```hack no-extract -function intro_examples_tag_matching_validation_using_string(): void { - echo '<div class="section-header">'; - echo '<a href="#use">You should have used <span class="xhp">XHP</naps></a>'; - echo '</div>'; -} - -async function intro_examples_tag_matching_validation_using_xhp( -): Awaitable<void> { - // Typechecker error - // Fatal syntax error at runtime - $xhp = - <div class="section-header"> - <a href="#use">You should have used <span class="xhp">XHP</naps></a> - </div>; - echo await $xhp->toStringAsync(); -} - -<<__EntryPoint>> -async function intro_examples_tag_matching_validation_run(): Awaitable<void> { - intro_examples_tag_matching_validation_using_string(); - await intro_examples_tag_matching_validation_using_xhp(); -} -``` - -The above code won't typecheck or run because the XHP validator will see that `<span>` and `<naps>` tags are mismatched; however, -the following code will typecheck correctly but fail to run, because while the tags are matched, they are not nested correctly -(according to the HTML specification), and nesting verification only happens at runtime: - -```hack no-extract -use namespace Facebook\XHP; -use type Facebook\XHP\HTML\{i, ul}; - -function intro_examples_allowed_tag_validation_using_string(): void { - echo '<ul><i>Item 1</i></ul>'; -} - -async function intro_examples_allowed_tag_validation_using_xhp( -): Awaitable<void> { - try { - $xhp = <ul><i>Item 1</i></ul>; - echo await $xhp->toStringAsync(); - } catch (XHP\InvalidChildrenException $ex) { - // We will get here because an <i> cannot be nested directly below a <ul> - \var_dump($ex->getMessage()); - } -} -``` - -```hack no-extract -<<__EntryPoint>> -async function intro_examples_allowed_tag_validation_run(): Awaitable<void> { - intro_examples_allowed_tag_validation_using_string(); - echo \PHP_EOL.\PHP_EOL; - await intro_examples_allowed_tag_validation_using_xhp(); -} -``` - -## Security - -String-based entry and validation are prime candidates for cross-site scripting (XSS). You can get around this by using special -functions like [`htmlspecialchars`](http://php.net/manual/en/function.htmlspecialchars.php), but then you have to actually remember -to use those functions. XHP automatically escapes reserved HTML characters to HTML entities before output. - -```hack no-extract -use type Facebook\XHP\HTML\{body, head, html}; - -function intro_examples_avoid_xss_using_string(string $could_be_bad): void { - // Could call htmlspecialchars() here - echo '<html><head/><body> '.$could_be_bad.'</body></html>'; -} - -async function intro_examples_avoid_xss_using_xhp( - string $could_be_bad, -): Awaitable<void> { - // The string $could_be_bad will be escaped to HTML entities like: - // <html><head></head><body><blink>Ugh</blink></body></html> - $xhp = - <html> - <head /> - <body>{$could_be_bad}</body> - </html>; - echo await $xhp->toStringAsync(); -} - -async function intro_examples_avoid_xss_run( - string $could_be_bad, -): Awaitable<void> { - intro_examples_avoid_xss_using_string($could_be_bad); - echo \PHP_EOL.\PHP_EOL; - await intro_examples_avoid_xss_using_xhp($could_be_bad); -} - -<<__EntryPoint>> -async function intro_examples_avoid_xss_main(): Awaitable<void> { - await intro_examples_avoid_xss_run('<blink>Ugh</blink>'); -} -``` diff --git a/guides/hack/21-XHP/07-basic-usage.md b/guides/hack/21-XHP/07-basic-usage.md deleted file mode 100644 index 20dcd8f8f..000000000 --- a/guides/hack/21-XHP/07-basic-usage.md +++ /dev/null @@ -1,168 +0,0 @@ -XHP is a syntax to create actual Hack objects, called *XHP objects*. They are meant to be used as a tree, where children can either be -other XHP objects or text nodes (or, rarely, other non-XHP objects). - -## Creating a Simple XHP Object - -Instead of using the `new` operator, creating XHP looks very much like XML: - -```Hack no-extract -$my_xhp_object = <p>Hello, world</p>; -``` - -`$my_xhp_object` now contains an instance of the `p` class. -It is a real object, meaning that `is_object` will return `true` and you can call methods on it. - -**Historical note:** -<span data-nosnippet class="fbOnly fbIcon">(applies in FB WWW repository)</span> -Before XHP namespace support (in XHP-Lib v3), XHP classes -lived in a separate (but still global) namespace from regular classes, denoted -by a `:` prefix in the typechecker and an `xhp_` prefix at runtime. `<p>` would -therefore instantiate a class named `:p` in Hack code and `xhp_p` at runtime. It -would therefore not conflict with a global non-XHP class named `p`, but would -conflict with a class named `xhp_p`. - -The following example utilizes three XHP classes: `div`, `strong`, `i`. Whitespace is insignificant, so you can create a readable -tree structure in your code. - -```hack no-extract -use type Facebook\XHP\HTML\{div, i, strong}; - -<<__EntryPoint>> -function basic_usage_examples_basic_xhp(): void { - \var_dump( - <div> - My Text - <strong>My Bold Text</strong> - <i>My Italic Text</i> - </div>, - ); -} -``` - -The `var_dump` shows that a tree of objects has been created, not an HTML/XML string. An HTML string can be produced by calling `await $xhp_object->toStringAsync()`. - -## Namespace Syntax - -When instantiating an XHP class using the `<ClassName>` syntax, `:` must be used -instead of `\` as a namespace separator (this mirrors XML's namespace syntax). -These are all equivalent ways to instantiate a `Facebook\XHP\HTML\p` object: - -``` -use type Facebook\XHP\HTML\p; -$xhp = <p>Hello, world</p>; -``` - -``` -use namespace Facebook\XHP\HTML; -$xhp = <HTML:p>Hello, world</HTML:p>; -``` - -``` -use namespace Facebook\XHP\HTML as h; -$xhp = <h:p>Hello, world</h:p>; -``` - -``` -// exists in the root namespace: -$xhp = <Facebook:XHP:HTML:p>Hello, world</Facebook:XHP:HTML:p>; -``` - -``` -namespace CustomNamespace; // from any namespace: -$xhp = <:Facebook:XHP:HTML:p>Hello, world</:Facebook:XHP:HTML:p>; -``` - -In all other contexts, `\` must be used, for example: - -``` -if ($obj is HTML\p) { ... } -h\p::staticMethod(); -$class_name = Facebook\XHP\HTML\p::class; -final xhp class my_element extends \Facebook\XHP\Core\element { ... } -``` - -**Historical note:** -<span data-nosnippet class="fbOnly fbIcon">(applies in FB WWW repository)</span> -Before XHP namespace support (in XHP-Lib v3), `:` is -allowed as part of an XHP class name, but it is *not* a namespace separator. It -is simply translated to `__` at runtime (this is called "name mangling"). For -example, `<ui:table>` would instantiate a global class named `xhp_ui__table`. In -all other contexts, XHP classes must be referenced with the `:` prefix (e.g. -`if ($obj is :ui:table) { ... }`). - -## Dynamic Content - -The examples so far have only shown static content, but usually you'll need to include something that's generated at runtime; for this, -you can use Hack expressions directly within XHP with braces: - -``` -<xhp_class>{$some_expression}</xhp_class> -``` - -This also works for attributes: - -``` -<xhp_class attribute={$some_expression} /> -``` - -More complicated expressions are also supported, for example: - -```hack no-extract -use type Facebook\XHP\HTML\{div, i, strong}; - -class MyBasicUsageExampleClass { - public function getInt(): int { - return 4; - } -} - -function basic_usage_examples_get_string(): string { - return "Hello"; -} - -function basic_usage_examples_get_float(): float { - return 1.2; -} - -<<__EntryPoint>> -async function basic_usage_examples_embed_hack(): Awaitable<void> { - $xhp_float = <i>{basic_usage_examples_get_float()}</i>; - - $xhp = - <div> - {(new MyBasicUsageExampleClass())->getInt()} - <strong>{basic_usage_examples_get_string()}</strong> - {$xhp_float /* this embeds the <i /> element as a child of the <div /> */} - </div>; - echo await $xhp->toStringAsync(); -} -``` - -## Attributes - -Like HTML, XHP supports attributes on an XHP object. An XHP object can have zero or any number of attributes available to it. The XHP -class defines what attributes are available to objects of that class: - -``` -echo <input type="button" name="submit" value="OK" />; -``` - -Here the `input` class has the attributes `type`, `name` and `value`. - -Some attributes are required, and XHP will throw an exception when an XHP object -is rendered (`toStringAsync()` is called) with any required attributes missing. -With `check_xhp_attribute=true` (available since HHVM 4.8) this is also a -typechecker error. - -Use the [`->:` operator](/hack/expressions-and-operators/XHP-attribute-selection) to select an attribute. - -## HTML Character References - -In order to encode a reserved HTML character or a character that is not readily available to you, you can use HTML character references in XHP: - -``` -<?hh -echo <span>♥ ♥ ♥</span>; -``` - -The above uses HTML character reference encoding to print out the heart symbol using the explicit name, decimal notation, and hex notation. diff --git a/guides/hack/21-XHP/10-interfaces.md b/guides/hack/21-XHP/10-interfaces.md deleted file mode 100644 index d6203501a..000000000 --- a/guides/hack/21-XHP/10-interfaces.md +++ /dev/null @@ -1,175 +0,0 @@ -There are two important XHP types, the `\XHPChild` interface (HHVM built-in) and -the `\Facebook\XHP\Core\node` base class (declared in XHP-Lib). You will most -commonly encounter these in functions' return type annotations. - -## `\XHPChild` - -XHP presents a tree structure, and this interface defines what can be valid child nodes of the tree; it includes: - -- all subclasses of `\Facebook\XHP\Core\node` and the advanced interfaces - described below -- strings, integers, floats -- arrays of any of the above - -Despite strings, integers, floats, and arrays not being objects, both the typechecker and HHVM consider them to implement this interface, -for parameter/return types and for `is` checks. - -## `\Facebook\XHP\Core\node` (`x\node`) - -The `\Facebook\XHP\Core\node` base class is implemented by all XHP objects, via -one of its two subclasses: - -- `\Facebook\XHP\Core\element` (`x\element`): most common; subclasses implement a - `renderAsync()` method that returns another `node`, and XHP-Lib automatically - takes care of recursively rendering nested XHP objects -- `\Facebook\XHP\Core\primitive` (`x\primitive`): for very low-level nodes that - need exact control of how the object is rendered to a string, or when the - automatic handling of nested XHP objects is insufficient; subclasses implement - a `stringifyAsync()` method that returns a `string` and must manually deal with - any children - -**Historical note:** -<span data-nosnippet fbIcon">(applies in FB WWW repository)</span> -Before XHP namespace support (in XHP-Lib v3), the names of -`node`, `element` and `primitive` are `\XHPRoot`, `:x:element` and -`:x:primitive` respectively. - -The `\Facebook\XHP\Core` namespace is conventionally aliased as `x` (`use Facebook\XHP\Core as x;`), so you might encounter these classes as `x\node`, -`x\element` and `x\primitive`, which also mirrors their historical names. - -## Advanced Interfaces - -While XHP's safe-by-default features are usually beneficial, occasionally they need to be bypassed; the most common cases are: - - Needing to embed the output from another template system when migrating to XHP. - - Needing to embed HTML from another source, for example, Markdown or BBCode renderers. - -XHP usually gets in the way of this by: - - Escaping all variables, including your HTML code. - - Enforcing child relationships - and XHP objects can not be marked as allowing HTML string children. - -The `\Facebook\XHP\UnsafeRenderable` and `\Facebook\XHP\XHPAlwaysValidChild` interfaces allow bypassing these safety mechanisms. - -**Historical note:** -<span data-nosnippet class="fbOnly fbIcon">(applies in FB WWW repository)</span> -Before XHP namespace support (in XHP-Lib v3), the names of -these interfaces are `\XHPUnsafeRenderable` and `\XHPAlwaysValidChild`. - -### `\Facebook\XHP\UnsafeRenderable` - -If you need to render raw HTML strings, wrap them in a class that implements this interface and provides a `toHTMLStringAsync()` method: - -```md.xss-security-hole.inc.hack -use namespace Facebook\XHP; - -/* YOU PROBABLY SHOULDN'T DO THIS - * - * Even with a scary (and accurate) name, it tends to be over-used. - * See below for an alternative. - */ -class ExamplePotentialXSSSecurityHole implements XHP\UnsafeRenderable { - public function __construct(private string $html) { - } - - public async function toHTMLStringAsync(): Awaitable<string> { - return $this->html; - } -} -``` -```md.xss-security-hole.hack no-auto-output -use type Facebook\XHP\HTML\div; - -<<__EntryPoint>> -async function start(): Awaitable<void> { - $xhp = - <div class="markdown"> - {new ExamplePotentialXSSSecurityHole( - md_render('Markdown goes here'), - )} - </div>; - echo await $xhp->toStringAsync(); -} -``` - -We do not provide an implementation of this interface as a generic implementation tends to be overused; instead, consider making more specific -implementations: - -```md.markdown-wrapper.inc.hack -use namespace Facebook\XHP; - -final class ExampleMarkdownXHPWrapper implements XHP\UnsafeRenderable { - private string $html; - - public function __construct(string $markdown_source) { - $this->html = md_render($markdown_source); - } - - public async function toHTMLStringAsync(): Awaitable<string> { - return $this->html; - } -} -``` -```md.markdown-wrapper.hack no-auto-output -use type Facebook\XHP\HTML\div; - -<<__EntryPoint>> -async function run(): Awaitable<void> { - $xhp = - <div class="markdown"> - {new ExampleMarkdownXHPWrapper('Markdown goes here')} - </div>; - echo await $xhp->toStringAsync(); -} -``` - -### `\Facebook\XHP\AlwaysValidChild` - -XHP's child validation can be bypassed by implementing this interface. Most classes that implement this interface are also implementations of -`UnsafeRenderable`, as the most common need is when a child is produced by another rendering or template system. - -This can also be implemented by XHP objects, but this usually indicates that some class in `getChildrenDeclaration()` should be replaced with a more generic interface. -`AlwaysValidChild` is intentionally breaking part of XHP's safety, so should be used as sparingly as possible. - -## Example - -```all-in-one.inc.hack -use namespace Facebook\XHP; - -final class XHPUnsafeExample implements XHP\UnsafeRenderable { - public async function toHTMLStringAsync(): Awaitable<string> { - /* HH_FIXME[2050] $_GET is not recognized by the typechecker */ - return '<script>'.$_GET['I_LOVE_XSS'].'</script>'; - } -} -``` -```all-in-one.hack -use namespace Facebook\XHP\Core as x; -use type Facebook\XHP\HTML\{div, li}; - -<<__EntryPoint>> -function all_in_one_xhp_example_main(): void { - $inputs = Map { - '<div />' => <div />, - '<x:frag />' => <x:frag />, - '"foo"' => 'foo', - '3' => 3, - 'true' => true, - 'null' => null, - 'new stdClass()' => new \stdClass(), - 'vec[<li />, <li />, <li />]' => vec[<li />, <li />, <li />], - 'XHPUnsafeExample' => new XHPUnsafeExample(), - }; - - $max_label_len = \max($inputs->mapWithKey(($k, $_) ==> \strlen($k))); - print Str\repeat(' ', $max_label_len + 1)." | XHPRoot | XHPChild\n"; - print Str\repeat('-', $max_label_len + 1)."-|---------|----------\n"; - - foreach ($inputs as $label => $input) { - \printf( - " %s | %-7s | %s\n", - Str\pad_left($label, $max_label_len, ' '), - $input is x\node ? 'yes' : 'no', - $input is \XHPChild ? 'yes' : 'no', - ); - } -} -``` diff --git a/guides/hack/21-XHP/13-methods.md b/guides/hack/21-XHP/13-methods.md deleted file mode 100644 index e612a4b99..000000000 --- a/guides/hack/21-XHP/13-methods.md +++ /dev/null @@ -1,57 +0,0 @@ -Remember, all XHP Objects derive from the [`\Facebook\XHP\Core\node`](/hack/XHP/interfaces) base class, which has some public methods that can be called. - -Method | Description ---------|------------ -`toStringAsync(): Awaitable<string>` | Renders the element to a string for output. Mutating methods like `setAttribute` can no longer be called after this. -`appendChild(mixed $child): this` | Adds `$child` to the end of the XHP object's array of children. If `$child` is an array, each item in the array will be appended. -`getAttribute(string $name): mixed` | Returns the value of the XHP object's attribute named `$name`. If the attribute is not set, `null` is returned, unless the attribute is required, in which case `AttributeRequiredException` is thrown. If the attribute is not declared or does not exist, then `AttributeNotSupportedException` is thrown. If the attribute you are reading is statically known, use `$this->:name` style syntax instead for better typechecker coverage. -`getAttributes(): dict<string, mixed>` | Returns the XHP object's array of attributes. -`getChildren(): vec<XHPChild>` | Returns the XHP object's children. -`getChildrenOfType<T as XHPChild>(): vec<T>` | Returns the XHP object's children of the specified type (usually a class/interface, but can also be `string` or another type). -`getFirstChild(): ?XHPChild` | Returns the XHP object's first child or `null` if it has no children. -`getFirstChildx(): XHPChild` | Same but throws if the XHP object has no children. -`getFirstChildOfType<T as XHPChild>(): ?T` | Returns the first of XHP object's children of the specified type, or `null` if it has no such children. -`getFirstChildOfTypex<T as XHPChild>(): T` | Same but throws if the XHP object has no children of the specified type. -`getLastChild(): ?XHPChild` | Analogous to `getFirstChild`. -`getLastChildx(): XHPChild` | Analogous to `getFirstChildx`. -`getLastChildOfType<T as XHPChild>(): ?T` | Analogous to `getFirstChildOfType`. -`getLastChildOfType<T as XHPChild>(): T` | Analogous to `getFirstChildOfTypex`. -`isAttributeSet(string $name): bool` | Returns whether the attribute with name `$name` is set. -`replaceChildren(XHPChild ...$children): this` | Replaces all the children of this XHP Object with the variable number of children passed to this method. -`setAttribute(string $name, mixed $val): this` | Sets the value of the XHP object's attribute named `$name`. This does no validation, attributes are only validated when retrieved using `getAttribute` or during rendering. -`setAttributes(KeyedTraversable<string, mixed> $attrs): this` | Replaces the XHP object's array of attributes with `$attrs`. - -```hack no-extract -use namespace Facebook\XHP\Core as x; -use type Facebook\XHP\HTML\{li, p, ul}; - -function build_list(vec<string> $names): x\node { - $list = <ul id="names" />; - foreach ($names as $name) { - $list->appendChild(<li>{$name}</li>); - } - return $list; -} - -<<__EntryPoint>> -async function xhp_object_methods_run(): Awaitable<void> { - $names = vec['Sara', 'Fred', 'Josh', 'Scott', 'Paul', 'David', 'Matthew']; - - foreach (build_list($names)->getChildren() as $child) { - $child as x\node; - echo 'Child: '.await $child->toStringAsync()."\n"; - } - - echo 'First child: '. - await (build_list($names)->getFirstChild() as x\node->toStringAsync())."\n"; - - echo 'Last child: '. - await (build_list($names)->getLastChild() as x\node->toStringAsync())."\n"; - - foreach (build_list($names)->getAttributes() as $name => $value) { - echo 'Attribute '.$name.' = '.$value as string."\n"; - } - - echo 'ID: '.build_list($names)->getAttribute('id') as string."\n"; -} -``` diff --git a/guides/hack/21-XHP/16-extending.md b/guides/hack/21-XHP/16-extending.md deleted file mode 100644 index 89cfb0ce6..000000000 --- a/guides/hack/21-XHP/16-extending.md +++ /dev/null @@ -1,482 +0,0 @@ -XHP comes with classes for all standard HTML tags, but since these are first-class objects, you can create your own XHP classes for rendering -items that are not in the standard HTML specification. - -## Basics - -XHP class names must follow the same rules as any other Hack class names: -Letters, numbers and `_` are allowed and the name mustn't start with a number. - -**Historical note:** -<span data-nosnippet class="fbOnly fbIcon">(applies in FB WWW repository)</span> -Before XHP namespace support (in XHP-Lib v3), XHP class -names could also contain `:` (now a namespace separator) and `-` (now disallowed -completely). These were translated to `__` and `_` respectively at runtime (this -is called "name mangling"). For example, `<ui:big-table>` would instantiate a -global class named `xhp_ui__big_table`. - -A custom XHP class needs to do three things: -* use the keywords `xhp class` instead of `class` -* extend `x\element` (`\Facebook\XHP\Core\element`) or, rarely, another - [base class](/hack/XHP/interfaces) -* implement the method `renderAsync` to return an XHP object (`x\node`) or the - respective method of the chosen base class - -```basic.inc.hack -use namespace Facebook\XHP\Core as x; -use type Facebook\XHP\HTML\strong; - -final xhp class introduction extends x\element { - protected async function renderAsync(): Awaitable<x\node> { - return <strong>Hello!</strong>; - } -} - -final xhp class intro_plain_str extends x\primitive { - protected async function stringifyAsync(): Awaitable<string> { - return 'Hello!'; - } -} -``` -```basic.hack -<<__EntryPoint>> -async function extending_examples_basic_run(): Awaitable<void> { - $xhp = <introduction />; - echo await $xhp->toStringAsync()."\n"; - - $xhp = <intro_plain_str />; - echo await $xhp->toStringAsync()."\n"; -} -``` - -**Historical note:** -<span data-nosnippet class="fbOnly fbIcon">(applies in FB WWW repository)</span> -Before XHP namespace support (in XHP-Lib v3), use -`class :intro_plain_str` instead of `xhp class intro_plain_str` (no `xhp` -keyword, but requires a `:` prefix in the class name). - -## Attributes - -### Syntax - -Your custom class may have attributes in a similar form to XML attributes, using the `attribute` keyword: - -``` -attribute <type> <name> [= default value|@required]; -``` - -Additionally, multiple declarations can be combined: - -``` -attribute - int foo, - string bar @required; -``` - -### Types - -XHP attributes support the following types: -* `bool`, `int`, `float`, `string`, `array`, `mixed` (with **no coercion**; an `int` is not coerced into `float`, for example. You will get -an `XHPInvalidAttributeException` if you try this). -* Hack enums -* XHP-specific enums inline with the attribute in the form of `enum {item, item...}`. All values must be scalar, so they can be converted to -strings. These enums are *not* Hack enums. -* Classes or interfaces -* Generic types, with type arguments - -The typechecker will raise errors if attributes are incorrect when instantiating an element (e.g., `<a href={true} />`; because XHP allows -attributes to be set in other ways (e.g., `setAttribute`), not all problems can be caught by the typechecker, and an `XHPInvalidAttributeException` -will be thrown at runtime instead in those cases. - -The `->:` operator can be used to retrieve the value of an attribute. - -### Required Attributes - -You can specify an attribute as required with the `@required` declaration after the attribute name. If you try to render the XHP object and -have not set the required attribute, then an `XHPAttributeRequiredException` will be thrown. - -```required-attributes.inc.hack -use namespace Facebook\XHP\Core as x; - -final xhp class user_info extends x\element { - attribute int userid @required; - attribute string name = ""; - - protected async function renderAsync(): Awaitable<x\node> { - return - <x:frag>User with id {$this->:userid} has name {$this->:name}</x:frag>; - } -} -``` -```required-attributes.hack -use namespace Facebook\XHP; - -<<__EntryPoint>> -async function extending_examples_attributes_run(): Awaitable<void> { - /* HH_FIXME[4314] Missing required attribute is also a typechecker error. */ - $uinfo = <user_info />; - // Can't render :user-info for an echo without setting the required userid - // attribute - try { - echo await $uinfo->toStringAsync(); - } catch (XHP\AttributeRequiredException $ex) { - \var_dump($ex->getMessage()); - } - - /* HH_FIXME[4314] This is a typechecker error but not a runtime error. */ - $uinfo = <user_info />; - $uinfo->setAttribute('userid', 1000); - $uinfo->setAttribute('name', 'Joel'); - echo await $uinfo->toStringAsync(); -} -``` - -### Nullable Attributes - -For historical reasons, nullable types are inferred instead of explicitly stated. An attribute is nullable if it is not `@required` and -does not have a default value. For example: - -``` -attribute - string iAmNotNullable @required, - string iAmNotNullableEither = "foo", - string butIAmNullable; -``` - -### Inheritance - -An XHP class can inherit all attributes of another XHP class using the -following syntax: - -``` -// inherit all attributes from the <div> HTML element -attribute :Facebook:XHP:HTML:div; -``` - -This is most useful for XHP elements that wrap another XHP element, usually to -extend its functionality. In such cases, it should be combined with *attribute transfer*. - -### Attribute Transfer - -Let's say you have a class that wants to inherit attributes from `<div>`. You could do something like this: - -```bad-attribute-transfer.inc.hack -use namespace Facebook\XHP\Core as x; -use type Facebook\XHP\HTML\div; - -final xhp class ui_my_box extends x\element { - attribute :Facebook:XHP:HTML:div; // inherit attributes from <div> - - protected async function renderAsync(): Awaitable<x\node> { - // returning this will ignore any attribute set on this custom object - // They are not transferred automatically when returning the <div> - return <div class="my-box">{$this->getChildren()}</div>; - } -} -``` -```bad-attribute-transfer.hack -<<__EntryPoint>> -async function extending_examples_bad_attribute_transfer_run( -): Awaitable<void> { - $my_box = <ui_my_box title="My box" />; - // This will only bring <div class="my-box"></div> ... title= will be - // ignored. - echo await $my_box->toStringAsync(); -} -``` - -`attribute :Facebook:XHP:HTML:div` causes your class to inherit all `<div>` attributes, -however, any attribute set on `<ui_my_good_box>` will be lost because the `<div>` returned from `render` will not automatically -get those attributes. - -This can be addressed by using the `...` operator. - -```attribute-transfer.inc.hack -use namespace Facebook\XHP\Core as x; -use type Facebook\XHP\HTML\{div, XHPAttributeClobbering_DEPRECATED}; - -final xhp class ui_my_good_box extends x\element { - attribute :Facebook:XHP:HTML:div; // inherit attributes from <div> - attribute int extra_attr; - - protected async function renderAsync(): Awaitable<x\node> { - // returning this will transfer any attribute set on this custom object - return <div id="id1" {...$this} class="class1">{$this->getChildren()}</div>; - } -} -``` -```attribute-transfer.hack -<<__EntryPoint>> -async function extending_examples_good_attribute_transfer_run( -): Awaitable<void> { - $my_box = - <ui_my_good_box - id="id2" - class="class2" - extra_attr={42} - />; - echo await $my_box->toStringAsync(); -} -``` - -Now, when `<ui_my_good_box>` is rendered, each `<div>` attribute will be transferred over. - -Observe that `extra_attr`, which doesn't exist on `<div>`, is not transferred. -Also note that the position of `{...$this}` matters—it overrides any -duplicate attributes specified earlier, but attributes specified later override -it. - -## Children - -You can declare the types that your custom class is allowed to have as children -by using the `Facebook\XHP\ChildValidation\Validation` trait and implementing the -`getChildrenDeclaration()` method. - -**Historical note:** -<span data-nosnippet class="fbOnly fbIcon">(applies in FB WWW repository)</span> -Before XHP namespace support (in XHP-Lib v3), a special -`children` keyword with a regex-like syntax could be used instead -([examples](https://github.com/hhvm/xhp-lib/blob/v3.x/tests/ChildRuleTest.php)). -However, XHP-Lib v3 also supports `Facebook\XHP\ChildValidation\Validation`, and -it is therefore recommended to use it everywhere. - -If you don't use the child validation trait, then your class can have any -children. However, child validation still applies to any XHP objects returned -by your `renderAsync()` method that use the trait. - -If an element is rendered (`toStringAsync()` is called) with children that don't -satisfy the rules in its `getChildrenDeclaration()`, an `InvalidChildrenException` -is thrown. Note that child validation only happens during rendering, no -exception is thrown before that, e.g. when the invalid child is added. - -```children.inc.hack -// Conventionally aliased to XHPChild, which makes the children declarations -// easier to read (more fluid). -use namespace Facebook\XHP\{ChildValidation as XHPChild, Core as x}; -use type Facebook\XHP\HTML\{body, head, html, li, ul}; - -xhp class my_br extends x\primitive { - use XHPChild\Validation; - - protected static function getChildrenDeclaration(): XHPChild\Constraint { - return XHPChild\empty(); - } - - protected async function stringifyAsync(): Awaitable<string> { - return "\n"; - } -} - -xhp class my_ul extends x\element { - use XHPChild\Validation; - - protected static function getChildrenDeclaration(): XHPChild\Constraint { - return XHPChild\at_least_one_of(XHPChild\of_type<li>()); - } - - protected async function renderAsync(): Awaitable<x\node> { - return <ul>{$this->getChildren()}</ul>; - } -} - -xhp class my_html extends x\element { - use XHPChild\Validation; - - protected static function getChildrenDeclaration(): XHPChild\Constraint { - return XHPChild\sequence( - XHPChild\of_type<head>(), - XHPChild\of_type<body>(), - ); - } - - protected async function renderAsync(): Awaitable<x\node> { - return <html>{$this->getChildren()}</html>; - } -} -``` -```children.hack -use namespace Facebook\XHP; -use type Facebook\XHP\HTML\{body, head, li, ul}; - -<<__EntryPoint>> -async function extending_examples_children_run(): Awaitable<void> { - $my_br = <my_br />; - // Even though my-br does not take any children, you can still call the - // appendChild method with no consequences. The consequence will come when - // you try to render the object by something like an echo. - $my_br->appendChild(<ul />); - try { - echo await $my_br->toStringAsync()."\n"; - } catch (XHP\InvalidChildrenException $ex) { - \var_dump($ex->getMessage()); - } - $my_ul = <my_ul />; - $my_ul->appendChild(<li />); - $my_ul->appendChild(<li />); - echo await $my_ul->toStringAsync()."\n"; - $my_html = <my_html />; - $my_html->appendChild(<head />); - $my_html->appendChild(<body />); - echo await $my_html->toStringAsync()."\n"; -} -``` - -### Interfaces (categories) - -XHP classes are encouraged to implement one or more interfaces (usually empty), -conventionally called "categories". Some common ones taken from the HTML -specification are declared in the `Facebook\XHP\HTML\Category` namespace. - -Using such interfaces makes it possible to implement `getChildrenDeclaration()` -in other elements without having to manually list all possible child types, some -of which may not even exist yet. - -```categories.inc.hack -use namespace Facebook\XHP\{ - ChildValidation as XHPChild, - Core as x, - HTML\Category, -}; - -xhp class my_text extends x\element implements Category\Phrase { - use XHPChild\Validation; - - protected static function getChildrenDeclaration(): XHPChild\Constraint { - return XHPChild\any_of( - XHPChild\pcdata(), - XHPChild\of_type<Category\Phrase>(), - ); - } - - protected async function renderAsync(): Awaitable<x\node> { - return <x:frag>{$this->getChildrenOfType<Category\Phrase>()}</x:frag>; - } -} -``` -```categories.hack -use type Facebook\XHP\HTML\em; - -<<__EntryPoint>> -async function extending_examples_categories_run(): Awaitable<void> { - $my_text = <my_text />; - $my_text->appendChild(<em>"Hello!"</em>); // This is a Category\Phrase - echo await $my_text->toStringAsync(); - - $my_text = <my_text />; - $my_text->appendChild("Bye!"); // This is pcdata, not a phrase - // Won't print out "Bye!" because render is only returing Phrase children - echo await $my_text->toStringAsync(); -} -``` - -**Historical note:** -<span data-nosnippet class="fbOnly fbIcon">(applies in FB WWW repository)</span> -Before XHP namespace support (in XHP-Lib v3), a special -`category` keyword could be used instead of an interface -(`category %name1, %name2;`). - -## Async - -XHP and [async](../asynchronous-operations/introduction.md) co-exist well together. -As you may have noticed, all rendering methods (`renderAsync`, `stringifyAsync`) -are declared to return an `Awaitable` and can therefore be implemented as async -functions and use `await`. - -```xhp-async.inc.hack -use namespace Facebook\XHP\Core as x; - -final xhp class ui_get_status extends x\element { - - protected async function renderAsync(): Awaitable<x\node> { - $ch = \curl_init('https://metastatus.com/graph-api'); - \curl_setopt($ch, \CURLOPT_USERAGENT, 'hhvm/user-documentation example'); - $status = await \HH\Asio\curl_exec($ch); - return <x:frag>Status is: {$status}</x:frag>; - } -} -``` -```xhp-async.hack -<<__EntryPoint>> -async function extending_examples_async_run(): Awaitable<void> { - $status = <ui_get_status />; - $html = await $status->toStringAsync(); - // This can be long, so just show a bit for illustrative purposes - $sub_status = \substr($html, 0, 100); - \var_dump($sub_status); -} -``` - -**Historical note:** -<span data-nosnippet class="fbOnly fbIcon">(applies in FB WWW repository)</span> -In XHP-Lib v3, most rendering methods are not async, and -therefore a special `\XHPAsync` trait must be used in XHP classes that need to -`await` something during rendering. - -## HTML Helpers - -The `Facebook\XHP\HTML\XHPHTMLHelpers` trait implements two behaviors: -* Giving each object a unique `id` attribute. -* Managing the `class` attribute. - -**Historical note:** -<span data-nosnippet class="fbOnly fbIcon">(applies in FB WWW repository)</span> -In XHP-Lib v3, this trait is called `\XHPHelpers`. - -### Unique IDs - -`XHPHTMLHelpers` has a method `getID` that you can call to give your rendered custom XHP object a unique ID that can be referred to in other -parts of your code or UI framework (e.g., CSS). - -```get-id.inc.hack -use namespace Facebook\XHP\Core as x; -use type Facebook\XHP\HTML\{span, XHPHTMLHelpers}; - -xhp class my_id extends x\element { - attribute string id; - use XHPHTMLHelpers; - protected async function renderAsync(): Awaitable<x\node> { - return <span id={$this->getID()}>This has a random id</span>; - } -} -``` -```get-id.hack -<<__EntryPoint>> -async function extending_examples_get_id_run(): Awaitable<void> { - // This will print something like: - // <span id="8b95a23bc0">This has a random id</span> - $xhp = <my_id />; - echo await $xhp->toStringAsync(); -} -```.hhvm.expectf -<span id="%s">This has a random id</span> -``` - -### Class Attribute Management - -`XHPHTMLHelpers` has two methods to add a class name to the `class` attribute of -an XHP object. `addClass` takes a `string` and appends that `string` to the -`class` attribute (space-separated); `conditionClass` takes a `bool` and a `string`, and only -appends that `string` to the `class` attribute if the `bool` is `true`. - -This is best illustrated with a standard HTML element, all of which have a -`class` attribute and use the `XHPHTMLHelpers` trait, but it works with any -XHP class, as long as it uses the trait and declares the `class` attribute -directly or through inheritance. - -```add-class.hack -use type Facebook\XHP\HTML\h1; - -function get_header(string $section_name): h1 { - return (<h1 class="initial-cls">{$section_name}</h1>) - ->addClass('added-cls') - ->conditionClass($section_name === 'Home', 'home-cls'); -} - -<<__EntryPoint>> -async function run(): Awaitable<void> { - $xhp = get_header('Home'); - echo await $xhp->toStringAsync()."\n"; - - $xhp = get_header('Contact'); - echo await $xhp->toStringAsync()."\n"; -} -``` diff --git a/guides/hack/21-XHP/19-migration.md b/guides/hack/21-XHP/19-migration.md deleted file mode 100644 index fad3a8453..000000000 --- a/guides/hack/21-XHP/19-migration.md +++ /dev/null @@ -1,52 +0,0 @@ -You can incrementally port code to use XHP. - -Assume your output is currently handled by the following function, which might -be called from many places. - -```hack no-extract -function render_component(string $text, Uri $uri): string { - $uri = htmlspecialchars($uri->toString()); - $text = htmlspecialchars($text); - return "<a href=\"$uri\">$text</a>"; -} -``` - -## Convert Leaf Functions - -You can start by simply using XHP in `render_component`: - -```hack no-extract -async function render_component(string $text, Uri $uri): Awaitable<string> { - $link = <a href={$uri->toString()}>{$text}</a>; - return await $link->toStringAsync(); - // or HH\Asio\join if converting all callers to async is hard -} -``` - -You are converting `render_component` into a safer function without the need for explicit escaping, etc. But you are still passing -strings around in the end. - -## Use a Class - -You could make `render_component` into a class: - -```hack no-extract -namespace ui; - -class link extends x\element { - attribute Uri uri @required; - attribute string text @required; - protected async function renderAsync(): Awaitable<x\node> { - return - <a href={$this->:uri->toString()}>{$this->:text}</a>; - } -} -``` - -Keep a legacy `render_component` around while you are converting the old code that uses `render_component` to use the class. - -```hack no-extract -async function render_component(string $text, Uri $uri): Awaitable<string> { - return await (<ui:link uri={$uri} text={$text} />)->toStringAsync(); -} -``` diff --git a/guides/hack/21-XHP/22-guidelines.md b/guides/hack/21-XHP/22-guidelines.md deleted file mode 100644 index db79cf717..000000000 --- a/guides/hack/21-XHP/22-guidelines.md +++ /dev/null @@ -1,99 +0,0 @@ -Here are some general guidelines to know and follow when using XHP. In addition to its [basic usage](basic-usage.md), -[available methods](methods.md) and [extending XHP with your own objects](extending.md), these are other tips to make the best use of XHP. - -## Validation of Attributes and Children - -The constraints of XHP object children and attributes are done at various times: -* Children constraints are validated at render-time (when `toStringAsync` is called). -* Attributes provided directly (`<your_class attr="value">`) are validated by - the typechecker. -* Attribute names set by `setAttribute` are only validated at render-time. - -## Use Contexts to Access Higher Level Information - -If you have a parent object, and you want to give information to some object further down the UI tree (e.g., `<ul>` to `<li>`), you -can set a context for those lower objects and the lower objects can retrieve them. You use `setContext` and `getContext` - -```context.inc.hack -use namespace Facebook\XHP\{ChildValidation as XHPChild, Core as x}; -use type Facebook\XHP\HTML\{dd, dl, dt}; - -final xhp class ui_myparent extends x\element { - use XHPChild\Validation; - attribute string text @required; - - protected static function getChildrenDeclaration(): XHPChild\Constraint { - return XHPChild\of_type<ui_mychild>(); - } - - protected async function renderAsync(): Awaitable<x\node> { - return ( - <dl> - <dt>Text</dt> - <dd>{$this->:text}</dd> - <dt>Child</dt> - <dd>{$this->getChildren()}</dd> - </dl> - ); - } -} - -final xhp class ui_mychild extends x\element { - attribute string text @required; - - protected async function renderAsync(): Awaitable<x\node> { - if ($this->getContext('hint') === 'Yes') { - return <x:frag>{$this->:text.'...and more'}</x:frag>; - } - return <x:frag>{$this->:text}</x:frag>; - } -} - -async function guidelines_examples_context_run(string $s): Awaitable<void> { - $xhp = ( - <ui_myparent text={$s}> - <ui_mychild text="Go" /> - </ui_myparent> - ); - $xhp->setContext('hint', $s); - echo await $xhp->toStringAsync(); -} -``` -```context.hack -<<__EntryPoint>> -async function startHere(): Awaitable<void> { - await guidelines_examples_context_run('No'); - echo "\n\n"; - await guidelines_examples_context_run('Yes'); -} -``` - -Context is only passed down the tree at render time; this allows you to construct a tree without having to thread through data. In -general, you should only call `getContext` in the `render` method of the child. - -Common uses include: - - current user ID - - current theme in multi-theme sites - - current browser/device type - -## Don't Add Public Methods to Your XHP Components - -XHP objects should only be interacted with by their attributes, contexts, position in the tree, and rendering them. At Facebook, -we haven't yet come across any situations where public methods are a better solution than these interfaces. - -## Use Inheritance Minimally - -If you need an XHP object to act like another, but slightly modified, use -composition (the would-be subclass can instead return an instance of the -original XHP class from its `renderAsync` method). - -## Remember No Dollar Signs - -Attribute declarations look like Hack property declarations: - -```Hack no-extract -public string $prop; -attribute string attr; -``` - -A key difference is that there is no `$` in front of the attribute name. diff --git a/guides/hack/21-XHP/25-further-resources.md b/guides/hack/21-XHP/25-further-resources.md deleted file mode 100644 index d782b5535..000000000 --- a/guides/hack/21-XHP/25-further-resources.md +++ /dev/null @@ -1,3 +0,0 @@ -Besides our documentation, there are some other very useful resources to enhance your experience with XHP. -* [XHP Library](https://github.com/facebook/xhp-lib): The class libraries for XHP. -* [XHP Announcement](https://www.facebook.com/notes/facebook-engineering/xhp-a-new-way-to-write-php/294003943919): The original XHP announcement from 2010. diff --git a/guides/hack/21-XHP/XHP-category.txt b/guides/hack/21-XHP/XHP-category.txt deleted file mode 100644 index 263beb086..000000000 --- a/guides/hack/21-XHP/XHP-category.txt +++ /dev/null @@ -1 +0,0 @@ -Getting Started diff --git a/guides/hack/21-XHP/XHP-summary.txt b/guides/hack/21-XHP/XHP-summary.txt deleted file mode 100644 index f64a0d616..000000000 --- a/guides/hack/21-XHP/XHP-summary.txt +++ /dev/null @@ -1 +0,0 @@ -Safe, composable HTML templating. diff --git a/guides/hack/30-silencing-errors/01-introduction.md b/guides/hack/30-silencing-errors/01-introduction.md deleted file mode 100644 index 5739a1e72..000000000 --- a/guides/hack/30-silencing-errors/01-introduction.md +++ /dev/null @@ -1,221 +0,0 @@ -Errors reported by the Hack typechecker can be silenced with -`HH_FIXME` and `HH_IGNORE_ERROR` comments. Errors arising from type mismatches -on expressions may also be silenced using the `HH\FIXME\UNSAFE_CAST` function. - -## Silencing Errors with `HH\FIXME\UNSAFE_CAST` - -```no-extract -takes_int(HH\FIXME\UNSAFE_CAST<string,int>("foo", "Your explanation here")); -``` - -To silence an error arising from a type mismatch on a particular expression, -add a call to `HH\FIXME\UNSAFE_CAST` with the expression as the first argument, -an optional (string literal) comment, and explicit type hints indicating the -actual type of the expression and the expected type. - -The `UNSAFE_CAST` function **has no runtime effect**. However, in contrast -to `HH_FIXME` comments, the `UNSAFE_CAST` function _does_ change the type of the -expression. - -### Silencing Errors per Expression - -Whilst a single `HH_FIXME` comment will silence all related errors on the -proceeding line, the `UNSAFE_CAST` function must be applied to each -sub-expression that has a type mismatch. - -```Hack file:takes_int.hack -function takes_int(int $i): int { - return $i + 1; -} - -function takes_float_with_fixme(float $i): float { - /* HH_FIXME[4110] calls takes_int with wrong - param type AND returns wrong type */ - return takes_int($i); -} -``` - -```Hack file:takes_int.hack -function takes_float_with_unsafe_cast(float $i): float { - return HH\FIXME\UNSAFE_CAST<int, float>( - takes_int(HH\FIXME\UNSAFE_CAST<float, int>($i, 'wrong param type')), - 'returns wrong type', - ); -} -``` - -## Silencing Errors with Comments - -```Hack file:takes_int.hack -/* HH_FIXME[4110] Your explanation here. */ -takes_int("foo"); -``` - -To silence an error, place a comment on the immediately previous -line. The comment must use the `/*` syntax. - -This syntax only affects error reporting. It does not change types, -so the typechecker will keep checking the rest of the file as before. - -This syntax also **has no runtime effect**. The runtime will do its -best with badly typed code, but it may produce an error immediately, -produce an error later in the program, or coerce values to an unwanted -type. - -The behavior of badly typed code may change between HHVM -releases. This will usually be noted in the changelog. - -### `HH_FIXME` versus `HH_IGNORE_ERROR` - -Both `HH_FIXME` and `HH_IGNORE_ERROR` have the same effect: they -suppress an error. - -```Hack file:takes_int.hack -/* HH_FIXME[4110] An example fixme. */ -takes_int("foo"); - -/* HH_IGNORE_ERROR[4110] This is equivalent to the HH_FIXME above. */ -takes_int("foo"); -``` - -You should generally use `HH_FIXME`. `HH_IGNORE_ERROR` is intended to -signal to the reader that the type checker is wrong and you are -deliberately suppressing the error. This should be very rare. - -### Error Codes - -Every Hack error has an associated error code. These are stable across -Hack releases, and new errors always have new error codes. - -Hack will ignore error suppression comments that have no effect, to -help migration to newer Hack versions. - -Error codes 1000 - 1999 are used for parsing errors. Whilst it is -possible to silence these, the runtime usually cannot run this code at -all. - -Error codes 2000 - 3999 are used for naming errors. This includes -references to nonexistent names, as well as well-formedness checks -that don't require type information. - -Error codes 4000 - 4999 are used for typing errors. - -### Configuring Error Suppression - -Hack error suppression can be configured in the `.hhconfig` file at the root of a project. -In hhvm version [4.62](https://hhvm.com/blog/2020/06/16/hhvm-4.62.html) and above, error suppression works on a whitelist system. -Older hhvm versions used a blacklisting system instead. - -### How to whitelist suppression comments in hhvm 4.62 and above - -By default Hack will not accept a suppression comment, if that specific error code is not mentioned in the `.hhconfig` file. -Attempting to suppress an unmentioned error will result in an extra error like this: - -``` -Typing[4110] You cannot use HH_FIXME or HH_IGNORE_ERROR comments to suppress error 4110 -``` - -If the file in which this error resides is in **partial** mode, add `4110` to the `allowed_fixme_codes_partial` key in your `.hhconfig`. -If the file in which this error resides is in **strict** mode, add `4110` to the `allowed_fixme_codes_strict` key in your `.hhconfig`. - -As described further in Best Practices, suppressing errors on declarations is generally a bad idea. However, some errors can only be suppressed at a declaration. When suppressing an error at a declaration, you'll get an error like this. - -``` -Typing[4047] You cannot use HH_FIXME or HH_IGNORE_ERROR comments to suppress error 4047 in declarations -``` - -In such cases, you'll have to add `4047` to the `allowed_decl_fixme_codes` key, as well as to the `allowed_fixme_codes_xxx` key. - -An important note when using an external package. If a package uses a suppression comment and mentions this in its `.hhconfig`, this will not automatically update the `.hhconfig` settings for your project. In order to use this package, you'll need to add these codes to your own `.hhconfig`. - -### Historic note for hhvm 4.61 and below - -*If you are writing code on hhvm 4.62 or above, you may skip this section.* - -Once you have removed all the occurrences of a specific error code, -you can ensure that no new errors are added. - -You can use the `ignored_fixme_codes` option in `.hhconfig` to forbid -suppression of a specific error code. - -``` -ignored_fixme_codes = 1002, 4110 -``` - -This forbids `/* HH_FIXME[4110] ... */`. - -`.hhconfig` also supports `disallowed_decl_fixmes`, which forbids -error suppression of specific error codes on declarations (types, -class properties etc). - -``` -disallowed_decl_fixmes = 1002, 4110 -``` - -This forbids `/* HH_FIXME[4110] ... */` outside of function and method -bodies. - -Partial mode files have fewer checks. You can opt-in to specific -strict mode checks in partial files by using the error code in -`error_codes_treated_strictly` in `.hhconfig`. - -``` -error_codes_treated_strictly = 1002, 2045, 2055, 2060, 4005 -``` - -## Best Practices - -Great Hack code has no error suppressing comments, and only uses -strict mode. - -Suppressing errors in one place can lead to runtime errors in other -places. - -``` -function takes_int(int $_): void {} - -function return_ints_lie(): vec<int> { - /* HH_FIXME[4110] The type error is here. */ - return vec["foo"]; -} - -<<__EntryPoint>> -function oh_no(): void { - $items = return_ints_lie(); - takes_int($items[0]); // But the exception is here! -} -``` - -Good Hack code has no error suppression comments on its -declarations. Suppressing errors in declarations can hide a large -number of issues elsewhere. - -``` -function takes_int(int $_): void {} -function takes_float(float $_): void {} - -/* HH_FIXME[4030] Missing a return type. */ -function returns_something() { - return ""; -} - -function oh_no(): void { - // This is wrong. - takes_int(returns_something()); - // This is wrong too! - takes_float(returns_something()); -} -``` - -When you use error suppression, make sure you specify a reason. Try to -keep your comments to small expressions, because the comment applies -to the entire next line. - -``` -/* HH_FIXME[4110] Bad: this can apply to both function calls! */ -$result = foo(bar("stuff")); - -/* HH_FIXME[4110] Better: we will spot errors when calling bar. */ -$x = foo("stuff"); -$result = bar($x); -``` diff --git a/guides/hack/30-silencing-errors/05-error-codes.md b/guides/hack/30-silencing-errors/05-error-codes.md deleted file mode 100644 index f4af7c7b0..000000000 --- a/guides/hack/30-silencing-errors/05-error-codes.md +++ /dev/null @@ -1,425 +0,0 @@ -This page lists the most common error codes, and suggests how to fix -them. You can see the full list of error codes in -[error_map.ml](https://github.com/facebook/hhvm/blob/master/hphp/hack/src/errors/error_codes.ml). - -## 1002: Top-level code - -```Hack no-extract -function foo(): void {} - -/* HH_FIXME[1002] Top-level code isn't checked. */ -echo "hello world\n"; -``` - -**Why it's bad:** Top-level code is not type checked. - -**Suggestions:** Put your code in a function and use the `__EntryPoint` -attribute. - -## 2049: Unbound name - -```Hack -function foo(): void { - /* HH_FIXME[4107] No such function (type checking). */ - /* HH_FIXME[2049] No such function (global name check). */ - nonexistent_function(); -} -``` - -**Why it's bad:** This is usually a sign that a name is incorrect. - -It may be useful for calling parts of the PHP standard library that -the global name check is not aware of. - -**Suggestions:** Check your spelling. Use safe Hack APIs rather than -legacy PHP APIs. - -## 2050: Undefined Variable - -```Hack -function foo(): mixed { - /* HH_FIXME[2050] This variable doesn't exist. */ - return $no_such_var; -} -``` - -**Why it's bad:** This is usually a sign that a variable name is incorrect. - -It may be useful for accessing PHP constants (such as `$GLOBALS` or `$_GET`) -which the typechecker is unaware of. - -**Suggestions:** Check your spelling. Use safe Hack APIs rather than -legacy PHP APIs. - -## 4006: Array append on an inappropriate type - -```Hack -function foo(mixed $m): void { - /* HH_FIXME[4006] $m may not be an array. */ - $m[] = 1; -} -``` - -**Why it's bad:** Appending to other types (e.g. `int`) is undefined and -may throw an exception or convert the value to an array. - -**Suggestions:** If the type isn't specific enough, use `as` (e.g. `as -vec<_>`) to perform a runtime type check. - -## 4032: Missing return type - -```Hack -/* HH_FIXME[4030] Missing a return type declaration. */ -function foo() { - return 1; -} -``` - -**Why it's bad:** When the typechecker does not know the return type, it -cannot check operations on the value returned. - -**Suggestions:** Add a return type to your function. If you're unsure of -the type, consider using `__Soft`. You may also want to consider a -`mixed` or `dynamic` return type. - -## 4045: Array without type parameter - -```Hack no-extract -function foo(array $_): void {} -``` - -**Why it's bad:** The typechecker knows very little about how the array is -structured. - -**Suggestions:** Use `darray`, `varray` or `varray_or_darray` instead. If -you still want to use `array`, specify the type e.g. `array<mixed>`. - -## 4051: Accessing a shape with an invalid field name - -```Hack -function foo(shape(...) $s): void { - /* HH_FIXME[4051] Invalid shape field name. */ - $value = $s[1.0]; -} -``` - -**Why it's bad:** The runtime may coerce values and access other fields of -your shape. The typechecker also does not know what type `$value` has. - -**Suggestions:** Use a valid shape key: a string (recommended), an -integer, or a class constant. - -## 4053: Member not found - -```Hack -class MyClass {} - -function takes_myclass(MyClass $c): void { - /* HH_FIXME[4053] No such method. */ - $c->someMethod(); - /* HH_FIXME[4053] No such property. */ - $x = $c->someProperty; -} -``` - -**Why it's bad:** Accessing a non-existent method will cause a runtime -error. Accessing a non-existent property will log a notice and return null. - -**Suggestions:** Ensure that the object you're accessing actually has the -type you're expecting. - -## 4057: Missing shape field - -```Hack -function foo(): shape('x' => int) { - /* HH_FIXME[4057] Missing the field `x`. */ - return shape(); -} -``` - -**Why it's bad:** Returning a shape that's missing fields will cause -errors when code tries to access those fields later. Note that shape -fields are not enforced when calling or returning from functions. - -**Suggestions:** Change your shape type to use optional fields. - -## 4063: Nullable container access - -```Hack -function foo(?vec<int> $items): void { - /* HH_FIXME[4063] $items can be null. */ - $x = $items[0]; -} -``` - -**Why it's bad:** indexing a `null` returns null, leading to -runtime type errors later. - -**Suggestions:** Check that the value is non-null with `nullthrows` or -assert with `$items as nonnull`. - -## 4064: Accessing members on a nullable object - -```Hack -class MyClass { - public int $x = 0; - public function foo(): void {} -} - -function foo(?MyClass $m): void { - /* HH_FIXME[4064] Accessing a property on a nullable object. */ - $value = $m->x; - - /* HH_FIXME[4064] Calling a method on a nullable object. */ - $m->foo(); -} -``` - -**Why it's bad:** Accessing a property or a method on `null` will throw an -exception. - -**Suggestions:** Check that the value is non-null with `nullthrows` or -assert with `$m as nonnull`. - -## 4101: Wrong number of type parameters - -```Hack -class MyBox<T> { - public ?T $x = null; -} - -/* HH_FIXME[4101] Missing a type parameter. */ -class TooFewArguments extends MyBox {} - -/* HH_FIXME[4101] Too many type parameters. */ -class TooManyArguments extends MyBox<mixed, mixed> {} -``` - -**Why it's bad:** If the typechecker doesn't have full information about a -class declaration, it cannot fully check code that uses the class. - -**Suggestions:** Add the necessary type parameters. You can usually use -`mixed` or `nothing` as the type parameter on base classes. - -Note that this is only required for declarations. Hack can infer type -parameters inside function and method bodies. - -## 4107: Unbound name (type checking) - -```Hack -function foo(): void { - /* HH_FIXME[4107] No such function (type checking). */ - /* HH_FIXME[2049] No such function (global name check). */ - nonexistent_function(); -} -``` - -**Why it's bad:** This is usually a sign that a name is incorrect. - -It may be useful for calling parts of the PHP standard library that -the type checker is not aware of. - -**Suggestions:** Check your spelling. Use safe Hack APIs rather than -legacy PHP APIs. - -## 4108: Undefined shape field - -```Hack -function foo(shape('x' => int) $s): void { - /* HH_FIXME[4108] No such field in this shape. */ - $value = $s['not_x']; -} -``` - -**Why it's bad:** Accessing an undefined field may throw an exception or -return an unexpected value (for open shapes). - -**Suggestions:** Ensure that your shape type declaration has the fields -you're using. - -## 4110: Bad type in expression - -```Hack -function takes_int(int $_): void {} - -function foo(): void { - /* HH_FIXME[4110] Passing incorrect type to a function. */ - takes_int("hello"); -} -``` - -**Why it's bad:** Using the wrong type can result in runtime errors (for -enforced types), errors later (for unenforced types, such as erased -generics) or surprising coercions (e.g. for arithmetic). - -**Suggestions:** - -If the type is too broad (e.g. using `mixed`), use `as SpecificType` -to assert the specific runtime type. If you're not sure of the type, -consider using `<<__Soft>>` type hints on function signatures. - -If the type is coming from very dynamic code, consider using the -`dynamic` type. - -## 4166: Unknown field in shape (obsolete) - -This error code is obsolete. The typechecker now produces error 4110 -in these situations. - -``` -function test(shape('a' => string) $s): shape() { - /* HH_FIXME[4166] Extra fields in the shape. */ - return $s; -} -``` - -**Why it's bad:** Passing extra fields in a shape can lead to surprising -results when converting shapes to arrays. - -**Suggestions:** Use a field type declaration with optional fields instead. - -## 4128: Using deprecated code - -```Hack -function foo_new(): void {} - -<<__Deprecated("Use foo_new instead")>> -function foo_old(): void {} - -function bar(): void { - /* HH_FIXME[4128] Calling a deprecated function. */ - foo_old(); -} -``` - -**Why it's bad:** Using functions or classes that have been marked as -deprecated prevents cleanup of old APIs. - -**Suggestions:** [`__Deprecated`](/hack/attributes/predefined-attributes#__deprecated) takes a message which describes why -something is deprecated. Take a look at that message to learn the new -API. - -## 4165: Accessing optional shape field - -```Hack -function foo(shape(?'x' => int) $s): void { - /* HH_FIXME[4165] This field may not be present. */ - $value = $s['x']; -} -``` - -**Why it's bad:** This code will throw an exception if the shape doesn't -have this field. - -**Suggestions:** Use `Shapes::idx` instead, so you can explicitly handle -the missing field. - -## 4193: Illegal XHP child - -```Hack no-extract -use type Facebook\XHP\HTML\div; - -function foo(mixed $m): void { - /* HH_FIXME[4110] */ /* HH_FIXME[4193] $m may not be an XHPChild.*/ - $my_div = <div>{$m}</div>; -} -``` - -**Why it's bad:** XHP expects child elements to be instance of `XHPChild`. - -**Suggestions:** Use `as` to assert a narrower type, or convert values to -a valid XHP child, such as a string. - -## 4276: Truthiness check - -``` -$x = null; -if ($x) { - echo "not null"; -} - -$y = '0'; -if ($y) { - echo "truthy string"; -} -``` - -This error was [moved to a linter](https://github.com/hhvm/hhast), as it was making it harder to convert -partial mode files to strict. We still recommend avoiding this code style. - -**Why it's bad:** Truthiness rules can be surprising. `''` is falsy, but -so is `'0'`. - -**Suggestions:** Use `is null`, `Str\is_empty` or `=== 0` when checking -for empty values. - -## 4297: Type inference failed - -```Hack -class MyA { - public function doStuff(): void {} -} - -function foo(): void { - /* HH_FIXME[4297] Cannot infer the type of $x. */ - $f = $x ==> $x->doStuff(); - - $f(new MyA()); -} -``` - -**Why it's bad:** If the type checker cannot infer the type, it cannot -check usage of values with that type. - -This usually occurs with anonymous functions, but can also occur when -working with generic containers like `dict` or `vec`. - -**Suggestions:** For anonymous functions, add a type annotation. - -``` -$f = (MyA $x) ==> $x->doStuff(); -``` - -Alternatively, use a type assertion `($x as MyA)->doStuff()`. - -When type inference fails on generic containers, add a type annotation -on the declaration. - -``` -$d = dict<string, string>[]; -``` - -## 4323: Type constraint violation - -```Hack -/* HH_FIXME[4323] A dict must have arraykey, int or string keys. */ -function foo(dict<mixed, bool> $d): void {} -``` - -**Why it's bad:** if a type has constraints on how it can be used, and you -break those constraints, it may not work as expected. - -In this example, we define a `dict` with `mixed` keys. We can then -insert values that aren't `arraykey` types, leading to surprising -value conversions. - -**Suggestions:** Look carefully at the error message to see what types are -supported for the generic you're using. - -## 4324: Array access on a type that doesn't support indexing - -```Hack -function foo(int $m): void { - /* HH_FIXME[4324] Indexing a type that isn't indexable. */ - $value = $m['foo']; -} -``` - -**Why it's bad:** Indexing values that don't support values can produce -surprising behavior. The runtime will log a warning and return null, -leading to runtime type errors later. - -**Suggestions:** Refactor the code to use a Hack array or a -`KeyedContainer`. - -**Note:** In previous versions of HHVM, error `4324` was known as error `4005`. diff --git a/guides/hack/30-silencing-errors/silencing-errors-category.txt b/guides/hack/30-silencing-errors/silencing-errors-category.txt deleted file mode 100644 index 263beb086..000000000 --- a/guides/hack/30-silencing-errors/silencing-errors-category.txt +++ /dev/null @@ -1 +0,0 @@ -Getting Started diff --git a/guides/hack/30-silencing-errors/silencing-errors-summary.txt b/guides/hack/30-silencing-errors/silencing-errors-summary.txt deleted file mode 100644 index 2369980c3..000000000 --- a/guides/hack/30-silencing-errors/silencing-errors-summary.txt +++ /dev/null @@ -1 +0,0 @@ -HH_FIXME best practices and error codes. diff --git a/guides/hack/40-contributing/01-introduction.md b/guides/hack/40-contributing/01-introduction.md deleted file mode 100644 index 9dd039090..000000000 --- a/guides/hack/40-contributing/01-introduction.md +++ /dev/null @@ -1,94 +0,0 @@ -This website is itself written in Hack and running on HHVM. You can -see the current [HHVM version used on the deployed site](https://github.com/hhvm/user-documentation/blob/main/.deploy/built-site.Dockerfile#L3). - -## Prerequisites - -You'll need HHVM -(see [installation instructions](/hhvm/installation/introduction)) -installed on your local machine, and the version must have the same major -and minor (e.g. `4.123`) as the version specification in the `composer.json` -file. - -You'll also need a checkout of the source code for this site. - -``` -$ git clone git@github.com:hhvm/user-documentation.git -``` - -## Composer Dependencies - -We use Composer to manage our PHP library dependencies and to autoload classes. -Composer is written in PHP, so you need PHP installed. - -``` -# Ubuntu example, your environment may differ. -$ apt-get install php-cli -``` - -You can now follow the instructions on [the Composer website](https://getcomposer.org/) to install it. - -Once you've installed `composer.phar`, you can install the website dependencies into `vendor/` and create the autoload map. - -``` -$ cd user-documentation -user-documentation$ php /path/to/composer.phar install -``` - -### Updating Dependencies - -We require that this whole repository has no type errors. - -``` -$ hh_client -No errors! -``` - -If you are seeing errors in `vendor/`, re-run the composer install command to ensure that all dependencies are up to date. - -**NOTE**: If you add, delete or rename a class in the primary source tree `src/`, you should run `php composer.phar dump-autoload` in order to make the autoload maps refresh correctly; otherwise you will get class not found exceptions. - -## Running A Local Instance - -Generate `public/` by running the build script. This script will only -run the steps related to your changes, so the first run will be slower -than later runs. - -``` -$ hhvm bin/build.php -``` - -HHVM has a built-in webserver, so it can serve the entire website. - -``` -$ cd public -$ hhvm -m server -p 8080 -c ../hhvm.dev.ini -``` - -You can now see your local instance by visiting <http://localhost:8080>. - -When you make changes, you'll need to run `build.php` again. You can -leave HHVM serving the site, and it will pick up the changes -automatically. - -## Running An Old Instance - -If you want to see old versions of the docs, we provide [regular Docker -images of this site](https://ghcr.io/hhvm/user-documentation) (previously -on [Docker Hub](https://hub.docker.com/r/hhvm/user-documentation/tags)). -This is not suitable for development, but is useful if you're working with -an old HHVM/Hack version. - - - -1. Install [Docker](https://docs.docker.com/engine/installation/). -2. Start a container with: `docker run -p 8080:80 -d ghcr.io/hhvm/user-documentation`. -3. You can then access a local copy of the documentation at <http://localhost:8080>. - -## Running A Production Instance - -Running a production instance is very similar to a development -instance. - -Configure a webserver and HHVM to serve the `public/` -directory. Ensure that all requests that don't match a local file are -served by `index.php`. diff --git a/guides/hack/40-contributing/06-writing-content.md b/guides/hack/40-contributing/06-writing-content.md deleted file mode 100644 index 3f6d2ef42..000000000 --- a/guides/hack/40-contributing/06-writing-content.md +++ /dev/null @@ -1,82 +0,0 @@ -The website has three content sections: - -* [Hack - guides](https://github.com/hhvm/user-documentation/tree/main/guides/hack) - describe the Hack language -* [HHVM - guides](https://github.com/hhvm/user-documentation/tree/main/guides/hhvm) - describe how to install, configure and run the HHVM runtime -* The API reference is generated from the API definitions, and this - site [includes - examples](https://github.com/hhvm/user-documentation/tree/main/api-examples) - for each API - -## File Naming Conventions - -A guide is a folder with a numeric prefix: - -``` -$ ls guides/hack/ -01-getting-started/ -02-source-code-fundamentals/ -... -``` - -These numbers are used to control the ordering of guides on the -website, and are not shown in the UI. They do not need to be -sequential: there can be gaps. - -Within each folder, there are markdown files (written in [GitHub -flavored markdown](https://github.github.com/gfm/)), a `foo-category.txt` (used -for grouping on the home page) and a `foo-summary.txt` (shown as a subheading on -the home page). - -``` -$ ls guides/hack/01-getting-started/ -01-getting-started.md -02-tools.md -getting-started-category.txt -getting-started-summary.txt -``` - -Pages use the same numbering system to control their order within a -guide. - -## Writing Conventions - -Guides are written in a relatively informal tone, addressing the -reader as "you". Assume the reader has some programming knowledge but -no familiarity with Hack. - -Each page should have a clear purpose, starting with a short -description of the concept it's describing. Examples should always be -provided, preferably under 15 lines. - -We assume the reader has a relatively recent version of -HHVM. References to very old features will be removed, but we provide -[Docker images of historical site -versions](/hack/contributing/introduction#running-an-old-instance) if -needed. - -It's not necessary to document all the incorrect ways a feature can be -used. Content should focus on correct usage, and users can rely on the -Hack type checker to tell them when they've done something wrong. - -## Links - -Internal links should be absolute paths without a domain, -e.g. `/hack/contributing/introduction`. - -Image paths should be relative to `public`, -e.g. `/images/imagename.png`. - -When removing or renaming pages, set up a redirect from the old -URL. See [`Guides::getGuidePageRedirects`](https://github.com/hhvm/user-documentation/blob/9fd2aaeb60a236072ef99735a9114ec54d96da2c/src/Guides.php#L56). - -## Styling - -We use [Sass](https://sass-lang.com/) to style the website, and the -source files are in -[sass/](https://github.com/hhvm/user-documentation/tree/main/sass). - -The CSS files are generated by the build script. diff --git a/guides/hack/40-contributing/10-code-samples.md b/guides/hack/40-contributing/10-code-samples.md deleted file mode 100644 index 9210b1326..000000000 --- a/guides/hack/40-contributing/10-code-samples.md +++ /dev/null @@ -1,280 +0,0 @@ -All code samples are automatically type checked and executed, to ensure they're correct. - -## Basic Usage - -Code samples require triple backticks, and a file name. - -~~~ -```example.hack -<<__EntryPoint>> -function main(): void { - echo "Hello world!\n"; -} -``` -~~~ - -The build script will create a file of this name, type check it, run it, and include the output in the rendered HTML. - -## Boilerplate - -For small examples, the wrapper function can be distracting. You can use standalone statements and they will be automatically wrapped in an `<<__EntryPoint>>` function. - -We can simplify the previous example to this. - -~~~ -```example.hack -echo "Hello world!\n"; -``` -~~~ - -## Opting Out - -If you really need to write a code sample that isn't checked or executed, you can omit the file name. The code sample will be included in the docs without any checking. - -~~~ -``` -// This example is not run at all. -// It doesn't even need to be hack code! -``` -~~~ - -## Sharing Code - -By default, each extracted example file has its own namespace based on the file name. This allows multiple examples to define the same class or function. - -If you want to share code between examples, use a file name prefix followed by `.`. Namespaces are generated based on the first name component, so `foo.x.hack` and `foo.y.hack` will have the same namespace. - -~~~ -Here's an example class: -```example_class.definition.hack -class C {} -``` -And its usage: -```example_class.usage.hack -$c = new C(); -``` -~~~ - -Namespaces include the name of the page they're on, e.g. `Hack\UserDocumentation\Fundamentals\Namespaces\Examples\Main`, so you cannot share code between different pages. - -## Autoloading - -HHVM requires an "autoloader" to be explicitly initialized whenever any Hack -file references definitions from another Hack file. - -The build script will insert the necessary initialization code automatically -into any `<<__EntryPoint>>` function, so it is OK to rely on definitions from -other examples inside any `<<__EntryPoint>>` function or functions called by it, -**but not elsewhere**. - -For example, HHVM can never successfully run a file containing e.g. a class -definition that references a parent class or other definition from another file -(this is not a limitation specific to the docs site). - -~~~ -```example_hierarchy.parent.hack -abstract class Parent {} -``` - -```example_hierarchy.child.hack -// This file will NEVER successfully run in HHVM. -final class Child extends Parent {} -``` -~~~ - -In practice, this is fine because *running* a file containing a class definition -is generally not needed. However, it *does* mean that trying to add an -`<<__EntryPoint>>` function to `example_hierarchy.child.hack` won't work, -because HHVM will fail with an "Undefined class Parent" error before it even -reaches it. - -~~~ -```example_hierarchy.child.hack -// This file will NEVER successfully run in HHVM. -final class Child extends Parent {} - -<<__EntryPoint>> -function main(): void { - // This EntryPoint function is useless because HHVM will fail above. -} -``` -~~~ - -The workaround is to put any code that depends on definitions from more than one -other example into a separate code block. - -~~~ -```example_hierarchy.usage.hack -$c = new Child(); -``` -~~~ - -This can also be more convenient because we can rely on the automatic -boilerplate addition by the build script, instead of manually writing the -`<<__EntryPoint>>` function header. - -## Examples with Hack Errors - -Examples that are expected to fail typechecking should use the `.type-errors` -extension: - -~~~ -```error_example.hack.type-errors -function missing_return_type() {} -``` -~~~ - -The build script will run the Hack typechecker and include its output in the -rendered HTML (instead of HHVM runtime output). - -## Supporting Files - -An example code block may specify additional files to be extracted alongside the -example code using the following format: - -~~~ -```nondeterministic_example.hack -echo "Your lucky number is: ".\mt_rand(0, 99); -```.example.hhvm.out -Your lucky number is: 42 -```.expectf -Your lucky number is: %d -``` -~~~ - -Supported extensions are inherited from the -[HHVM test runner](https://github.com/facebook/hhvm/blob/master/hphp/test/README.md#file-layout): - -- `.hhconfig` if the example requires specific *typechecker* flags - (e.g. demonstrating a feature that is not yet enabled by default) -- `.ini` for *runtime* flags -- `.hhvm.expect` if you want to manually specify the expected output, instead of - the build script doing it automatically -- `.hhvm.expectf` to specify the expected output using printf-style syntax, like - in the example above -- `.expectregex` to specify the expected output using a regular expression -- `.example.hhvm.out` should contain one possible output (this will - be included in the rendered HTML instead of the `expectf`/`expectregex` file; - it is not needed for regular `expect` files) -- `.typechecker.expect`, `.typechecker.expectf`, `.typechecker.expectregex`, - `.example.typechecker.out` are the same but for typechecker (Hack) output - instead of runtime (HHVM) output; they should only be included if the example - code is expected to fail typechecking *and* you don't want the build script to - generate them automatically -- `.skipif` should contain valid Hack code that will print "skip" if the example - should not be run (e.g. a MySQL example that should not run if there isn't a - MySQL server running), otherwise print nothing - - -## Testing Changes - -We have a test suite to ensure consistency across the changes we make to the guides, API references, and examples. - -You can run it as follows: - -``` -$ vendor/bin/hacktest tests/ -``` - -## Running the Examples - -Nearly all of the code examples you see in the guides and API documentation are actual Hack or PHP source files that are embedded at site build time into the content itself. - -As opposed to embedded the code examples directly within the markdown itself, this provides the flexibility of actually having running examples within this repo. - -You must have HHVM installed in order to run these examples since most of them are written in Hack (e.g., `<?hh`), and HHVM is the only runtime to currently support Hack. - -You will find the examples in directories named with the pattern: - -``` -guides/[hhvm | hack]/##-topic/##-subtopic-examples -``` - -e.g., - -``` -$ guides/hack/23-collections/06-constructing-examples -``` - -### Standalone - -You can run any example standalone. For example: - -``` -# Assuming you are in the user-documentation repo directory -$ cd guides/hack/23-collections/10-examples-examples/ -$ hhvm lazy.php -``` - -And you will see output like: - -``` -object(HH\Vector)#4 (5) { - [0]=> - int(0) - [1]=> - int(2) - [2]=> - int(4) - [3]=> - int(6) - [4]=> - int(8) -} -Time non lazy: 0.10859489440918 -object(HH\Vector)#10 (5) { - [0]=> - int(0) - [1]=> - int(2) - [2]=> - int(4) - [3]=> - int(6) - [4]=> - int(8) -} -Time non lazy: 0.0096559524536133 -``` - -### Using the HHVM Test Runner - -Each example is structured to be run with the [HHVM test runner](https://github.com/facebook/hhvm/blob/master/hphp/test/README.md). We use the test runner internally to ensure that any changes made to HHVM do not cause a regression. The examples in the documentation here can be used for that purpose as well. - -You can run the HHVM test runner on the entire suite of examples, on one directory of examples or just one example itself. - -*Normally you will use our test suite described [above](#testing-changes) to test any changes you make (because it tests our examples as well). However, sometimes it is actually faster and more explicit to test one example directly with the HHVM test runner.* - -``` -# Assuming you are in the user-documentation repo root - -# This runs every example in the test runner. -# Won't normally need to do this; just use our test suite instead. - -# Test with the typechecker -$ api-sources/hhvm/hphp/test/run --hhserver-binary-path $(which hh_server) --typechecker guides/hack/05-statements/ -# Test with the runtime -$ api-sources/hhvm/hphp/test/run --hhvm-binary-path $(which hhvm) guides/hack/05-statements/ -``` - -Here is the output you should see when you run the test runner. Assume we are running the examples in the collections topic: - -``` -$ hhvm api-sources/hhvm/hphp/test/run guides/hack/23-collections/ -Running 32 tests in 32 threads (0 in serial) - -All tests passed. - | | | - )_) )_) )_) - )___))___))___)\ - )____)____)_____)\ - _____|____|____|____\\__ ----------\ SHIP IT /--------- - ^^^^^ ^^^^^^^^^^^^^^^^^^^^^ - ^^^^ ^^^^ ^^^ ^^ - ^^^^ ^^^ - -Total time for all executed tests as run: 11.57s -``` - -You can use `--verbose` to see all the tests that are running. diff --git a/guides/hack/40-contributing/12-information-macros.md b/guides/hack/40-contributing/12-information-macros.md deleted file mode 100644 index 1646b1b5f..000000000 --- a/guides/hack/40-contributing/12-information-macros.md +++ /dev/null @@ -1,44 +0,0 @@ -This website supports note, tip, caution, and danger macro messages. - -## Note Message -```yamlmeta -{ - "note": [ - "This change was introduced in [HHVM 4.136](https://hhvm.com/blog/2021/11/19/hhvm-4.136.html)." - ] -} -``` - -The `noreturn` type can be upcasted to `dynamic`. - -## Tip Message -```yamlmeta -{ - "tip": [ - "To start learning Hack, read our [Getting Started](/hack/getting-started/getting-started) documentation!" - ] -} -``` -Hack lets you write code quickly, while also having safety features built in, like static type checking. - -## Caution Message -```yamlmeta -{ - "caution": [ - "We do not recommend using experimental features until they are formally announced and integrated into the main documentation set." - ] -} -``` - -This website maintains documentation on Hack features that are in the *experimental* phase. - -## Warning Message -```yamlmeta -{ - "danger": [ - "Use this method with caution. **If your query contains *ANY* unescaped input, you are putting your database at risk.**" - ] -} -``` - -While inherently dangerous, you can use `AsyncMysqlConnection::query` to query a MySQL database client. diff --git a/guides/hack/40-contributing/15-generated-content.md b/guides/hack/40-contributing/15-generated-content.md deleted file mode 100644 index 28ca14f29..000000000 --- a/guides/hack/40-contributing/15-generated-content.md +++ /dev/null @@ -1,39 +0,0 @@ -## Generating Markdown - -Occasionally you may want to generate markdown programmatically. For -example, the [supported PHP INI settings -table](/hhvm/configuration/INI-settings#supported-php-ini-settings) is -autogenerated. - -1. Define a `BuildStep` for the data you want to generate the markdown - from. See - [PHPIniSupportInHHVMBuildStep](https://github.com/hhvm/user-documentation/blob/main/src/build/PHPIniSupportInHHVMBuildStep.php) - for an example. - -2. Define a `BuildStep` that writes markdown to the - guides-generated-markdown/ directory, [defined - here](https://github.com/hhvm/user-documentation/blob/9fd2aaeb60a236072ef99735a9114ec54d96da2c/src/build/BuildPaths.php#L49). See - [PHPIniSupportInHHVMMarkdownBuildStep](https://github.com/hhvm/user-documentation/blob/main/src/build/PHPIniSupportInHHVMMarkdownBuildStep.php) - for an example. - -3. Add a symlink - ([example](https://github.com/hhvm/user-documentation/blob/main/guides/hhvm/04-configuration/guides-generated-markdown)) - to the guide folder where you want to include this content. - -4. Use `@@` syntax to include the generated file on the relevant page - of your guide. - - ``` - @@ guides-generated-markdown/your_generated_file.md @@ - ``` - -5. Add a test ([example](https://github.com/hhvm/user-documentation/blob/9fd2aaeb60a236072ef99735a9114ec54d96da2c/tests/GuidePagesTest.php#L84)). - -## API Example Code - -Adding a `.md` file to the correct subdirectory in -[`api-examples`](https://github.com/hhvm/user-documentation/tree/main/api-examples) -will cause the build script to add its content to the respective API page. - -The `.md` file may contain any combination of explanatory text and any number of -code examples following the same rules as above. diff --git a/guides/hack/40-contributing/contributing-category.txt b/guides/hack/40-contributing/contributing-category.txt deleted file mode 100644 index 263beb086..000000000 --- a/guides/hack/40-contributing/contributing-category.txt +++ /dev/null @@ -1 +0,0 @@ -Getting Started diff --git a/guides/hack/40-contributing/contributing-summary.txt b/guides/hack/40-contributing/contributing-summary.txt deleted file mode 100644 index acbe1969a..000000000 --- a/guides/hack/40-contributing/contributing-summary.txt +++ /dev/null @@ -1 +0,0 @@ -How to contribute to this website. diff --git a/guides/hack/51-experimental-features/01-introduction.md b/guides/hack/51-experimental-features/01-introduction.md deleted file mode 100644 index b264290c4..000000000 --- a/guides/hack/51-experimental-features/01-introduction.md +++ /dev/null @@ -1,19 +0,0 @@ -The following pages of documentation describe Hack language features in the *experimental* phase. - -## About Experimental Features -We have documented these features as they may appear in built-ins, including the Hack Standard Library. - -We _do not_ recommend using any of these features until they are formally announced and integrated into the main documentation set. - -## Enabling an Experimental Feature -To use an experimental feature, add the `__EnableUnstableFeatures` file attribute to any files containing that feature. - -```Hack no-extract -<<file:__EnableUnstableFeatures('experimental_feature_name')>> -``` - -You can also specify multiple features: - -```Hack no-extract -<<file:__EnableUnstableFeatures('experimental_feature_name', 'other_experimental_feature_name')>> -``` diff --git a/guides/hack/51-experimental-features/experimental-features-category.txt b/guides/hack/51-experimental-features/experimental-features-category.txt deleted file mode 100644 index 185c57f01..000000000 --- a/guides/hack/51-experimental-features/experimental-features-category.txt +++ /dev/null @@ -1 +0,0 @@ -Experimental Additions diff --git a/guides/hack/51-experimental-features/experimental-features-summary.txt b/guides/hack/51-experimental-features/experimental-features-summary.txt deleted file mode 100644 index 5d592521c..000000000 --- a/guides/hack/51-experimental-features/experimental-features-summary.txt +++ /dev/null @@ -1 +0,0 @@ -Enable features in the experimental phase. diff --git a/guides/hack/55-expression-trees/01-introduction.md b/guides/hack/55-expression-trees/01-introduction.md deleted file mode 100644 index fb40fc18b..000000000 --- a/guides/hack/55-expression-trees/01-introduction.md +++ /dev/null @@ -1,51 +0,0 @@ -Expression trees are an experimental Hack feature that allow you write domain specific languages (DSLs) with Hack syntax. - -You can write expressions using normal Hack syntax, and all the normal Hack tools work: syntax highlighting, type checking, and code completion. - -Unlike normal Hack code, **expression tree code is not executed**. - -```hack no-extract -$e = MyDsl`foo() + 1`; -``` - -## What is executed at runtime? - -Hack converts an expression tree to a series of method calls on a visitor. - -```hack no-extract -// You write code like this: -$e = MyDsl`1 + 2`; - -// Hack runs the following "desugared" code: -$e = - MyDsl::makeTree<MyDslInt>( - ($v) ==> $v->visitBinop( - $v->visitInt(1), - '__plus' - $v->visitInt(2)) - ); -``` - -The visitor can also define the types associated with literals and operators. This enables Hack to typecheck the DSL expression, even if `1` doesn't represent a Hack `int`. - -```hack no-extract -// The type checker will also check that this "virtualized" expression is correct, -// even though this virtualized code isn't executed. -(MyDsl::intType())->__plus(MyDsl::intType()); -``` - -## Why? - -DSLs without expression trees are verbose and unchecked. - -```hack no-extract -// No checking or highlighting at all. -takes_dsl_string("foo()"); - -// Verbose, limited type checking, no support for loops or variables in the DSL. -takes_dsl_object(new DslFunctionCall("foo")); -``` - -## When is this useful? - -DSLs are useful when you're generating code for scripting languages, such as JavaScript in the browser or stored procedures in a database. diff --git a/guides/hack/55-expression-trees/05-syntax-supported.md b/guides/hack/55-expression-trees/05-syntax-supported.md deleted file mode 100644 index ba06650ee..000000000 --- a/guides/hack/55-expression-trees/05-syntax-supported.md +++ /dev/null @@ -1,164 +0,0 @@ -Expression tree DSLs can use most of the expression and statement syntax in Hack. - -For a full list of supported syntax, see also [expr_tree.php](https://github.com/facebook/hhvm/blob/master/hphp/hack/test/expr_tree.php). - -## Literals - -| Example | Visitor Runtime | Typing | -|---------|-------------------------------------|-----------------------| -| `true` | `$v->visitBool($position, true)` | `MyDsl::boolType()` | -| `1` | `$v->visitInt($position, 1)` | `MyDsl::intType()` | -| `1.23` | `$v->visitFloat($position, 1.23)` | `MyDsl::floatType()` | -| `"foo"` | `$v->visitString($position, "foo")` | `MyDsl::stringType()` | -| `null` | `$v->visitString($position)` | `MyDsl::nullType()` | -| N/A | N/A | `MyDsl::voidType()` | - -## Binary Operators - -Operator names are based on the appearance of the symbol, as different -DSLs may choose different semantics for an operator. - -| Example | Visitor Runtime | Typing | -|-------------|-------------------------------------------------------------------|-------------------------------------------| -| `$x + $y` | `$v->visitBinop($position, ..., '__plus', ...)` | `__plus` method on `$x` | -| `$x - $y` | `$v->visitBinop($position, ..., '__minus', ...)` | `__minus` method on `$x` | -| `$x * $y` | `$v->visitBinop($position, ..., '__star', ...)` | `__star` method on `$x` | -| `$x / $y` | `$v->visitBinop($position, ..., '__slash', ...)` | `__slash` method on `$x` | -| `$x % $y` | `$v->visitBinop($position, ..., '__percent', ...)` | `__percent` method on `$x` | -| `$x && $y` | `$v->visitBinop($position, ..., '__ampamp', ...)` | `__ampamp` method on `$x` | -| `$x \|\| $y` | `$v->visitBinop($position, ..., '__barbar', ...)` | `__barbar` method on `$x` | -| `$x < $y` | `$v->visitBinop($position, ..., '__lessThan', ...)` | `__lessThan` method on `$x` | -| `$x <= $y` | `$v->visitBinop($position, ..., '__lessThanEqual', ...)` | `__lessThanEqual` method on `$x` | -| `$x > $y` | `$v->visitBinop($position, ..., '__greaterThan', ...)` | `__greaterThan` method on `$x` | -| `$x >= $y` | `$v->visitBinop($position, ..., '__greaterThanEqual', ...)` | `__greaterThanEqual` method on `$x` | -| `$x === $y` | `$v->visitBinop($position, ..., '__tripleEquals', ...)` | `__tripleEquals` method on `$x` | -| `$x !== $y` | `$v->visitBinop($position, ..., '__notTripleEquals', ...)` | `__notTripleEquals` method on `$x` | -| `$x . $y` | `$v->visitBinop($position, ..., '__dot', ...)` | `__dot` method on `$x` | -| `$x & $y` | `$v->visitBinop($position, ..., '__amp', ...)` | `__amp` method on `$x` | -| `$x \| $y` | `$v->visitBinop($position, ..., '__bar', ...)` | `__bar` method on `$x` | -| `$x ^ $y` | `$v->visitBinop($position, ..., '__caret', ...)` | `__caret` method on `$x` | -| `$x << $y` | `$v->visitBinop($position, ..., '__lessThanLessThan', ...)` | `__lessThanLessThan` method on `$x` | -| `$x >> $y` | `$v->visitBinop($position, ..., '__greaterThanGreaterThan', ...)` | `__greaterThanGreaterThan` method on `$x` | - -## Ternary Operators - -| Example | Visitor Runtime | Typing | -|----------------|---------------------------------------------|--------------------------| -| `$x ? $y : $z` | `$v->visitTernary($position, ..., ..., ...)` | `$x->__bool() ? $y : $z` | - -## Unary Operators - -| Example | Visitor Runtime | Typing | -|---------|------------------------------------------------------------|------------------------------------| -| `!$x` | `$v->visitUnop($position, ..., '__exclamationMark')` | `__exclamationMark` method on `$x` | -| `-$x` | `$v->visitUnop($position, ..., '__negate')` | `__negate` method on `$x` | -| `~$x` | `$v->visitUnop($position, ..., '__tilde')` | `__tilde` method on `$x` | -| `$x++` | `$v->visitUnop($position, ..., '__postfixPlusPlus')` | `__postfixPlusPlus` method on `$x` | -| `$x--` | `$v->visitUnop($position, ..., '__postfixMinusMinus')` | `__postfixMinusMinus` method on `$x` | - - -## Local Variables - -| Example | Visitor Runtime | Typing | -|-----------|----------------------------------------|---------------------| -| `$x` | `$v->visitLocal($position, '$x')` | Same as normal Hack | - -You can see here that the visitor runtime does not know the type of `$x`, it -just sees a call to `visitLocal` with the variable name as a string -`'$x'`. - -Note that expression trees do not allow free variables. You can only -use local variables that have been previously assigned or introduced -with a lambda. - -## Lambdas - -| Example | Visitor Runtime | Typing | -|-------------------|---------------------------------------------------|---------------------| -| `(Foo $x) ==> $y` | `$v->visitLambda($position, vec['$x'], vec[...])` | Same as normal Hack | - -Note that the visitor runtime does not see the type of `$x`. - -## Statements - -| Example | Visitor Runtime | Typing | -|-----------------------------|--------------------------------------------------------------|---------------------------------------| -| `$x = $y;` | `$v->visitAssign($position, ..., ...)` | Same as normal Hack | -| `return $x;` | `$v->visitReturn($position, ...)` | Same as normal Hack | -| `return;` | `$v->visitReturn($position, null)` | Same as normal Hack | -| `if (...) {...} else {...}` | `$v->visitIf($position, ..., ..., ...)` | `if (...->__bool()) {...} else {...}` | -| `while (...) {...}` | `$v->visitWhile($position, ..., vec[...])` | `while (...->__bool()) {...}` | -| `for (...; ...; ...) {...}` | `$v->visitFor($position, vec[...], ..., vec[...], vec[...])` | `for (...; ...->__bool(); ...) {...}` | -| `break;` | `$v->visitBreak($position)` | Same as normal Hack | -| `continue;` | `$v->visitContinue($position)` | Same as normal Hack | - -## Calls - -| Example | Visitor Runtime | Typing | -|-----------------|-------------------------------------------------------------------------------------|-----------------------------------| -| `foo(...)` | `$v->visitCall($position, $v->visitGlobalFunction($position, foo<>), vec[...])` | `MyDsl::symbolType(foo<>)()` | -| `Foo::bar(...)` | `$v->visitCall($position, $v->visitStaticMethod($position, Foo::bar<>), vec[...])` | `MyDsl::symbolType(Foo::bar<>)()` | - -Note that the function or method must have a Hack definition, so the typechecker can verify that it's being called with appropriate arguments. - -## XHP Literals - -| Example | Visitor Runtime | Typing | -|----------------------|-------------------------------------------------------------|----------------------| -| `<foo ...>...</foo>` | `$v->visitXhp($position, :foo::class, dict[...], vec[...])` | `<foo ...>...</foo>` | - - -## Property Access - -| Example | Visitor Runtime | Typing | -|--------------|--------------------------------------------------|--------------| -| `(...)->foo` | `$v->visitPropertyAccess($position, ..., 'foo')` | `(...)->foo` | - -## Splicing - -| Example | Visitor Runtime | Typing | -|--------------|--------------------------------------------------|--------------| -| `${$x}` | `$v->splice($position, 'key0', $x)` | Extract the inferred type out of the third type argument of `Spliceable` | - -## Unsupported Features - -Expression trees may only contain expressions between the backticks. - -```hack error -MyDsl`1`; // OK: 1 is an expression -MyDsl`while(true) {}`; // Bad: statement -MyDsl`() ==> { while true() {} }`; // OK: statements are allowed in lambdas -MyDsl`class Foo {}`; // Bad: top-level declaration. -``` - -## Expression Tree Blocks - -There are times when it is desirable to include statements as part of an expression tree. One way to accomplish this is to create a lambda that is immediately invoked. - -```hack -<<file:__EnableUnstableFeatures('expression_trees')>> - -function example1(): void { - $num = ExampleDsl`1 + 1`; - ExampleDsl`() ==> { - $n = ${$num}; - return $n + $n; - }()`; -} -``` - -This can be rewritten using expression tree blocks, eliminating the need to create a lambda and invoke it. - -```hack -<<file:__EnableUnstableFeatures('expression_trees')>> - -function example2(): void { - $num = ExampleDsl`1 + 1`; - ExampleDsl`{ - $n = ${$num}; - return $n + $n; - }`; -} -``` - -Note that expression tree blocks are syntactic sugar. It will be expanded to the longer form for both type checking and the visitor runtime. diff --git a/guides/hack/55-expression-trees/10-splicing.md b/guides/hack/55-expression-trees/10-splicing.md deleted file mode 100644 index e02dae271..000000000 --- a/guides/hack/55-expression-trees/10-splicing.md +++ /dev/null @@ -1,52 +0,0 @@ -Expression trees support "splicing", where you insert one expression tree into another. - -```hack -<<file:__EnableUnstableFeatures('expression_trees')>> - -function splicing_example(bool $b): ExampleExpression<ExampleString> { - $name = $b ? ExampleDsl`"world"` : ExampleDsl`"universe"`; - return ExampleDsl`"Hello, ".${$name}."!"`; -} -``` - -This allows you to build different expressions based on runtime values. DSL expressions are not evaluated, but the value in the `${...}` is evaluated and inserted into the expression tree. - -The above example is equivalent to this: - -```hack -<<file:__EnableUnstableFeatures('expression_trees')>> - -function splicing_example2(bool $b): ExampleExpression<ExampleString> { - return $b ? ExampleDsl`"Hello, "."world"."!"` : ExampleDsl`"Hello, "."universe"."!"`; -} -``` - -## Limitations - -Every DSL expression must be valid in isolation. You cannot use free -variables in expression trees, even when splicing. - -```hack error -$var = ExampleDsl`$x`; // type error: $x is not defined -ExampleDsl`($x) ==> { return ${$var}; }`; -``` - -## Implementing Splicing - -A visitor needs to support the `splice` method to allow splicing. The `splice` method is passed the inner expression tree value, along with a unique key that may be used for caching visitor results. - -```hack no-extract -final class MyDsl { - public function splice( - ?ExprPos $_pos, - string $_key, - Spliceable<MyDsl, MyDslAst, mixed> $code, - ): MyDslAst { - return $code->visit($this); - } - - // ... -} -``` - -For more information, see: [Defining Visitors: Spliceable Types](/hack/expression-trees/defining-dsls#spliceable-types). diff --git a/guides/hack/55-expression-trees/15-defining-dsls.md b/guides/hack/55-expression-trees/15-defining-dsls.md deleted file mode 100644 index 5c7c26a53..000000000 --- a/guides/hack/55-expression-trees/15-defining-dsls.md +++ /dev/null @@ -1,245 +0,0 @@ -Adding a DSL to Hack requires you to define a new visitor. - -This page will demonstrate defining a DSL supporting integer arithmetic: - -```hack no-extract -$e = MyDsl`1 + 2`; -``` - -## DSLs are opt-in - -Hack only allows expression tree syntax usage for approved DSLs. These are specified in `.hhconfig`. - -``` -allowed_expression_tree_visitors = MyDsl, OtherDsl -``` - -If you just want to test your DSL, you can enable all expression syntax with the `__EnableUnstableFeatures` file attribute. - -```hack no-extract -<<file:__EnableUnstableFeatures('expression_trees')>> - -function foo(): void { - $e = MyDsl`1 + 2`; -} -``` - -## Representing DSL Expressions - -Our DSL needs a data type to represent expressions written by the user. We'll define a simple abstract syntax tree (AST). - -```Hack file:mydsl.hack -abstract class MyDslAst {} - -class MyDslAstBinOp extends MyDslAst { - public function __construct( - public MyDslAst $lhs, - public string $operator, - public MyDslAst $rhs, - ) {} -} - -class MyDslAstInt extends MyDslAst { - public function __construct(public int $value) {} -} -``` - -## A DSL For Integer Literals - -Hack converts backtick syntax into method calls. - -```hack no-extract -// The user writes backtick syntax. -$e = MyDsl`1`; - -// The runtime sees a lambda calling methods on MyDSL (simplified) -(MyDsl $v) ==> $v->visitInt(null, 1); -``` - -Our basic visitor looks like this. - -```hack no-extract -// The runtime will pass file and line position in ExprPos. -type ExprPos = shape(...); - -class MyDsl { - // The visitor is passed the literal value, so 1 in our example. - public function visitInt(?ExprPos $_pos, int $value): MyDslAst { - return new MyDslAstInt($value); - } -} -``` - -## Adding Operators - -```hack no-extract -// User syntax. -$e = MyDsl`1 + 2`; - -// Runtime (simplified) -(MyDsl $v) ==> - $v->visitBinop( - null, - $v->visitInt(null, 1), - '__plus', - $v->visitInt(null, 2) - ); -``` - -You can see that `$v-visitBinop()` receives the return value of `$v->visitInt()`. This allows the visitor to construct more complex ASTs. - -**The `visitFoo` methods are always unityped.** They receive ASTs without type information, and return an untyped AST. Typechecking happens separately. - -We can support binary operators by adding `visitBinop` to our visitor. - -```Hack no-extract -class MyDsl { - public function visitBinop( - ?ExprPos $_pos, - MyDslAst $lhs, - string $operator, - MyDslAst $rhs, - ): MyDslAst { - return new MyDslAstBinOp($lhs, $operator, $rhs); - } - - public function visitInt(?ExprPos $_pos, int $value): MyDslAst { - return new MyDslAstInt($value); - } -} -``` - -## The DSL Builder - -The visitor closure isn't enough. We want to type check the DSL expression, and we might want to do additional work before we execute the closure. - -```hack no-extract -// The user writes backtick syntax. -$e = MyDsl`1`; - -// Runtime (actual). The first two arguments are extra position information -// and function metadata which aren't used in this tutorial. -MyDsl::makeTree<MyDslInt>(null, shape(), (MyDsl $v) ==> $v->visitInt(null, 1)) -``` - -We call `makeTree` on our visitor class, providing the visitor closure and some additional metadata. The type checker also sees the `TInfer` type, which is `MyDslInt` in this example (discussed below). - -```Hack file:mydsl.hack -class MyDsl { - public static function makeTree<<<__Explicit>> TInfer>( - ?ExprPos $pos, - mixed $_metadata, - (function(MyDsl): MyDslAst) $visit_expr, - ): MyDslExprTree<TInfer> { - return new MyDslExprTree($pos, $visit_expr); - } - - // ... all the visitFoo methods here - } -``` - -### Positions - -The builder method `makeTree` takes a nullable position argument as its first argument, as do all of the `visit...` methods on the Visitor class. At runtime, all of the methods will receive a shape value with the following type: - -```hack no-extract -shape( - 'path' => string, - 'start_line' => int, - 'start_column' => int, - 'end_line' => int, - 'end_column' => int, -) -``` - -DSLs can choose to use this information to report errors with positional information about the source code back to the user. - -### Metadata - -The second argument to the `makeTree` method is a shape containing parts of the expression tree that may be useful to have references to without processing the entirety of the `$visit_expr`. The shape has the type: - -```hack no-extract -shape( - 'splices' => dict<string, mixed>, - 'functions' => vec<mixed>, - 'static_methods' => vec<mixed>, -) $metadata -``` - -For the `functions` and `static_methods` fields, the vec contains the function pointers to any global functions or static method referenced within the expression tree. The same function pointers are passed to the individual calls of `visitGlobalFunction` and `visitStaticMethod`. - -The `splices` field contains a dictionary of string keys and the values the splices are evaluated to. The string keys are generated by the runtime and correspond to the string key and value passed to each individual `splice` Visitor method call. - -## Spliceable Types - -Expression tree values implement `Spliceable`, a typed value that can be visited or spliced into another `Spliceable`. Here's the definition for the `Spliceable` interface. - -```Hack no-extract -/** - * Spliceable is this base type for all expression tree visitors. - * - * A visitor is a class with a visit method. This is extremely generic, so - * visitors can choose what they want to construct. - * - * Typically, you'll use a concrete type rather than this interface. For - * example: - * - * $e = EtDemo`123`; - * - * This has type `Spliceable<EtDemoVisitor, EtDemoAst, EtDemoInt>`. - * - * TVisitor: The class with the `visit` method that constructs the value. - * TResult: The type we get back when running the visitor. - * TInfer: The inferred type of the expression, used only for type checking. -*/ -interface Spliceable<TVisitor, TResult, +TInfer> { - public function visit(TVisitor $visitor): TResult; -} -``` - -The `MyDslExprTree` class implements `Spliceable`, and calls the visitor closure ('builder') when `visit` is called. - -```Hack file:mydsl.hack -class MyDslExprTree<+T> implements Spliceable<MyDsl, MyDslAst, T> { - public function __construct( - public ?ExprPos $pos, - private (function(MyDsl): MyDslAst) $builder, - ) {} - - public function visit(MyDsl $v): MyDslAst { - return ($this->builder)($v); - } -} -``` - -### DSL Types - -```hack no-extract -// Inferred type: MyDslExprTree<MyDslInt> -$e = MyDsl`1`; -``` - -Hack needs to know what types our DSL uses. The visitor specifies the type of literals using `fooType` stub methods. - -```hack no-extract -class MyDsl { - public static function intType(): MyDslInt { - // Only used for type checking, so we don't need an implementation here. - throw new Exception(); - } - // ... -} -``` - -For each type in our DSL, we define an associated type. It's usually easier to use interfaces for these types, as they're only used for type checking. - -```Hack no-extract -interface MyDslNonnull {} - -interface MyDslInt extends MyDslNonnull { - public function __plus(MyDslInt $_): MyDslInt; - public function __minus(MyDslInt $_): MyDslInt; -} -``` - -This allows integers to support the `+` and `-` operators in our DSL, and they return DSL integers. diff --git a/guides/hack/55-expression-trees/20-dsl-types.md b/guides/hack/55-expression-trees/20-dsl-types.md deleted file mode 100644 index 2ebc54741..000000000 --- a/guides/hack/55-expression-trees/20-dsl-types.md +++ /dev/null @@ -1,84 +0,0 @@ -For every literal supported in a DSL, the visitor must provide a stub method that shows what type it should have. - -```Hack file:types.hack -class MyDsl { - // Types for literals - public static function intType(): MyDslInt { - throw new Exception(); - } - public static function floatType(): MyDslFloat { - throw new Exception(); - } - public static function boolType(): MyDslBool { - throw new Exception(); - } - public static function stringType(): MyDslString { - throw new Exception(); - } - - public static function voidType(): void { - throw new Exception(); - } - - // symbolType is used in function calls. - // In this example, MyDsl is using normal Hack - // functions but DSLs may choose more specific APIs. - public static function symbolType<T>( - T $_, - ): T { - throw new Exception(); - } -} -``` - -All types used in the visitor need to define what operators they support. Here's an expanded version of `MyDsl` with types that are very similar to plain Hack. - -```Hack file:types.hack -interface MyDslNonnull { - public function __tripleEquals(?MyDslNonnull $_): MyDslBool; - public function __notTripleEquals(?MyDslNonnull $_): MyDslBool; -} -interface MyDslNum extends MyDslNonnull { - // Arithmetic - public function __plus(MyDslNum $_): MyDslNum; - public function __minus(MyDslNum $_): MyDslNum; - public function __star(MyDslNum $_): MyDslNum; - public function __slash(MyDslNum $_): MyDslNum; - public function __negate(): MyDslNum; - - // Comparisons - public function __lessThan(MyDslNum $_): MyDslBool; - public function __lessThanEqual(MyDslNum $_): MyDslBool; - public function __greaterThan(MyDslNum $_): MyDslBool; - public function __greaterThanEqual(MyDslNum $_): MyDslBool; -} -interface MyDslInt extends MyDslNum { - // Only support modulus on integers in our demo. - public function __percent(MyDslInt $_): MyDslInt; - - // Bitwise operators - public function __amp(MyDslInt $_): MyDslInt; - public function __bar(MyDslInt $_): MyDslInt; - public function __caret(MyDslInt $_): MyDslInt; - public function __lessThanLessThan(MyDslInt $_): MyDslInt; - public function __greaterThanGreaterThan(MyDslInt $_): MyDslInt; - public function __tilde(): MyDslInt; -} -interface MyDslFloat extends MyDslNum { - <<__Override>> - public function __plus(MyDslNum $_): MyDslFloat; -} -interface MyDslString extends MyDslNonnull { - public function __dot(MyDslString $_): MyDslString; -} -interface MyDslBool extends MyDslNonnull { - // __bool signifies that we can use MyDslBool in positions that require - // a truthy value, such as if statements. - public function __bool(): bool; - // Infix operators that return another MyDslBool. - public function __ampamp(MyDslBool $_): MyDslBool; - public function __barbar(MyDslBool $_): MyDslBool; - - public function __exclamationMark(): MyDslBool; -} -``` diff --git a/guides/hack/55-expression-trees/expression-trees-category.txt b/guides/hack/55-expression-trees/expression-trees-category.txt deleted file mode 100644 index 185c57f01..000000000 --- a/guides/hack/55-expression-trees/expression-trees-category.txt +++ /dev/null @@ -1 +0,0 @@ -Experimental Additions diff --git a/guides/hack/55-expression-trees/expression-trees-summary.txt b/guides/hack/55-expression-trees/expression-trees-summary.txt deleted file mode 100644 index ed5211877..000000000 --- a/guides/hack/55-expression-trees/expression-trees-summary.txt +++ /dev/null @@ -1 +0,0 @@ -Typechecker support for domain specific languages. diff --git a/guides/hack/56-memoization-options/01-introduction.md b/guides/hack/56-memoization-options/01-introduction.md deleted file mode 100644 index 671eda9e3..000000000 --- a/guides/hack/56-memoization-options/01-introduction.md +++ /dev/null @@ -1,58 +0,0 @@ -```yamlmeta -{ - "fbonly messages": [ - "There is [an internal wiki](https://www.internalfb.com/intern/wiki/Hack_Foundation/Memoization_options/) with more, Meta-specific guidance." - ] -} -``` - -The `__Memoize` and `__MemoizeLSB` attributes in Hack support experimental options that control how the function behaves with respect to an Implicit Context value. - -## Introduction - -The Implicit Context (IC) is an experimental feature. It is a value that can be associated with the execution of code and propagated implicitly from caller to callee in a way that is safe for [concurrently running code](/hack/asynchronous-operations/introduction). - -In order to prevent the problem of "memoization cache poisoning" where results computed using one IC value are available to callers using a different IC value, we require that memoized functions executed with an IC value are explicit about how they should behave relative to the IC value. Broadly, functions can specify one of two choices: - -* This function's memoization cache key _should_ incorporate the propagated IC value. -* This function's memoization cache key _should not_ incorporate the propagated IC value *AND* this function and its dependencies cannot depend on the propagated IC value. - -These requirements are enforced at runtime via thrown exceptions and not statically by the typechecker. -If static requirements are desired, one can make use of special [contexts and capabilities](/hack/contexts-and-capabilities/introduction) specifically `zoned`. - -## Available Options - -A memoized function may specify its behavior relative to the IC by passing an option to the `__Memoize` (or `__MemoizeLSB`) attribute. - -```Hack -<<__Memoize(#MakeICInaccessible)>> -function get_same_random_int(): int { - return HH\Lib\PseudoRandom\int(); -} -``` - -* `#KeyedByIC` indicates that the function’s memoization cache should include the IC value in the cache key. - * Memoized functions that depend on the IC should use this option. - * Memoized functions with the `[zoned]` context must use this option. - * A function must have one of the following contexts to use this option: `defaults` (implicitly or explicitly), `zoned`, `zoned_local`, `zoned_shallow` - * Note that the cache may also be keyed on metadata necessary for sufficiently complete migration logging and so you should not assume that just because your function isn’t currently being called with a propagated IC value that it is only called once. -* `#MakeICInaccessible` indicates that the function’s memoization cache should *not* include the IC value in the cache key and that the function does not access the IC. - * Any direct or indirect calls to the builtin function that fetches the IC will result in an exception. - * Any direct or indirect calls to an uncategorized memoized function will throw. - * A function must have one of the following contexts to use this option: `defaults` (implicitly or explicitly), `leak_safe_shallow`, `leak_safe_local` - - ->Note that this syntax uses “[enum class labels](/hack/built-in-types/enum-class-label)” as arguments. Currently, only the memoization attributes are allowed to use labels as arguments. - -## Related classes and functions - -```yamlmeta -{ - "fbonly messages": [ - "Meta developers should not use these symbols directly and instead should only use them via Zones APIs." - ] -} -``` - -* Executing code with an IC value and accessing the propagated value is done by extending and using methods of the class `HH\ImplicitContext`. -* Functions `HH\ImplicitContext\soft_run_with` and `HH\ImplicitContext\soft_run_with_async` are passthrough functions that do not affect the Implicit Context state. diff --git a/guides/hack/56-memoization-options/memoization-options-category.txt b/guides/hack/56-memoization-options/memoization-options-category.txt deleted file mode 100644 index 185c57f01..000000000 --- a/guides/hack/56-memoization-options/memoization-options-category.txt +++ /dev/null @@ -1 +0,0 @@ -Experimental Additions diff --git a/guides/hack/56-memoization-options/memoization-options-summary.txt b/guides/hack/56-memoization-options/memoization-options-summary.txt deleted file mode 100644 index 6a91a96e7..000000000 --- a/guides/hack/56-memoization-options/memoization-options-summary.txt +++ /dev/null @@ -1 +0,0 @@ -Experimental feature for controlling use of memoization and the Implicit Context diff --git a/guides/hhvm/01-installation/01-introduction.md b/guides/hhvm/01-installation/01-introduction.md deleted file mode 100644 index 7441b1479..000000000 --- a/guides/hhvm/01-installation/01-introduction.md +++ /dev/null @@ -1,26 +0,0 @@ -HHVM is officially supported on most major [linux platforms](./linux.md), with limited support for [MacOS](./mac.md). - -## Prebuilt Packages - -The easiest way to get going with HHVM is to use one of our supported prebuilt packages. Currently prebuilt packages are available for: - -* [Several versions of Debian and Ubuntu](./linux.md) -* [MacOS](./mac.md) - -### LTS Releases - -In addition to the normal stable packages, there are supported [LTS releases](/hhvm/installation/linux#obtaining-lts-releases) for the above distributions; see [the release schedule](/hhvm/installation/release-schedule#Lifecycle) for details. - -## Compiling HHVM - -For normal usage, using a [prebuilt package](#prebuilt-packages) is the best course of action for ease of installation and stability. However, if you want to live on the bleeding edge and get the latest and greatest code as it is checked into [GitHub](https://github.com/facebook/hhvm/), you can compile HHVM straight from source. Check the [compilation instructions](/hhvm/installation/building-from-source) for both the supported Linux and Mac OS X distros. - -If we support a prebuilt package for a distribution, we support [compiling](/hhvm/installation/building-from-source) it from source as well. - -### Hack Typechecker - -Whether you are using a [prebuilt package](#prebuilt-packages) or compiling from source, the Hack Typechecker is also part of the installation of HHVM. - -## Unsupported Distributions - -There are wikis of unsupported HHVM platforms for [packages](https://github.com/facebook/hhvm/wiki/Prebuilt-Packages-for-HHVM) and [compilation](https://github.com/facebook/hhvm/wiki/Building-and-Installing-HHVM) as well. diff --git a/guides/hhvm/01-installation/02-linux.md b/guides/hhvm/01-installation/02-linux.md deleted file mode 100644 index 5e1419091..000000000 --- a/guides/hhvm/01-installation/02-linux.md +++ /dev/null @@ -1,114 +0,0 @@ -We support x86_64 Linux, and offer prebuilt packages on variety of Ubuntu and -Debian platforms. - -While you can [build from source](/hhvm/installation/building-from-source), it is generally advisable for ease of installation and stability to use a prebuilt package. - -These instructions require root; use `su -` or `sudo -i` to get a root shell first. - -## Obtaining The Latest Stable Version - -### Ubuntu - -``` -apt-get update -apt-get install software-properties-common apt-transport-https -apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xB4112585D386EB94 - -add-apt-repository https://dl.hhvm.com/ubuntu -apt-get update -apt-get install hhvm -``` - -### Debian 8 Jessie, Debian 9 Stretch - -``` -apt-get update -apt-get install -y apt-transport-https software-properties-common -apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xB4112585D386EB94 - -add-apt-repository https://dl.hhvm.com/debian -apt-get update -apt-get install hhvm -``` - -## Obtaining A Specific Release - -It is generally recommended to run the newest version your code can support. This bash oneliner can be used to add the repository for the version you want to install. Replace `major` with the hhvm major version and `minor` with the hhvm minor version. You should not specify the patch part of the version number. - -`apt-add-repository "deb https://dl.hhvm.com/$(lsb_release --id --short | tr '[:upper:]' '[:lower:]') $(lsb_release --codename --short)-major.minor main"` - -So in order to get HHVM 4.56 you would use -`apt-add-repository "deb https://dl.hhvm.com/$(lsb_release --id --short | tr '[:upper:]' '[:lower:]') $(lsb_release --codename --short)-4.56 main""` - -You will automatically receive patches such as HHVM 4.56.1, but you won't be upgraded to HHVM 4.57 and up. - -If you get an HTTP 404 error from apt, please check if the hhvm version you attempted to install supports your operating system on the [blog](https://hhvm.com/blog). - -A particular version of note is hhvm 3.30. It requires an extra `-lts` after the minor version number. This version is **unsupported as of November 2019** and should not be used. -`apt-add-repository "deb https://dl.hhvm.com/$(lsb_release --id --short | tr '[:upper:]' '[:lower:]') $(lsb_release --codename --short)-lts-3.30 main"` - -## Choosing A Version - -If you are working on a new project, you can install the [latest stable version](#Obtaining-The-Latest-Stable-Version). - -If you have an existing project, you can upgrade one release at a time using the [blog](//hhvm.com/blog) to read up on breaking changes. - -If you are inheriting a project and you don't know what version it was written against, check the composer.json file. This file is usually found at the root of a project (right next to .hhconfig). This file ought to include a version requirement like `"hhvm": "^4.56"`. If not, check the last time a commit was made and find what HHVM version was recent at that time using the [blog](//hhvm.com/blog). - -Whatever you do, please make sure that your chosen HHVM version is receiving security updates. The [blog](//hhvm.com/blog) will inform you on what versions supported. - -## Other Packages - -The above commands all install the standard `hhvm` package, which is the stable, release configuration. We have a few other packages available in the repo as well: - -``` -# Stable debug build that is suitable for debuggers like gdb -apt-get install hhvm-dbg - -# Stable developer package that contains the headers so you can create extensions, etc. -apt-get install hhvm-dev - -# Nightly build (Living on the edge, rebuilt everyday, possibly unstable) -apt-get install hhvm-nightly - -# Nightly debug build -apt-get install hhvm-nightly-dbg - -# Nightly developer build -apt-get install hhvm-dev-nightly - -``` - -## GPG Key Installation: Alternative Method - -If you encounter issues with the `apt-key adv` command, an alternative is: - -``` -apt-get install -y curl -curl https://dl.hhvm.com/conf/hhvm.gpg.key | apt-key add - -apt-key finger 'opensource+hhvm@fb.com' -``` - -The 'fingerprint' shown by `apt-key finger` (the second line) should exactly match `0583 41C6 8FC8 DE60 17D7 75A1 B411 2585 D386 EB94`; for example: - -``` -$ apt-key finger 'opensource+hhvm@fb.com' -pub rsa4096 2017-11-03 [SC] - 0583 41C6 8FC8 DE60 17D7 75A1 B411 2585 D386 EB94 -uid [ unknown] HHVM Package Signing <opensource+hhvm@fb.com> -``` - -If this is not the case, run `apt-key list`, then use `apt-key del` to remove any keys you don't recognize. - -## Mirrors - -dl.hhvm.com is fronted by a global CDN, so should be fast for all users. If you wish to maintain a local mirror, you can use AWS CLI utilities to sync: - -``` -aws s3 sync \ - --no-sign-request \ - --region us-west-2 \ - s3://hhvm-downloads/ \ - ./localpath/ \ - --exclude '*index.html' -``` diff --git a/guides/hhvm/01-installation/03-mac.md b/guides/hhvm/01-installation/03-mac.md deleted file mode 100644 index 45175c26d..000000000 --- a/guides/hhvm/01-installation/03-mac.md +++ /dev/null @@ -1,25 +0,0 @@ -```yamlmeta -{ - "caution": [ - "HHVM will no longer support homebrew on MacOS going forward. For more information, see [Stopping MacOS Homebrew Support](https://hhvm.com/blog/2022/06/17/deprecating-homebrew.html)." - ] -} -``` - -We have limited support for installing HHVM on MacOS via [Homebrew](http://brew.sh/): - -``` -brew tap hhvm/hhvm -brew install hhvm -``` - -This will install binary packages on recent versions of MacOS (as of 2019-03-12, this means Mojave and High Sierra). If binary packages are not available -(or you pass `--build-from-source`), building will take between 20 minutes on a Mac Pro, to several hours on a MacBook Air. - -Several other packages are available: - -- `brew install hhvm-nightly`: installs the most recent nightly build -- `brew install hhvm-VERSION`: install a specific x.y version; for example, - `brew install hhvm-4.56` or `brew install hhvm-4.32` - -You can also [manually build from source](building-from-source#building-hhvm__macos). diff --git a/guides/hhvm/01-installation/04-docker.md b/guides/hhvm/01-installation/04-docker.md deleted file mode 100644 index 7297579e7..000000000 --- a/guides/hhvm/01-installation/04-docker.md +++ /dev/null @@ -1,61 +0,0 @@ -We publish Docker images to Docker Hub. These can be used to install HHVM in a containerized environment. If you are new to Docker follow their [getting started guide](https://docs.docker.com/engine/getstarted/) to learn more. All of our images are available [here](https://hub.docker.com/u/hhvm/) (including one for this doc site). To get you started, here are a couple examples: - -## Running HHVM Scripts - -``` -docker pull hhvm/hhvm -docker run --tty --interactive hhvm/hhvm:latest /bin/bash -l -hhvm --version -``` - -## Building a Docker Image for a Website - -Start by creating the following files and folders in a directory: - -*`Dockerfile`* - -``` -FROM hhvm/hhvm-proxygen:latest - -RUN rm -rf /var/www -ADD . /var/www - -EXPOSE 80 -``` - -*`public/index.php`* - -``` -<?hh - -<<__EntryPoint>> -function main(): void { - echo "Hello World!\n"; -} -``` - -Now in a shell run: - -``` -docker build . -docker run -p 0.0.0.0:80:80 <Replace With The Hash Identifying The Build> -``` - -You should now have a running web server hosting the *`index.php`* script visit http://localhost/ to check it out. To shut it down run: - -``` -docker ps -docker stop <The CONTAINER ID shown in the output from docker ps> -``` - -Checkout the setup for this docsite on [github](https://github.com/hhvm/user-documentation) to see how this might scale. - -### Best Practices - -The `hhvm/hhvm-proxygen` image serves `/var/www/public`, and defaults to `/var/www/public/index.php` for `/` and pages that don't exist. We **strongly** recommend only putting files that need to be directly accessible by external users in this directory - this usually means just `index.php` and static resources such as CSS, JavaScript, and images. The rest of your code can reside elsewhere in the image. It's fairly common for `public/` to be a subdirectory of your project root - in which case, you can install your entire project to `/var/www` in the container, which is what we do above. For example, most of the source for this website is in `src/`, but we have [a single `index.php` in `public/`](https://github.com/hhvm/user-documentation/blob/master/public/index.php) which initializes the stack using the code from `src/` and `vendor/`. - -This avoids issues such as: - - exposing configuration files, which might contain credentials such as database passwords - - accidentally exposing the source (with history) [via .git or .hg directories](http://www.jamiembrown.com/blog/one-in-every-600-websites-has-git-exposed/) - - exposing scripts that shouldn't be executable remotely, e.g. the contents of your projects' `bin/` directory - - any of the above from your recursive dependencies in `vendor/` even if your application code is safe diff --git a/guides/hhvm/01-installation/06-release-schedule.md b/guides/hhvm/01-installation/06-release-schedule.md deleted file mode 100644 index 8a1392f48..000000000 --- a/guides/hhvm/01-installation/06-release-schedule.md +++ /dev/null @@ -1,26 +0,0 @@ -We release biweekly (every two weeks), promoting a recent -nightly build. The majority of releases are supported for 6 weeks. - -## Long Term Support - -Every 24 weeks (roughly twice a year), a release has "long term support" for -roughly 48 weeks - until two more LTS releases have been made. If the release -due at that time is delayed, support is extended. - -Here's a table of recent LTS releases as well as *expected* future LTS releases: - -| Version | \*Release Date | \*End of Support | MacOS Homebrew Support | -| ------- | ----------------------- | ------------------------- | --------------------------------- | -| [4.153¹](https://hhvm.com/blog/2022/03/17/hhvm-4.153.html) | March 17, 2022 | *February 16, 2023* | Supported | -| [4.128¹](https://hhvm.com/blog/2021/09/21/hhvm-4.128.html) | September 21, 2021 | *August 24, 2022* | Supported | -| [4.102²](https://hhvm.com/blog/2021/03/23/hhvm-4.102.html) | March 23, 2021 | March 17, 2022 | Not Supported | -| [4.80](https://hhvm.com/blog/2020/10/21/hhvm-4.80.html) | October 21, 2020 | September 21, 2021 | Not Supported | -| [4.56](https://hhvm.com/blog/2020/05/04/hhvm-4.56.html) | May 4, 2020 | April 5, 2021 | Not Supported | -| [4.32](https://hhvm.com/blog/2019/11/19/hhvm-4.32.html) | November 19, 2019 | October 21, 2020 | Not Supported | - - -\* *Dates in italics signify an **expected** date.* - -¹ We are continuing support for MacOS Homebrew on LTS releases (4.128 and 4.153) until they reach EOL, but [we are stopping nightly builds of HHVM on MacOS homebrew](https://hhvm.com/blog/2022/06/17/deprecating-homebrew.html), will no longer be publishing MacOS homebrew packages for new releases, and will not be testing new versions of HHVM on MacOS going forward. - -² HHVM 4.102 was promoted to lts status instead of HHVM 4.104. Its expected support duration has been extended by 2 weeks (to a total of 50) to compensate for the "early start". See the [blog post](https://hhvm.com/blog/2021/03/29/extending-hhvm-4.102-support.html) for more information. \ No newline at end of file diff --git a/guides/hhvm/01-installation/07-building-from-source.md b/guides/hhvm/01-installation/07-building-from-source.md deleted file mode 100644 index 731dfd815..000000000 --- a/guides/hhvm/01-installation/07-building-from-source.md +++ /dev/null @@ -1,103 +0,0 @@ -Building from source is advisable generally when you need features that exist in our source that are not in a [package](/hhvm/installation/introduction#prebuilt-packages). Otherwise, installing from a package is the easiest and most stable way to get up and running. - -## Requirements - -- An `x86_64` system -- Several GB of RAM -- GCC 7+ or clang -- we only actively support building on distributions we create binary packages for; your mileage may vary on other systems - -We only support building with the bundled OCaml; you may need to uninstall -(or `brew unlink` on Mac) other ocamlc and ocamlbuild binaries before -building HHVM. - -## Installing Build Dependencies - -### Debian or Ubuntu - -If you haven't already added our apt repositories (e.g. to install binary packages): - -``` -$ apt-get update -$ apt-get install software-properties-common apt-transport-https -$ apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xB4112585D386EB94 -``` - -To install the build dependencies: - -``` -$ add-apt-repository -s https://dl.hhvm.com/debian -# - or - # -$ add-apt-repository -s https://dl.hhvm.com/ubuntu - -$ apt-get update -$ apt-get build-dep hhvm-nightly -``` - -### Other Distributions - -It's best to obtain the dependency list from our nightly packaging system, to ensure you're using an -up-to-date list; to do this, search https://github.com/hhvm/packaging/ for `Build-Depends:` - -## Downloading the HHVM source-code - -``` -git clone git://github.com/facebook/hhvm.git -cd hhvm -git submodule update --init --recursive -``` - -## Building HHVM - -This will take a *long* time. - -``` -mkdir build -cd build -cmake -DMYSQL_UNIX_SOCK_ADDR=/var/run/mysqld/mysqld.sock .. -make -j [number_of_processor_cores] # eg. make -j 4 -sudo make install -``` - -### Custom GCC - -If you have built your own GCC, you will need to pass additional options to cmake: - -``` --DCMAKE_C_COMPILER=/path/to/gcc -DCMAKE_CXX_COMPILER=/path/to/g++ -DSTATIC_CXX_LIB=On -``` - -## Running programs - -The installed hhvm binary can be found in `/usr/local/bin`. - -## Errors - -If any errors occur, you may have to remove the `CMakeCache.txt` file in the checkout. - -If your failure was on the `make` command, try to correct the error and run `make` again, it should restart from the point it stops. If the error persists, try to remove as explained above. - -## Running Tests - -If you want to run the regression tests, you will first need to install some locales. These locales should be sufficient, although may be more than are actually needed: - -``` - sudo locale-gen en_EN - sudo locale-gen en_UK - sudo locale-gen en_US - sudo locale-gen en_GB - sudo locale-gen de_DE - sudo locale-gen fr_FR - sudo locale-gen fa_IR - sudo locale-gen zh_CN.utf8 - sudo locale-gen zh_CN -``` - -There are 2 families of regression tests. There are about 5000 tests in all. All tests should pass. It takes about 100 CPU minutes to run them all, but the test runner will run them in parallel, using 1 thread per core: - -``` - pushd hphp - test/run quick - test/run slow - popd -``` diff --git a/guides/hhvm/01-installation/08-deprecated-support.md b/guides/hhvm/01-installation/08-deprecated-support.md deleted file mode 100644 index 9162fe01f..000000000 --- a/guides/hhvm/01-installation/08-deprecated-support.md +++ /dev/null @@ -1,5 +0,0 @@ -The following distributions are only supported for [LTS releases](./introduction#lts-releases) up to 4.56. - -### Ubuntu 16.04 Xenial - -Follow instructions for installing [LTS releases](/hhvm/installation/linux#obtaining-lts-releases). diff --git a/guides/hhvm/01-installation/installation-category.txt b/guides/hhvm/01-installation/installation-category.txt deleted file mode 100644 index 8754b08ba..000000000 --- a/guides/hhvm/01-installation/installation-category.txt +++ /dev/null @@ -1 +0,0 @@ -Learn diff --git a/guides/hhvm/01-installation/installation-summary.txt b/guides/hhvm/01-installation/installation-summary.txt deleted file mode 100644 index 2492d9170..000000000 --- a/guides/hhvm/01-installation/installation-summary.txt +++ /dev/null @@ -1 +0,0 @@ -How to install HHVM on a supported platform. diff --git a/guides/hhvm/02-basic-usage/01-introduction.md b/guides/hhvm/02-basic-usage/01-introduction.md deleted file mode 100644 index b5eca5077..000000000 --- a/guides/hhvm/02-basic-usage/01-introduction.md +++ /dev/null @@ -1,14 +0,0 @@ -After [installing](../installation/introduction.md), you are ready to start using HHVM. - -For a majority of cases, you will run HHVM in one of two different ways: - -* In [command-line](./command-line.md) mode to run standalone scripts. -* In [server](./server.md) mode, where HHVM will serve web requests from users. - -## Default Configuration - -The default configuration for HHVM is `php.ini` for command-line mode and `server.ini` for server mode (both normally found in `/etc/hhvm/` on [Linux](../installation/linux.md) distros) - -The default configurations will be sufficient for a majority of use cases. Thus, you most likely will not need to tweak these INI settings, etc. They will be loaded automatically when you start HHVM. - -However, HHVM does allow you to adjust [configuration options](../configuration/introduction.md) to your liking. diff --git a/guides/hhvm/02-basic-usage/02-command-line.md b/guides/hhvm/02-basic-usage/02-command-line.md deleted file mode 100644 index 822a23eac..000000000 --- a/guides/hhvm/02-basic-usage/02-command-line.md +++ /dev/null @@ -1,27 +0,0 @@ -In command-line (cli) mode, you run the `hhvm` binary from the command-line, execute the script and then exit HHVM immediately when the script completes. - -Here is an example of how to run a script in HHVM cli mode. Take the following Hack script: - -```fib.hack -function fibonacci(int $number): int { - return \intval(\round(\pow((\sqrt(5.0) + 1) / 2, $number) / \sqrt(5.0))); -} - -<<__EntryPoint>> -function main(): void { - $n = (int) (vec(\HH\global_get('argv') as Container<_>)[1] ?? 10); - echo 'The '. - $n. - ' number in fibonacci is: '. - fibonacci($n). - \PHP_EOL; -} -``` - -At the command-line, you would execute the script as follows: - -``` -$ hhvm /path/to/fib.hack 10 -``` - -You specify the `hhvm` binary, the path to `fib.hack` and an argument to the script (arguments to scripts do not exist in all cases, of course). \ No newline at end of file diff --git a/guides/hhvm/02-basic-usage/03-server.md b/guides/hhvm/02-basic-usage/03-server.md deleted file mode 100644 index 71d59387a..000000000 --- a/guides/hhvm/02-basic-usage/03-server.md +++ /dev/null @@ -1,49 +0,0 @@ -Use HHVM server mode to create a HHVM process that continuously serves web requests, with these advantages: - -- Multiple requests served simultaneously -- HHVM caches code to be shared across requests - -## Quickstart -Here's the simplest way to run HHVM in Server mode. - -``` -$ hhvm -m server -p 8080 -``` - -- `-m` is the `mode` option; the default is [Command Line mode](/hhvm/basic-usage/command-line). -- `-p` is the port HHVM uses to listen for requests. The default is `80`. - -Other things to know: -- The root for your program files is the directory that you used to launch the `hhvm` command. -- By default, HHVM uses the built-in [proxygen](/hhvm/basic-usage/proxygen) web server. - -## Configuration Overrides -Use the `-d` option to override [configuration](/hhvm/configuration/introduction) defaults and [other options](/hhvm/configuration/INI-settings). - -In our earlier example, we started a HHVM server with `-p 8080`, but you could also have set the port with its expanded property: - -``` -$ hhvm -m server -d hhvm.server.port=7777 -``` - -And we also could have overridden other defaults like the [server type](/hhvm/basic-usage/proxygen) or source root of your project files. For example: - -``` -$ hhvm --mode server -d hhvm.server.type=${SERVER_TYPE} -d hhvm.server.source_root=${PROJECT_FOLDER} -``` - -### INI Configuration Values -HHVM uses the default [INI configuration](/hhvm/configuration/INI-settings) specified in `server.ini`. - -The default ini locations are: -- Linux: `/etc/hhvm/` -- MacOS: `/usr/local/etc/hhvm/` - -## Client access to HHVM in Server mode -Normally, a web request of the form: - -``` -http://your.site:8080/index.hack -``` - -You can also use `curl` and other programs to access the HHVM server as well. \ No newline at end of file diff --git a/guides/hhvm/02-basic-usage/04-proxygen.md b/guides/hhvm/02-basic-usage/04-proxygen.md deleted file mode 100644 index 9d5742fb1..000000000 --- a/guides/hhvm/02-basic-usage/04-proxygen.md +++ /dev/null @@ -1,60 +0,0 @@ -HHVM has built-in support for two server types: Proxygen and [FastCGI](/hhvm/advanced-usage/fastCGI). - -Proxygen is a full web server built directly into HHVM, and is recommended since it is generally the easiest to get up and running. It serves web requests *fast*. Proxygen provides you a high performance web server that is equivalent to what something like the combination of FastCGI and nginx might provide. - -## Using Proxygen - -To use Proxygen when running HHVM in server mode: - -``` -hhvm -m server -p 8080 -``` - -Your port can be whatever you want, of course, via either the following command line configuration setting that you would append to the command above: `-d hhvm.server.port=7777`, or putting `hhvm.server.port=7777` in your `server.ini` file. - -Since Proxygen is the default, you don't need to explicitly specify it as the server type, but you could, for verboseness, append the following to the command above as well: `-d hhvm.server.type=proxygen`. - -## Example Proxygen Configuration - -While not as configurable as a FastCGI/nginx combination, Proxygen does provide sensible defaults for many applications. Thus the simple Proxygen startup sequence above will be just fine. - -However, here is an example of some possible configuration options that you could also add/change to your `server.ini` or as `-d` options at the command line: - -``` -; some of these are not necessary since they are the default value, but -; they are good to show for illustration, and sometimes it is good for -; documentation purposes to be explicit anyway. -; hhvm.server.source_root and hhvm.server.port are the most likely ones -; that need explicit values. -hhvm.server.port = 80 -hhvm.server.type = proxygen -hhvm.server.default_document = index.php -hhvm.server.error_document404 = index.php -; default is the current directory where you launched the HHVM binary -hhvm.server.source_root=/var/www/public -``` - -## Automatic Service Startup - -The HHVM Debian prebuilt packages ship with init scripts that start in FastCGI mode by default, so if you want to automatically start HHVM as a service, you need to do some configuration tweaking. Note that this setup is optional; you can manually run HHVM as above, and it will work just fine. - -The configuration we need to edit is in `/etc/hhvm/server.ini`. We first need to remove the following line which is in that file by default: - -``` -hhvm.server.type = fastcgi -``` - -We also need to add a line that looks like this, to tell HHVM where our code is. Replace `/var/www` with your code's location, of course: - -``` -hhvm.server.source_root = /var/www -``` - -You may also want to change `hhvm.server.port` option; it's set to `9000` by default, but `80` or `8080` makes more sense. Finally, note the value of `hhvm.log.file`, which is where error messages will go. It's set to `/var/log/hhvm/error.log` by default, which is just fine unless you'd rather they go elsewhere. - -Then, you can run these commands to set HHVM to start up at boot, and to start it as a service now: - -``` -sudo update-rc.d hhvm defaults -sudo service hhvm restart -``` diff --git a/guides/hhvm/02-basic-usage/basic-usage-category.txt b/guides/hhvm/02-basic-usage/basic-usage-category.txt deleted file mode 100644 index 8754b08ba..000000000 --- a/guides/hhvm/02-basic-usage/basic-usage-category.txt +++ /dev/null @@ -1 +0,0 @@ -Learn diff --git a/guides/hhvm/02-basic-usage/basic-usage-summary.txt b/guides/hhvm/02-basic-usage/basic-usage-summary.txt deleted file mode 100644 index 4e097238e..000000000 --- a/guides/hhvm/02-basic-usage/basic-usage-summary.txt +++ /dev/null @@ -1 +0,0 @@ -The easiest way to run HHVM, with sensible defaults. diff --git a/guides/hhvm/03-advanced-usage/01-introduction.md b/guides/hhvm/03-advanced-usage/01-introduction.md deleted file mode 100644 index 8826d739a..000000000 --- a/guides/hhvm/03-advanced-usage/01-introduction.md +++ /dev/null @@ -1,12 +0,0 @@ -Normally, after installing HHVM, you can use the [defaults](../basic-usage/introduction.md) provided to [run Hack code](../basic-usage/command-line.md) or [run HHVM as a server](../basic-usage/server.md). - -While a majority of the time you will not need to tweak the default settings or use the more advanced modes available with HHVM, they are available: - -* [Repo Authoritative](./repo-authoritative.md) mode allows you to compile your entire codebase into one unit, allowing for HHVM to perform highly aggressive optimizations to make your code run quickly. -* [Daemon](./daemon.md) mode allows you to run HHVM as a background process. -* The [admin server](./admin-server.md) allows you to monitor HHVM as it is running in server mode. -* [FastCGI](/hhvm/advanced-usage/fastCGI) is another server type for HHVM that is highly configurable and fast, but requires a separate web server on top of it. - -## Custom Configuration - -There are also a plethora of custom [configuration options](../configuration/introduction.md) that you can set to tweak how HHVM operates when running scripts or running as a server. diff --git a/guides/hhvm/03-advanced-usage/02-repo-authoritative.md b/guides/hhvm/03-advanced-usage/02-repo-authoritative.md deleted file mode 100644 index 7a9fcc572..000000000 --- a/guides/hhvm/03-advanced-usage/02-repo-authoritative.md +++ /dev/null @@ -1,212 +0,0 @@ -By default, HHVM starts execution at a single entrypoint file - loading, -compiling, and executing code on-the-fly as it is needed. A `require` of a brand -new file can just load up that file and execute it; writing new files and -then `require`ing them can summon new subclasses into existence. This gives a -lot of flexibility, but prevents some optimizations. - -Repo-authoritative mode works differently. A repository (repo) is built ahead of -time, containing all bytecode for the project; these source files are not used -for execution, and do not need to be present at runtime. - -The obvious benefit here is that HHVM doesn't re-read your source files on every request, but this is actually the smallest of the optimizations allowed in repo authoritative mode. Because HHVM can see all of your code when originally generating the repo, and no more code can ever be brought into existence after that, HHVM can do a whole lot of inference about what your code is doing, and optimize based on that. For example, it might notice that when a certain member variable is written to, the value written to it will always be an `int`. HHVM can then know to allocate an int-sized slot in every instance of that object, and to always generate integer instructions to manipulate that slot, without guarding on the type every time during execution. These optimizations can give a huge performance benefit. - -To use repo authoritative mode, you need to build a repo, and then deploy that repo (i.e., configure HHVM to use it). You can either do that via an automatic script, or manually. - -## Building the Repo - -### Everything Under a Root - -To build a repo including all files recursively under `/path/to/root`, invoke HHVM like this: - -``` -hhvm --hphp --input-dir /path/to/root -``` - -Flag | Description ------|------------ -`--hphp` | Signals to HHVM that we are doing an offline operation instead of executing Hack code. -`--input-dir` | The directory containing the source files to compile into the repo. - -For a full list of options, see `hhvm --hphp --help` - -### Manual List of Files - -Instead of a directory, you can also pass it an explicit list of filenames to put in the repo or a master file that contains all of the files, one per line, that should be put in the repo. (Keep in mind that the commands below are generating two *separate* repos -- you can't add to or remove from a repo once it's been generated!) - -``` -hhvm --hphp file1.php file2.php -hhvm --hphp --input-list master-file-list.txt -``` - -The `master-file-list.txt` should look like this: - -``` -index.php -src/a.php -src/b.php -lib/c.php -``` - -### Specific directories - -``` -hhvm --hphp --module src --module vendor --ffile public/index.php -``` - -Flag | Description ------|------------ -`--module` | specifies a directory (module) containing Hack code that should - | be added to the repository -`--ffile` | specifies a specific file containing Hack code that should be - | added to the repository - -## Manually Deploying the Repo - -After you build the repo, a file called `hhvm.hhbc` is created (formerly an SQLite3 database, now uses a custom file format). You copy this file to your production server. HHVM will use this file when serving requests and will not need the physical source files. - -You must use the same HHVM version to run from the repo as you did to build the repo. In other words, a repo is tied to the version that built it. (Getting this wrong will lead to extremely cryptic errors about missing units in the repo.) - -You can put the repo file anywhere as long as these two ini settings are set correctly in your `server.ini` (or equivalent) file. - -``` -hhvm.repo.authoritative=true -hhvm.repo.path=/path/to/hhvm.hhbc -``` - -**Note**: Before HHVM 4.115, the relevant INI option was `hhvm.repo.central.path`. - -## Static Content Cache - -A bundle of static files can also be built; this is primarily useful if using -the proxygen server without a separate static resources server. - -The most common options are: - -- `--file-cache file.cache`: create a file cache in the file `file.cache` -- `--cfile foo.png`: include a specific file -- `--cmodule public/`: include a specific directory - -The `hhvm.server.file_cache` option must then be set to the path of the -generated file cache. - -The file cache is not supported in CLI mode. - -## Entry Points - -There are two common complications: -- entry point files must exist -- entry point might not be in the top level of the source repository - -### Entry point file must exist - -There are three alternative solutions: -- `touch` the file (the content is irrelevant in repo-authoritative mode) -- include the file in the static file cache (not usable in CLI mode). -- use the `hhvm.server.allowed_files[]=` option to whitelist it - -## Entry point file not in top-level directory - -The repository must be built from the top level directory of the project, and -HHVM's source root (defaulting to the current directory) must also be in the -top level directory. - -This can complicate setups where the main entrypoint is in a subdirectory, such -as a `public/` subdirectory. - -The most common approach is for a single `public/index.hack` file to be the -entrypoint for every HTTP request; this can be configured like: - -``` -; all request paths are relative to the public/ sub-directory -hhvm.virtual_host[default][path_translation]=public -; if no document requested, use index.php -hhvm.server.default_document=index.php -; if a file does not exist, use index.php -hhvm.server.error_document404=index.php -``` - -## Tradeoffs - -The benefits of repo authoritative mode are discussed above: it dramatically increases the scope of the optimizations HHVM can do to your code. - -However, the downside to this is that all your code must be visible to HHVM ahead of time. This means that some kinds of dynamic behavior are not supported, such as: -- `eval()` -- `create_function()` -- `require()`'ing or `include()`'ing files that are not in the repository -- `fb_intercept`, `fb_rename_function` and similar - -## FastCGI - -We *strongly* recommend using the proxygen server instead of FastCGI; that said, -repo-authoritative mode can be used in conjunction with FastCGI. - -The combination of repo-authoritative mode and FastCGI can lead to confusing -path behavior: - -- if requested paths start with the `DOCUMENT_ROOT` FastCGI parameter, it is - removed from the start of the path -- after transformation, the path is interpreted relative to the root of the - built repository - e.g. if `foo/index.hack` is in the repository, a request - for `foo/index.hack` will work even if HHVM's working directory or source root - is in `foo/`, or somewhere entirely different. -- the `doc_root`/`hhvm.server.source_root` does affect file - operations, including reading or serving content from the static file cache. - -### NGINX - -For NGINX, a minimal configuration is: - -``` -events { - worker_connections 1024; -} -http { - server { - listen 8080; - server_name localhost; - location / { - fastcgi_pass localhost:9000; - include /usr/local/etc/nginx/fastcgi_params; - } - } -} -``` - -This is assuming that hhvm is configured to handle any request, for example -by using an `index.hack` document as the index document and 404 document. - -If you would prefer to map request URIs to Hack files inside NGINX, a -configuration file like the following can be used: - -``` -events { - worker_connections 1024; -} -http { - server { - listen 8080; - server_name localhost; - location / { - root /var/www; - fastcgi_pass localhost:9000; - fastcgi_index public/index.hack; - fastcgi_param DOCUMENT_ROOT /var/www; - include /usr/local/etc/nginx/fastcgi_params; - } - } -} -``` - -### Apache - -If using `mod_proxy_fcgi`, we recommend using the -`ProxyFCGIBackendType GENERIC;` directive; alternatively, you can set the -`hhvm.server.fix_path_info=true` to convert the default ('FPM') to the generic -value within HHVM. - -For example: - -``` -ProxyFCGIBackendType GENERIC -ProxyPass "/" "proxy:fcgi://localhost:9000/" -``` diff --git a/guides/hhvm/03-advanced-usage/03-daemon.md b/guides/hhvm/03-advanced-usage/03-daemon.md deleted file mode 100644 index 2c40d126d..000000000 --- a/guides/hhvm/03-advanced-usage/03-daemon.md +++ /dev/null @@ -1,14 +0,0 @@ -You can run HHVM as a daemon (a background process instead of under the explicit control of a user), you just replace `-m server` with `-m daemon`. - -For example, here is how to run HHVM in daemon mode with Proxygen as the backend: - -``` -hhvm -m daemon -d hhvm.server.type=proxygen -d hhvm.server.port=8080 -``` - -Here is how to run HHVM with a custom `server.ini` file using FastCGI: - -``` -hhvm -m daemon -c server.ini -d hhvm.server.type=fastcgi -d hhvm.server.port=9000 -``` - diff --git a/guides/hhvm/03-advanced-usage/04-admin-server.md b/guides/hhvm/03-advanced-usage/04-admin-server.md deleted file mode 100644 index 03c115327..000000000 --- a/guides/hhvm/03-advanced-usage/04-admin-server.md +++ /dev/null @@ -1,36 +0,0 @@ -The admin server allows the administrator of the HHVM server to query and control the HHVM server process. It is different and separate than the primary HHVM server that you specified with `-m server` or `-m daemon`. - -To turn on the admin server, you specify the following options at the command line via `-d` or within your `server.ini` (or equivalent). - -``` -hhvm.admin_server.port=9001 -hhvm.admin_server.password=SomePassword -``` - -The `port` can be any open port. And you should **always specify a password** to secure the admin port since you don't want just anybody being able to control your server. In fact, you will probably want to put the admin server *behind a firewall*. You will specify the password with every request to the admin port. - -The admin server uses the same protocol as the main server - so, if you're using [FastCGI](/hhvm/advanced-usage/fastCGI) mode, the admin server will also be FastCGI, and you will need to configure a front-end webserver (like nginx). If you are using [Proxygen](../basic-usage/proxygen.md) mode, the admin server will be an HTTP server. - -## Querying the Admin Server - -Once you have set up your admin server, you can query it via `curl`. - -``` -curl http://localhost:9001/ -``` - -will bring up a list of commands you can use to control and query your admin server. - -The port associated with the `curl` command is the `hhvm.admin_server` port set above if you are using [Proxygen](/hhvm/basic-usage/proxygen). *If you are using [FastCGI](/hhvm/advanced-usage/fastCGI)*, then the port will be the webserver port that is the front end to FastCGI. - -### Sending a Command - -Use one of the commands listed with the `curl` sequence above, along with your password, to send a command to the admin server. - -``` -curl http://localhost:9001/compiler-id?auth=SomePassword -``` - -## Further Reference - -There is a good [blog post](http://hhvm.com/blog/521/the-adminserver) discussing the admin server even further. diff --git a/guides/hhvm/03-advanced-usage/05-fastCGI.md b/guides/hhvm/03-advanced-usage/05-fastCGI.md deleted file mode 100644 index 93f188fb8..000000000 --- a/guides/hhvm/03-advanced-usage/05-fastCGI.md +++ /dev/null @@ -1,108 +0,0 @@ -HHVM has built-in support for two server types: [Proxygen](../basic-usage/proxygen.md) and FastCGI. - -FastCGI provides a high performance interface between your codebase and web server (e.g., persistent processes between requests, etc.), but which will also obviously require a front-end compatible web server to serve the requests (e.g., [nginx](http://nginx.org/)). - -## How FastCGI Works - -HHVM-FastCGI works much the same way as [PHP-FPM](http://php-fpm.org/). HHVM, running in FastCGI mode, is started independently of the web server (Apache, nginx, etc). It listens on either a TCP socket (conventionally localhost:9000) or a UNIX socket. The web server listens on port 80 or port 443 like it normally would. When a new request comes in, the web server either makes a connection to the application server or reuses one of the previously open connections, and communicates using FastCGI protocol. Therefore, the web server continues to decode HTTP protocol, and supplies HHVM with information like the path of the file to be executed, request headers, and body. HHVM computes the response and sends it back to the web server using FastCGI again. Finally, the web server is in charge of sending the HTTP response to the client. - -## Using FastCGI - -To run the server in FastCGI mode pass the following parameters to hhvm runtime: - - hhvm --mode server -d hhvm.server.type=fastcgi -d hhvm.server.port=9000 - -The server will now accept connections on localhost:9000. To use a UNIX socket, use the `Server.FileSocket` option instead: - - hhvm --mode server -d hhvm.server.type=fastcgi -d hhvm.server.file_socket=/var/run/hhvm/sock - -To turn the server into a daemon, change the value of mode: - - hhvm --mode daemon -d hhvm.server.type=fastcgi -d hhvm.server.file_socket=/var/run/hhvm/sock - -Note, all the usual options that are accepted by hhvm runtime can be used in FastCGI mode as well. In particular, `-d hhvm.admin_server.port=9001` will create an additional "admin" server listening on a port 9001. - -### Making it work with Apache 2.4 - -Ensure that you have apache installed via something like: - -``` -sudo apt-get install apache2 -``` - -The recommended way of integrating with Apache is using `mod_proxy` `mod_proxy_fcgi`. Enable the modules, then in your Apache configuration, add a line as so: - - ProxyPass / fcgi://127.0.0.1:9000/path/to/your/www/root/goes/here/ - # Or if you used a unix socket - # ProxyPass / unix://var/run/hhvm/sock|fcgi://127.0.0.1:9000/path/to/your/www/root/goes/here/ - -This will route *all* the traffic to the FastCGI server. If you want to route only certain requests (e.g. only those from a subdirectory or ending *.php, you can use `ProxyPassMatch`, e.g. - - ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/path/to/your/www/root/goes/here/$1 - -Consult `mod_proxy_fcgi` docs for more details on how to use `ProxyPass` and `ProxyPassMatch`. - -Also make sure to set up a `DirectoryIndex` in your Apache configuration like this: - - <Directory /path/to/your/www/root/> - DirectoryIndex index.php - </Directory> - -This will try to access `index.php` when you send a request to a directory. - -### Making it work with nginx - -Ensure that you have nginx installed via something like: - -``` -sudo apt-get install nginx -``` - -Now nginx needs to be configured to know where your PHP files are and how to forward them to HHVM to execute. The relevant bit of nginx config lives at `/etc/nginx/sites-available/default` -- by default, it's looking in `/usr/share/nginx/html` for files to serve, but it doesn't know what to do with PHP. - -Our included script `sudo /opt/hhvm/<version>/share/hhvm/install_fastcgi.sh` will configure nginx correctly for stock installs. The important part is that it adds `include hhvm.conf` near the top of of the nginx config mentioned above -- this will direct nginx to take any file that ends in `.hh` or `.php` and send it to HHVM via fastcgi. - -The default FastCGI configuration from Nginx should work just fine with HHVM-FastCGI. For instance you might want to add the following directives inside one of your `location` directives: - -``` -root /path/to/your/www/root/goes/here; -fastcgi_pass 127.0.0.1:9000; -# or if you used a unix socket -# fastcgi_pass unix:/var/run/hhvm/sock; -fastcgi_index index.php; -fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; -include fastcgi_params; -``` - -The traffic for the surrounding `location` directive will be now routed to the HHVM-FastCGI server. - -*Testing* - -To test that everything is working, write this hello world script to `hello.php` in whichever directory nginx looks for its web files -- depending on OS, this may be `/usr/share/nginx/html/hello.php` or `/var/www/html/hello.php` or somewhere else: - -``` -<?php -echo "Hello world!\n"; -``` - -If the HHVM server is not running, start it up: - -``` -hhvm -m server -d hhvm.server.type=fastcgi -d hhvm.server.port=9000 -``` - -and then load [http://localhost/hello.php](http://localhost/hello.php) and verify you see "Hello world". - -Note that by default `/usr/share/nginx/html` is only writable by root; use `chown` to set permissions as appropriate, or point `/etc/nginx/sites-available/default` at a different root, or [refer to the nginx documentation](http://nginx.org/en/docs/) to do something more fancy. Basically at this point you know things are working, so you can start from a known-good state as you start customizing your configuration, so it's easy to know if things break later which change broke it. - -*Admin Server in Nginx* - -If you ran with `-vAdminServer.Port=9001` then something like this would work: - -``` -location ~ { - fastcgi_pass 127.0.0.1:9001; - include fastcgi_params; -} -``` - diff --git a/guides/hhvm/03-advanced-usage/06-CLI-server.md b/guides/hhvm/03-advanced-usage/06-CLI-server.md deleted file mode 100644 index ff939671c..000000000 --- a/guides/hhvm/03-advanced-usage/06-CLI-server.md +++ /dev/null @@ -1,67 +0,0 @@ -This module hosts a server on a local socket which can be used to execute -Hack code. The server will delegate file system operations as well as -proc_open commands to the client, allowing the server to masquerade as the -client user. - -The main advantage here is that clients can share a single translation cache -and APC cache, and avoid paying the cost of hhvm startup with each script -invocation. - -The CLI server shines in local development environments. Code is -expected to change as the developer makes iterative changes. Invoking tools -like [hack-codegen](https://github.com/hhvm/hack-codegen) will be significantly -faster, because hhvm can "remember" jitted code between invocations. If you -want to add a CLI server in production, skip to -[CLI server vs repo auth](#cli-server-vs-repo-auth). These two modes can not -be combined and repo auth mode is usually the better choice. - -Using the CLI server requires no changes to the permission model of the -server, and as privileged access is delegated to clients the risk of -privilege escalation within the server is minimized. Additionally the server -itself is only accessible via local socket, but can share a translation -cache with requests executing via the webserver. - -This server is still experimental and in particular there is very limited -transfer of configuration settings from the client. As a result scripts -executed via this module will be running with settings largely defined by -the server process. Currently `PHP_INI_USER`, `PHP_INI_ALL`, `ServerVariables`, -`EnvVariables`, and the remote environment are transferred. - -Access to the CLI server can be controlled by the runtime options -`UnixServerAllowed{Users,Groups}`. When both arrays are empty all users will -be allowed, otherwise only enumerated users and users with membership in -enumerated groups will be permitted access. - -Unit loading within the CLI server is controlled via two different runtime -options. Unlike ordinary file access the server will attempt to load all -units directly before falling back to the client. - -When `UnixServerQuarantineUnits` is set units not opened directly by the server -process will be written to a per-user unit cache only used for CLI server -requests by that user. - -When `UnixServerVerifyExeAccess` is set the server will verify that the client -can read each unit before loading them. The client is required to send the -server a read file descriptor for the unit, which the server will verify is -open in read mode using `fcntl`, has inode and device numbers matching those -seen by the server when executing stat. - -A `UnixServerQuarantineApc` is also available, which forces all apc operations -performed by the CLI server to use a per user cache not shared with the -webserver. - -The INI style runtime options are documented [here](/hhvm/configuration/INI-settings#cli-server). - -### CLI server vs repo auth - -If you need to run CLI-like jobs in a production environment, for example -from a cron job or alike, CLI server mode looks very appealing. It is however -important to note that CLI server mode and [repo auth mode](./repo-authoritative) -can not be combined. All else being equal, repo auth mode will be a lot faster -than CLI server mode. - -If you are running your web servers in repo auth mode, you can't attach -a CLI server instance that shares the JIT with a web server. You will -either need to create a standalone CLI server instance or host a local -web server to run tasks on. The overhead of making a local http request is -not significant compared to the performance gains achieved by repo auth mode. diff --git a/guides/hhvm/03-advanced-usage/advanced-usage-category.txt b/guides/hhvm/03-advanced-usage/advanced-usage-category.txt deleted file mode 100644 index 8754b08ba..000000000 --- a/guides/hhvm/03-advanced-usage/advanced-usage-category.txt +++ /dev/null @@ -1 +0,0 @@ -Learn diff --git a/guides/hhvm/03-advanced-usage/advanced-usage-summary.txt b/guides/hhvm/03-advanced-usage/advanced-usage-summary.txt deleted file mode 100644 index bf297464b..000000000 --- a/guides/hhvm/03-advanced-usage/advanced-usage-summary.txt +++ /dev/null @@ -1 +0,0 @@ -Advanced usage, with more ways to run and configure HHVM. diff --git a/guides/hhvm/04-configuration/01-introduction.md b/guides/hhvm/04-configuration/01-introduction.md deleted file mode 100644 index 325fe7560..000000000 --- a/guides/hhvm/04-configuration/01-introduction.md +++ /dev/null @@ -1,29 +0,0 @@ -After [installing HHVM](../installation/introduction.md), you will want to configure it to run scripts from the command line and/or serve web traffic. - -## Configuration Options - -HHVM has a very large set of [configuration options](./INI-settings.md). Many are not meant for the end HHVM user, but there are some key options that will be useful for anyone deploying HHVM. - -### INI Format - -HHVM uses configuration files in [INI format](https://en.wikipedia.org/wiki/INI_file). In an INI file, each line represents a configuration in key/value format, where the key is the name of the option, while the value is the value for that option. For example, - -``` -hhvm.force_hh = 1 -hhvm.server_variables[MY_VARIABLE] = "Hello" -``` - -These settings can be specified in one of two places, or in a combination of both: - -* A configuration file, normally suffixed with `.ini` (e.g., `config.ini`) -* At the command line using the `-d` flag to the HHVM binary. - -``` -hhvm -c config.ini file.php -hhvm -d hhvm.force_hh = 1 file.php -hhvm -c config.ini -d hhvm.log.file = /tmp/temp.log -d hhvm.force_hh = 1 file.php -``` - -If the same option is specified more than once, then the option that HHVM reads last will be the value used. HHVM reads the command line left to right and INI configuration files top to bottom. - -Check out our [INI settings page](/hhvm/configuration/INI-settings#common-options) for the common configuration options you are likely to use day-to-day. diff --git a/guides/hhvm/04-configuration/02-INI-settings.md b/guides/hhvm/04-configuration/02-INI-settings.md deleted file mode 100644 index a63066421..000000000 --- a/guides/hhvm/04-configuration/02-INI-settings.md +++ /dev/null @@ -1,1027 +0,0 @@ -Here is the raw list of all possible ini settings that can go in your `/etc/hhvm/php.ini`, `/etc/hhvm/server.ini` or any custom `.ini` file. Not all of them are useful to the HHVM end user. There is lots of cleanup work to do here, but for now you get sorted lists. - -Any setting prefixed with `hhvm.` are HHVM-specific options. - -## Supported PHP INI Settings - -Here is the supported list of [PHP INI settings](http://php.net/manual/en/ini.list.php) for HHVM. The documentation for each is available when you click the option. - -In addition to the PHP settings below, you can use `curl.namedPools` to initialize named connection pools via a comma-separated list. - -@@ guides-generated-markdown/php_ini_support_in_hhvm.md @@ - -## Common Options - -These are the options that are probably the most commonly used on a day-to-day basis by users of HHVM. - -| Setting | Type | Default | Description -|---------|------|---------|------------ -| `hhvm.server_variables` | `array` | `$_SERVER` | Sets the contents of the `$_SERVER` variable. -| `hhvm.enable_obj_destruct_call` | `bool` | `false` | If `false`, `__destruct()` methods will not be called on an object at the end of the request. This can be a performance benefit if your system and application can handle the memory requirements. Deallocation can occur all at one time. If `true`, then HHVM will run all `__destruct()` methods in the usual way. -| `hhvm.hack.lang.look_for_typechecker` | `bool` | `true` | When `true`, HHVM will only process Hack `<?hh` files if the Hack typechecker server is available and running. You normally turn this off in production and it will be turned off automatically in [repo authoritative mode](../advanced-usage/repo-authoritative.md). -| hhvm.jit | `bool` | `true` | Enables the [JIT](https://en.wikipedia.org/wiki/Just-in-time_compilation) [compiler](http://hhvm.com/blog/2027/faster-and-cheaper-the-evolution-of-the-hhvm-jit). This is turned on by default for all supported distributions. Times when you might want to turn this off is for a [short running script](/hhvm/FAQ/faq#why-is-my-code-slow-at-startup) that may not make use of the JIT. -| `hhvm.jit_enable_rename_function` | `bool` | `false` | If `false`, `fb_rename_function()` will throw a fatal error. And HHVM knowing that functions cannot be renamed can increase performance. -| `hhvm.server.thread_count` | `int` | 2x the number of CPU cores | This specifies the number of worker threads used to serve web traffic in [server mode](../basic-usage/server.md). The number to set here is really quite experimental. If you use [`async`](/hack/asynchronous-operations/introduction), then this number can be the default. Otherwise, you might want a higher number. -| `hhvm.server.source_root` | `string` | working directory of HHVM process | For [server mode](../basic-usage/server.md), this will hold the path to the root of the directory of the code being served up. This setting is *useless* in [repo-authoritative mode](/hhvm/advanced-usage/repo-authoritative). -| `hhvm.force_hh` | `bool` | `false` | If `true`, all code is treated as Hack code, even if it starts with `<?php`. This setting affects `hhvm.enable_xhp` by forcing it to be `true` as well. This setting affects `hhvm.hack.lang.ints_overflows_to_ints` and `hhvm.log.always_log_unhandled_exceptions` by being the default value for them when they is not explicitly set. This setting affects `hhvm.server.allow_duplicate_cookies` by being the opposite value for a default when it is not explicitly set. -| `hhvm.log.file` | `string` | standard error (`stderr`) | The location of the HHVM error log file. If `hhvm.log.use_cronolog` is set, then this setting will be used as the cron output file. -| `hhvm.repo.authoritative` | `boolean` | `false` | If `true`, you are specifying that you will be using HHVM's [repo-authoritative mode](/hhvm/advanced-usage/repo-authoritative) to serve requests. -| `hhvm.repo.path` | `string` | `""` | The path to the `hhvm.hhbc` file created when you compiled a repo-authoritative repo. (before HHVM 4.115: `hhvm.repo.central.path`) -| `hhvm.server.type` | `string` | `"Proxygen"` | The type of server you want to serve up requests for the HHVM server. The default is `"proxygen"`, but you can also specify `"fastcgi"`. -| `hhvm.server.port` | `int` | `80` | The port on which the HHVM server will listen for requests. -| `hhvm.server.default_document` | `string` | `"index.php"` | The default document that will be served if a page is not explicitly specified. -| `hhvm.server.error_document404` | `string` | `"index.php"` | The default 404 error document that will be served when a 404 error occurs. -| `hhvm.server.user` | `string` | `` | The user to run the HHVM server under. Otherwise, the current user is used. - -## PHP 7 Settings - -For changes from PHP 5 to PHP 7 which are backwards incompatible, INI options are available to choose which behavior HHVM respects. (Features which are not backwards incompatible are always available.) - -The vast majority of users will want to just set `hhvm.php7.all = 1` to fully enable PHP 7 mode and can ignore the rest of the options in this section. They are available primarily for advanced users who want to do a more gradual migration or otherwise track down compatibility issues. - -| Setting | Type | Default | Description | PHP 7 RFC -|---------|------|---------|-------------|---------- -| `hhvm.php7.all` | `bool` | `false` | Default value for all of the below | N/A -| `hhvm.php7.deprecate_old_style_ctors` | `bool` | `hhvm.php7.all` | Disallow and warn when using old PHP 4 constructors | [Remove PHP 4 constructors](https://wiki.php.net/rfc/remove_php4_constructors) -| `hhvm.php7.engine_exceptions` | `bool` | `hhvm.php7.all` | Enable throwing the new `Error` hierarchy of exceptions | [Engine exceptions](https://wiki.php.net/rfc/engine_exceptions_for_php7) -| `hhvm.php7.int_semantics` | `bool` | `hhvm.php7.all` | Change some edge-case int and float behavior, such as divide/mod by zero | [Integer semantics](https://wiki.php.net/rfc/integer_semantics) with some changes due to [engine exceptions](https://wiki.php.net/rfc/engine_exceptions_for_php7) -| `hhvm.php7.ltr_assign` | `bool` | `hhvm.php7.all` | Make order of assignment in `list()` lvalues consistent | [Abstract syntax tree](https://wiki.php.net/rfc/abstract_syntax_tree) -| `hhvm.php7.no_hex_numerics` | `bool` |`hhvm.php7.all` | Don't consider hex strings to be numeric | [Remove hex support in numeric strings](https://wiki.php.net/rfc/remove_hex_support_in_numeric_strings) -| `hhvm.php7.scalar_types` | `bool` | `hhvm.php7.all` | Enable PHP 7-style scalar type annotations (NB: not the same as Hack's) | [Scalar type declarations](https://wiki.php.net/rfc/scalar_type_hints_v5) -| `hhvm.php7.uvs` | `bool` | `hhvm.php7.all` | Fix some odd precedence and order of evaluation issues | [Uniform variable syntax](https://wiki.php.net/rfc/uniform_variable_syntax) - -## Server Mode - -These are settings that are available to you when running HHVM in [server mode](/hhvm/basic-usage/server). In normal, everyday usage, you will not use many of these settings. They are described here for completeness, and in case you might ever need them. - -| Setting | Type | Default | Description -|---------|------|---------|------------ -| `hhvm.env_variables` | `Map` | *empty* | Set the contents of the `$_ENV` variable. You set them in the form of `hhvm.env_variables[X]=Y`. If you are setting just one, command line `-d` is fine. Otherwise, for multiple settings, use a `.ini` file. -| `hhvm.http.default_timeout` | `int` | 30 | HTTP default timeout, in seconds. -| `hhvm.http.slow_query_threshold` | `int` | 5000 | If a query takes longer than this setting, it is logged as a slow query. -| `hhvm.php_file.extensions` | `Map<string>` | *empty* | Normally, `.php` and `.hh` are treated as source code. With this setting you can add other file extensions to be treated as source code. You set them in the form of `hhvm.php_file.extensions["pp"]=".pp"`. If you are setting just one, command line `-d` is fine. Otherwise, for multiple settings, use a `.ini` file. -| `hhvm.pid_file` | `string` | `www.pid` | The location of the server process id file. -| `hhvm.ip_block_map`| `Object` | *empty* | A set of IP information that will be blocked or allowed per endpoint. The format for this setting is [below](#server-mode__ip-block-map-format). You need a `location` and at least one `allow` or `deny`. **This setting is currently not retrievable via `ini_get()`**. This is not normally set. -| `hhvm.satellites` | `Object` | *empty* | If you have various ports for different types of servers, such as an RPC server. The format for this setting is [below](#server-mode__satellite-format). You need at least a `type` and a `port`. **This setting is currently not retrievable via `ini_get()`**. This is not normally set. -| `hhvm.server_variables` | `Map<string>` | *empty* | Set the contents of the `$_SERVER` variable. You set them in the form of `hhvm.server_variables[X]=Y`. If you are setting just one, command line `-d` is fine. Otherwise, for multiple settings, use a `.ini` file. -| `hhvm.server.allow_duplicate_cookies` | `bool` | `!hhvm.force_hh` | If enabled, this allows duplicate cookies for a name-domain-path triplet. -| `hhvm.server.allowed_exec_cmds` | `Vector<string>` | *empty* | A whitelist of acceptable process commands for something like `pcntl_exec`. This setting is only effective if `hhvm.server.whitelist_exec` is `true`. You set them in the form of `hhvm.server.allowed_exec_cmds[]="cmd"`. If you are setting just one, command line `-d` is fine. Otherwise, for multiple settings, use a `.ini` file. -| `hhvm.server.always_populate_raw_post_data` | `bool` | `false` | Generally, if the content type is multipart/form-data, `$HTTP_RAW_POST_DATA` should not always be available. If this is enabled, then that data will always be available. -| `hhvm.server.always_use_relative_path` | `bool` | `false` | If enabled, files will be looked up and invoked via a relative path. In [sandbox](#sandbox) mode, files always use a relative path. -| `hhvm.server.backlog` | `int` | 128 | The maximum queue length for incoming connections. -| `hhvm.server.connection_limit` | `int` | `0` | The maximum number of connections the server (e.g., [Proxygen](/hhvm/basic-usage/proxygen)) can accept. The default is `0`, which is unlimited. -| `hhvm.server.connection_timeout_seconds` | `int` | `-1` | The maximum number of seconds a connection is allowed to stand idle after its previous read or write. If `-1`, this defaults to the server default (e.g., for Proxygen](/hhvm/basic-usage/proxygen) this is 50 seconds). -| `hhvm.server.dangling_wait` | `int` | `0` | The number of seconds to wait for a dangling server to respond. A [dangling server](https://github.com/facebook/hhvm/blob/master/hphp/doc/server.dangling_server) allows the possibility for an older version of a server to run on a different port in case a page needs to be served from that old version. -| `hhvm.server.default_charset_name` | `string` | `''` | This is used for PHP responses in case no other charset has been set explicitly. `"UTF-8"` is an example of a possible setting. -| `hhvm.server.default_document` | `string` | `"index.php"` | The default document that will be served if a page is not explicitly specified. -| `hhvm.server.default_server_name_suffix` | `string` | `''` | If a server name is not specified for a virtual host, then the virtual prefix is prepended to this setting to create a server name. -| `hhvm.server.enable_early_flush` | `bool` | `true` | Allows chunked encoding responses. -| `hhvm.server.enable_keep_alive` | `bool` | `true` | If enabled, the server will remain open for connection until `hhvm.server.connection_timeout_seconds` timeout. -| `hhvm.server.enable_on_demand_uncompress` | `bool` | `true` | If enabled, this allows on-demand uncompress when reading from the file cache to avoid storing the uncompressed contents for compressible files. -| `hhvm.server.enable_output_buffering` | `bool` | `false` | Turn output buffering on. While output buffering is active no output is sent from the script (other than headers), instead the output is stored in an internal buffer. -| `hhvm.server.enable_ssl` | `bool` | `false` | If enabled, HHVM will allow SSL connections to come through. Related to `hhvm.server.ssl_port`, `hhvm.server.ssl_certificate_file`, `hhvm.server.ssl_certificate_key_file`, `hhvm.server.ssl_certificate_dir`. -| `hhvm.server.enable_static_content_from_disk` | `bool` | `true` | A static content cache creates one single file from all static contents, including css, js, html, images and any other non-PHP files. Normally this is prepared by the compiler at compilation time, but it can also be prepared at run-time, if `hhvm.server.source_root` points to real file directory and this setting is `true`. Otherwise, use `hhvm.server.file_cache` to point to the static content cache file created by the compiler. -| `hhvm.server.enable_static_content_m_map` | `bool` | `true` | This setting being `true` overrides whatever is set for `hhvm.server.enable_on_demand_uncompress`. -| `hhvm.server.error_document404` | `string` | `''` | The default 404 error document that will be served when a 404 error occurs. -| `hhvm.server.error_document500` | `string` | `''` | The default 500 error document that will be served when a 500 error occurs. -| `hhvm.server.evil_shutdown` | `bool` | `true` | Kill anything listening on the server port. This is enabled by default. When stopping a server, HHVM first tries to gracefully shut it down. If that doesn't work, and `hhvm.server.harsh_shutdown` is enabled, it will try to kill the `pid` file. If that doesn't work, then `hhvm.server.evil_shutdown` is invoked. -| `hhvm.server.exit_on_bind_fail` | `bool` | `false` | If the HHVM server cannot start because there is an older HHVM server running, if this flag is enabled, then the current HHVM just quits trying to start the server. If this is not enabled, HHVM try harsher measures to stop the older server so the current one can start up again. -| `hhvm.server.expires_active` | `bool` | `true` | If enabled, then cached static content will expire after the duration of `hhvm.server.expires_default`. -| `hhvm.server.expires_default` | `int` | 2592000 | If `hhvm.server.expires_active` is enabled, then cached static content will expire after this amount of time. The default is `2592000` seconds (or 30 days). -| `hhvm.server.expose_hphp` | `bool` | `true` | Expose the `X-Powered-By HHVM` version header. -| `hhvm.server.expose_xfb_debug` | `bool` | `false` | If enabled, Facebook specific debugging information is exposed. -| `hhvm.server.expose_xfb_server` | `bool` | `false` | Facebook specific debugging information is exposed. -| `hhvm.server.fatal_error_message` | `string` | `''` | If this string is not empty, then when you encounter a 500, the message associated with the string is shown. -| `hhvm.server.file_cache` | `string` | `''` | An absolute path to where the static content (e.g., css, html, etc.) created during compilation should be loaded. `hhvm.server.enable_static_content_from_disk` needs to be enabled for this setting to take effect. -| `hhvm.server.file_socket` | `string` | `''` | If this string is not empty, then a file socket is used instead of an IP address for the server. -| `hhvm.server.fix_path_info` | `bool` | `false` | If enabled, this changes [fastcgi](/hhvm/advanced-usage/fastCGI) path from `SCRIPT_FILENAME` to `PATH_TRANSLATED`. -| `hhvm.server.forbidden_as404` | `bool` | `false` | If the extension of a URI is in the ``hhvm.server.forbidden_file_extensions` map, and this option is enabled, then that extension cannot be used as a 404 option either. -| `hhvm.server.forbidden_file_extensions` | `Set<string>` | *empty* | Map of filename extensions that will not be loaded by the server. You set them in the form of `hhvm.server.forbidden_file_extensions[]=".exe"`. If you are setting just one, command line `-d` is fine. Otherwise, for multiple settings, use a `.ini` file. -| `hhvm.server.force_chunked_encoding` | `bool` | `false` | If enabled, the server will only send chunked encoding responses for uncompressed payloads. -| `hhvm.server.force_compression.cookie` | `string` | `''` | For compression, if this string is set and the cookie is present in the request, then compression should happen. -| `hhvm.server.force_compression.param` | `string` | `''` | For compression, if this string is set and the parameter is present in the request, then compression should happen. -| `hhvm.server.force_compression.url` | `string` | `''` | For compression, if this URL is set and the request matches exactly, then compression has to happen. -| `hhvm.server.force_server_name_to_header` | `bool` | `false` | If enabled, then `$_SERVER['SERVER_NAME']` must come from the request header. -| `hhvm.server.global_document` | `string` | `''` | If specified, the document that handles every URI. -| `hhvm.server.graceful_shutdown_wait` | `int` | `0` | The amount of time to wait for a graceful shutdown of a server. If it doesn't shutdown during that period of time, then `hhvm.server.harsh_shutdown` may be invoked. -| `hhvm.server.gzip_compression_level` | `int` | `3` | When compression with gzip, this is the level of compression that will be used. `1` is fastest. `9` is best. -| `hhvm.server.harsh_shutdown` | `bool` | `true` | When stopping a server, HHVM first tries to gracefully shutdown any previous incarnation of the server. If that doesn't work, and `hhvm.server.harsh_shutdown` is enabled, it will try to kill the `pid` file associated with the server process. -| `hhvm.server.high_priority_end_points` | `Set<string>` | *empty* | A list of http endpoints that will be given request priority. The form is `/endpoint`. -| `hhvm.server.host` | `string` | `''` | The default host for the server. -| `hhvm.server.http_safe_mode` | `bool` | `false` | If enabled, then you cannot open an HTTP stream. -| `hhvm.server.image_memory_max_bytes` | `int` | `0` | The maximum memory size for image process. If `0`, then it will be set to `hhvm.server.upload.upload_max_file_size` * 2. -| `hhvm.server.implicit_flush` | `bool` | `false` | If set to true, then the output buffer will be set to implicitly flush when executing requests. -| `hhvm.server.ip` | `string` | `''`| The default ip address for the server. -| `hhvm.server.kill_on_sigterm` | `bool` | `false` | If enabled, and the server receives a SIGTERM signal, then server will be stopped. -| `hhvm.server.light_process_count` | `int` | `0` | The number of light processes to turn on. Light processes have very little forking cost because they are pre-forked. They can provide for faster shell command execution. -| `hhvm.server.light_process_file_prefix` | `string` | `./lightprocess` | The file prefix for a light process. -| `hhvm.server.lock_code_memory` | `bool` | `false` | Unless this is enabled, during paging the server into memory, the binary is `munlock()`ed. -| `hhvm.server.max_array_chain`| `int` | `INT_MAX` | For balancing arrays. Normally this is best left as the default. -| `hhvm.server.max_post_size` | `int` | `100` | The maximum POST content-length. This is 100 MB. -| `hhvm.server.memory_head_room` | `int` | `0` | How much memory headroom is allowed. If kept at the default, then the active memory limit is `std::numeric_limits<size_t>::max()`. -| `hhvm.server.output_handler` | `string` | `''` | A custom output buffer handler. If left empty, then the default is used. -| `hhvm.server.path_debug`| `bool` | `false` | If a 404 is returned, and this is enabled, then the URL paths examined will be displayed. -| `hhvm.server.port` | `int` | `80` | The port on which the HHVM server will listen for requests. -| `hhvm.server.psp_cpu_timeout_seconds` | `int` | `0` | The length of CPU time a post-send processing request (PSP) is allocated. If `0`, the timer is reset to the last one. If negative, the timeout is set to that value if there is less than that value remaining. If positive, the timeout is set to that value. -| `hhvm.server.psp_timeout_seconds` | `int` | `0` | The length of time a post-send processing request (PSP) is allocated. If `0`, the timer is reset to the last one. If negative, the timeout is set to that value if there is less than that value remaining. If positive, the timeout is set to that value. -| `hhvm.server.request_body_read_limit` | `int` | `-1` | Only valid for a [proxygen](/hhvm/basic-usage/proxygen) server, if set to something other than `-1`, a limit is set on the request buffer and new data won't be added to the buffer until that part of the request is processed. -| `hhvm.server.request_init_document` | `string` | `''` | The document that is loaded and executed upon the server receiving a request. -| `hhvm.server.request_init_function` | `string` | `''` | The function that is executed upon the server receiving a request. If both `hhvm.server.request_init_function` and this is specified, the former is executed first. -| `hhvm.server.request_memory_max_bytes` | `int` | `0` | The maximum number of bytes for a request. If not explicitly set (i.e., remains the default of `0`), this value is set to 16GB or the system's memory limit, which ever is less. -| `hhvm.server.request_timeout_seconds` | `int` | `0` | The amount of time provided for a request to process before the server times out. If `0` (default), there is no explicit request timeout. -| `hhvm.server.safe_file_access` | `bool` | `false` | If enabled, then when a file is accessed it ensures that the file is in an allowed directory, is not an absolute path, and is resolvable. -| `hhvm.server.shutdown_listen_wait` | `int` | `0` | When the [proxygen](/hhvm/basic-usage/proxygen) server is stopped, if this value is set to something positive, then it will continue to listen that number of seconds before actually shutting down. -| `hhvm.server.ssl_certificate_dir` | `string` | `''` | The directory where your SSL certificate information is located. `hhvm.server.enable_ssl` must be enabled for this to take effect. -| `hhvm.server.ssl_certificate_file` | `string` | `''` | The file that contains your SSL certificate. `hhvm.server.enable_ssl` must be enabled for this to take effect. -| `hhvm.server.ssl_certificate_key_file` | `string` | `''` | The file that contains your SSL certificate key. `hhvm.server.enable_ssl` must be enabled for this to take effect. -| `hhvm.server.ssl_port` | `int` | `443` | The port for SSL connections. `hhvm.server.enable_ssl` must be enabled for this to take effect. -| `hhvm.server.stat_cache` | `bool` | `false` | If enabled, the server will cache calls to [stat()](https://en.wikipedia.org/wiki/Stat_(system_call)). -| `hhvm.server.takeover_filename` | `string` | `''` | Between server instances port takeover, this is the file that is used. -| `hhvm.server.thread_count` | `int` | 2x the number of CPU cores | This specifies the number of worker threads used to serve web traffic in [server mode](../basic-usage/server.md). The number to set here is really quite experimental. If you use [`async`](/hack/asynchronous-operations/introduction), then this number can be the default. Otherwise, you might want a higher number. -| `hhvm.server.thread_drop_cache_timeout_seconds` | `int` | `0` | The amount of time for a server thread to drop its cache. -| `hhvm.server.thread_drop_stack` | `bool` | `false` | If we have timed out via `hhvm.server.thread_drop_cache_timeout_seconds`, if this is enabled, then we also flush the thread stack itself. -| `hhvm.server.thread_job_lifo_switch_threshold` | `int` | `INT_MAX` | An option where the request processing order can flip between FIFO or LIFO based on the length of the queue. If the job queue is configured to be in FIFO mode, and the current queue length exceeds lifoSwitchThreshold, then the workers will begin work on requests in LIFO order until the queue size is below the threshold in which case we resume in FIFO order. -| `hhvm.server.thread_job_max_queuing_milli_seconds` | `int` | `-1` | If set to a positive number, this will be the number of milliseconds that will be waited for a job before it expires. -| `hhvm.server.thread_round_robin` | `bool` | `false` | By default, the last thread serves next. If this setting is enabled, then serving is done round robin style. -| `hhvm.server.tls_client_cipher_spec` | `string` | `''` | If not empty, then the [SSL ciphers](https://www.openssl.org/docs/manmaster/ssl/SSL_CTX_set_cipher_list.html) are set with the control string provided. -| `hhvm.server.tls_disable_tls1_2` | `bool` | `false` | If enabled, then the [TLSv1.2 protocol](https://www.openssl.org/docs/manmaster/ssl/SSL_CTX_set_options.html) is disabled. -| `hhvm.server.type` | `string` | `"proxygen"` | The type of server you want to serve up requests for the HHVM server. The default is `"proxygen"`, but you can also specify `"fastcgi"`. -| `hhvm.server.unserialization_whitelist_check` | `bool` | `false` | If enabled, only classes in the whitelist passed as the second argument to the `unserialize()` method will be allowed to be unserialized. -| `hhvm.server.unserialization_whitelist_check_warning_only` | `bool` | `true` | If `hhvm.server.unserialization_whitelist_check` is enabled, then if a class is attempted to be unserialized that is not in the whitelist, and this is enabled, only a warning will be displayed instead of erroring. -| `hhvm.server.upload.enable_file_uploads` | `bool` | `true` | Allow files to be uploaded. -| `hhvm.server.upload.enable_upload_progress` | `bool` | `false` | If enabled, then a file upload progress bar can be displayed. For example, the client can then query the apc user cache to find out the upload progress and then display an upload progress bar. -| `hhvm.server.upload.rfc1867freq` | `int` | `256 * 1024` (256K) | If `hhvm.server.upload.enable_upload_progress` is enabled, then this is how often the progress will be updated. -| `hhvm.server.upload.rfc1867name` | `string` | `video_ptoken` | The hidden form entry name that activates APC upload progress and specifies the user cache key suffix. -| `hhvm.server.upload.rfc1867prefix` | `string` | `vupload_` | Key prefix for the user cache entry generated by rfc1867 upload progress functionality. -| `hhvm.server.upload.upload_max_file_size` | `int` | `100` (MB) | The maximum file upload size. -| `hhvm.server.upload.upload_tmp_dir` | `string` | '/tmp' | The temporary directory used for file uploads. -| `hhvm.server.use_direct_copy` | `bool` | `false` | If enabled, files will be renamed using very little disk-cache. -| `hhvm.server.user` | `string` | `` | The user to run the HHVM server under. Otherwise, the current user is used. -| `hhvm.server.utf8ize_replace` | `bool` | `true` | Whether to convert and replace all characters with UTF8. -| `hhvm.server.warmup_throttle_request_count` | `int` | `0` | If positive, and if `hhvm.server.thread_count` is greater than the number of processors, then the starting number of warmup threads will be the same as `hhvm.server.thread_count` - (the number of processors). -| `hhvm.server.warn_on_collection_to_array` | `bool` | `false` | If enabled, every time you try to convert a collection to an array, you will get a warning explaining that the operation is expensive and should be avoided. -| `hhvm.server.whitelist_exec` | `bool` | `false` | If enabled, then this sets a whitelist of commands that will be executed, given by `hhvm.server.allowed_exec_cmds`. -| `hhvm.server.whitelist_exec_warning_only` | `bool` | `false` | If enabled, and `hhvm.server.whitelist_exec` is enabled, if you try to execute a command outside the whitelist, you will only get a warning. -| `hhvm.server.xfb_debug_ssl_key` | `string` | `bool` | If `hhvm.expose_xfb_debug` or `hhvm.expose_xfb_server` is enabled, this will be the SSL key that will be used. -| `hhvm.static_file.extensions` | `Map<string>` | (see description) | Map of filename extensions to content types for use by the proxygen server. The defaults are [below](#server-mode__static-file-extension-defaults). You set them in the form of `hhvm.static_file.extensions[]=Y`. If you are setting just one, command line `-d` is fine. Otherwise, for multiple settings, use a `.ini` file. -| `hhvm.static_file.files_match` | `Vector<string>` | *empty* | A list of file extensions that will have http transport headers added to them. The format of this setting is [below](#server-mode__static-file-files-match-format). You need a `pattern` and at least one `header`. **This setting is currently not retrievable via `ini_get()`**. This is not normally set. -| `hhvm.static_file.generators` | `Set<string>` | *empty* | Dynamic files that serve up static content. This is not normally set. You set them in the form of `hhvm.static_file.generators[]="/path/to"`. If you are setting just one, command line `-d` is fine. Otherwise, for multiple settings, use a `.ini` file. -| `hhvm.tiers` | `Object` | *empty* | COMING SOON to ini. Allows you to override settings based on various tier settings like CPU, machine name, etc. -| `hhvm.virtual_host`| `Object` | *empty* | You can map server domains as various [virtual hosts](https://en.wikipedia.org/wiki/Virtual_hosting) with a lot of settings described [below](#server-mode__virtual-host-format). You need at least a `prefix` or a `pattern`. **This setting is currently not retrievable via `ini_get()`**. - -### Static File Extension Defaults - -These are the default file extensions for `hhvm.static_file.extensions`: - -``` -array(11) { - ["zip"]=> - string(15) "application/zip" - ["jpeg"]=> - string(10) "image/jpeg" - ["html"]=> - string(9) "text/html" - ["css"]=> - string(8) "text/css" - ["gif"]=> - string(9) "image/gif" - ["mp3"]=> - string(10) "audio/mpeg" - ["png"]=> - string(9) "image/png" - ["tif"]=> - string(10) "image/tiff" - ["jpg"]=> - string(10) "image/jpeg" - ["tiff"]=> - string(10) "image/tiff" - ["txt"]=> - string(10) "text/plain" -} -``` - -### Static File Files Match Format - -This the ini format for `hhvm.static_file.files_match`: - -``` -hhvm.static_file.files_match[0][pattern] = "[regex](here)*" -hhvm.static_file.files_match[0][headers][] = "header1" -hhvm.static_file.files_match[0][headers][] = "header2" -``` - -### IP Block Map Format - -This is an example of the ini format for `hhvm.ip_block_map`. - -``` -hhvm.ip_block_map[0][location] = /endpoint -hhvm.ip_block_map[0][allow_first] = true -hhvm.ip_block_map[0][ip][allow][0] = 127.0.0.1 -hhvm.ip_block_map[0][ip][deny][0] = 8.32.0.0/24 -hhvm.ip_block_map[0][ip][deny][1] = aaaa:bbbb:cccc:dddd:eeee:ffff:1111::/80 -``` - -`allow_first` basically says whether you allow an ip by default or not. You can then have other endpoints with `[1]`, `[2]`, etc. - -### Satellite Format - -The options you can give for `hhvm.satellites` are: - -``` -Satellites { - NAME { - Type = RPCServer | InternalPageServer | DanglingPageServer - - Port = 0 # disabled - ThreadCount = 5 - - # only for RPCServer - MaxRequest = 500 - MaxDuration = 120 # in seconds - TimeoutSeconds = 30 # default to RequestTimeoutSeconds - RequestInitFunction = on_init - RequestInitDocument = filename - Password = authentication - Passwords { - * = password - } - # only for InternalPageServer - BlockMainServer = true - URLs { - * = pattern - } - } -} -``` - -This is an example of the ini format for `hhvm.satellites`. - -``` -hhvm.satellites[rpc][type] = RPCServer -hhvm.satellites[rpc][port] = 9999 -hhvm.satellites[rpc][request_init_document] = my/rpc/rpc.php -hhvm.satellites[rpc][request_init_function] = init_me -hhvm.satellites[rpc][password] = abcd0987 -hhvm.satellites[rpc][passwords][] = abcd0987 -hhvm.satellites[ips][type] = InternalPageServer -hhvm.satellites[ips][block_main_server] = false -hhvm.satellites[ips][urls][] = url/here -``` - -### Virtual Host Format - -The options you can give to `hhvm.virtual_host` are: - - -``` -VirtualHost { - NAME { - Disabled = false - Prefix = prefix. - Pattern = regex pattern - PathTranslation = html - CheckExistenceBeforeRewrite = true - ServerName = - ServerVariables { - name = value - } - Overwrite = { - [default][setting] = new value - } - - RewriteRules { - * { - pattern = regex pattern same as Apache's - to = target format same as Apache's - qsa = false - redirect = 0 (default: off) | 302 | 301 | other status code - - conditions { - * { - pattern = regex pattern to match - type = host | request - negate = false - } - } - } - } - - IpBlockMap { - # in same format as the IpBlockMap example above - } - - # Remove certain query string parameters from access log. - LogFilters { - * { - # regex pattern to match a URL - url = (empty means matching all URLs) - - # names of parameters to remove from query string - params = { - * = parameter name - } - - # alternatively, use regex pattern to replace with empty string. - pattern = (empty means hiding entire query string) - - # optionally, specify what values to replace with - value = (by default it's empty, removing the query parameter) - } - } - } -} -``` - -This is an example of the ini format for `hhvm.virtual_hosts`: - -``` -hhvm.server.allowed_directories[] = /var/www -hhvm.server.allowed_directories[] = /usr/bin -hhvm.virtual_host[flibtest][prefix] = my. -hhvm.virtual_host[flibtest][path_translation] = flib/_bin -hhvm.virtual_host[flibtest][server_name] = my.example.org -hhvm.virtual_host[flibtest][log_filters][0][url] = function/searchme -hhvm.virtual_host[flibtest][log_filters][0][params][0] = v -hhvm.virtual_host[flibtest][log_filters][0][params][1] = t -hhvm.virtual_host[flibtest][log_filters][0][params][2] = btoken -hhvm.virtual_host[flibtest][log_filters][0][params][3] = ptoken -hhvm.virtual_host[flibtest][log_filters][0][value] = INSERTED -hhvm.virtual_host[flibtest][log_filters][1][url] = property/searchme -hhvm.virtual_host[flibtest][log_filters][1][pattern] = #thePattern# -hhvm.virtual_host[flibtest][log_filters][1][value] = BETWEEN -hhvm.virtual_host[upload][prefix] = upload. -hhvm.virtual_host[upload][server_variables][TFBENV] = 8 -hhvm.virtual_host[upload][overwrite][server][allowed_directories][0] = /var/www -hhvm.virtual_host[upload][overwrite][server][allowed_directories][1] = /mnt -hhvm.virtual_host[upload][overwrite][server][allowed_directories][2] = /tmp -hhvm.virtual_host[upload][overwrite][server][allowed_directories][3] = /var/tmp/tap -hhvm.virtual_host[upload][overwrite][server][max_post_size] = 100MB -hhvm.virtual_host[upload][overwrite][server][upload][upload_max_file_size] = 100MB -hhvm.virtual_host[upload][overwrite][server][request_timeout_seconds] = 120 -hhvm.virtual_host[upload][path_translation] = html -hhvm.virtual_host[default][path_translation] = htm -hhvm.virtual_host[default][log_filters][0][url] = method/searchme -hhvm.virtual_host[default][log_filters][0][params][0] = q -hhvm.virtual_host[default][log_filters][0][params][1] = s -hhvm.virtual_host[default][log_filters][0][params][2] = atoken -hhvm.virtual_host[default][log_filters][0][params][3] = otoken -hhvm.virtual_host[default][log_filters][0][value] = REMOVED -hhvm.virtual_host[default][rewrite_rules][common][pattern] = /html/common/ -hhvm.virtual_host[default][rewrite_rules][common][to] = http://example.org -hhvm.virtual_host[default][rewrite_rules][common][qsa] = true -hhvm.virtual_host[default][rewrite_rules][common][redirect] = 301 -``` - -## Feature flags - -These settings enable various features in the runtime, including [Hack](/hack/)-specific features. - -| Setting | Type | Default | Description -|---------|------|---------|------------ -| `hhvm.enable_obj_destruct_call` | `bool` | `false` | If `false`, `__destruct()` methods will not be called on an object at the end of the request. This can be a performance benefit if your system and application can handle the memory requirements. Deallocation can occur all at one time. If `true`, then HHVM will run all `__destruct()` methods in the usual way. -| `hhvm.force_hh` | `bool` | `false` | If `true`, all code is treated as Hack code, even if it starts with `<?php`. This setting affects `hhvm.enable_xhp` by forcing it to be `true` as well. This setting affects `hhvm.hack.lang.ints_overflows_to_ints` and `hhvm.log.always_log_unhandled_exceptions` by being the default value for them when they are not explicitly set. This setting affects `hhvm.hack.lang.look_for_typechecker` and `hhvm.server.allow_duplicate_cookies` by being the opposite value for a default when they are not explicitly set. -| `hhvm.hack.lang.ints_overflow_to_ints` | `bool` | Value of `hhvm.force_hh` | Value of `hhvm.force_hh` | Don't check if integer arithmetic might overflow, just use asm intrinsics and do whatever the underlying processor would do, most likely a twos-complement wraparound. If disabled, then check for integer overflow, and promote up to a float if so. (Skipping the check is considerably faster.) -| `hhvm.hack.lang.look_for_typechecker` | `bool` | Opposite value of `hhvm.force_hh` | If enabled, make sure that Hack code is under a directory with a `.hhconfig` file, and error otherwise. -| `hhvm.enable_args_in_backtraces` | `bool` | `true` | If disabled, then arguments are not shown in PHP backtraces. -| `hhvm.enable_asp_tags` | `bool` | `false` | If enabled, then you can use `<% %>`. -| `hhvm.enable_hip_hop_experimental_syntax` | `bool` | `false` | Enables experimental syntax, including type hints for local variables and global variables. -| `hhvm.enable_numa` | `bool` | `false` | Enable [NUMA](https://en.wikipedia.org/wiki/Non-uniform_memory_access) integration. -| `hhvm.enable_numa_local` | `bool` | `false` | This causes all allocations from threads to be allocated on the local node (except for a few that have been explicitly marked interleaved). `hhvm.enable_numa` must be set to `true` for this to take affect. -| `hhvm.enable_short_tags` | `bool` | `false` | If enabled, this allows the `<?` tag. -| `hhvm.enable_xhp` | `bool` | `false` | If `true`, this will enable XHP support in PHP files. (XHP is always enabled in Hack files.) If `hhvm.force_hh` is set to `true`, then this setting is automatically `true`. -| `hhvm.enable_zend_compat` | `bool` | `false` | If `true`, this enable the support layer for Zend PHP extensions that we have directly [migrated to HHVM](https://github.com/facebook/hhvm/tree/master/hphp/runtime/ext_zend_compat) (e.g. FTP). -| `hhvm.authoritative_mode` | `bool` | `false` | If enabled, HHVM disallows constructs that are unavailable in [Repo Authoritative](/hhvm/advanced-usage/repo-authoritative) mode even when you are not in Repo Authoritative mode (i.e., when `hhvm.repo.authoritative` is `false`). - -## Logging - -| Setting | Type | Default | Description -|---------|------|---------|------------ -| `hhvm.log.access_log_default_format` | `string` | `%h %l %u %t \"%r\" %>s %b` | The access log format. if not specified, the default uses Apache access log formatting. -| `hhvm.log.admin_log.file` | `string` | `''` | For the admin server, this will be the location and name for its log file. -| `hhvm.log.admin_log.format` | `string` | `%h %t %s %U` | The admin access log format. -| `hhvm.log.admin_log.sym_link` | `string` | `''` | You can provide a symlink to the `hhvm.log.admin_log.file`. -| `hhvm.log.always_escape_log` | `bool` | `true` | By default, escape characters in the logs are escaped. Disable this to not escape them. -| `hhvm.log.always_log_unhandled_exceptions` | `bool` | `hhvm.force_hh` | Unhandled exceptions are HHVM fatal errors, and AlwaysLogUnhandledExceptions will make sure they get logged even if a user's error handler is installed for them. The default value is equivalent to what you set for `hhvm.force_hh`. -| `hhvm.log.drop_cache_chunk_size` | `int` | `1 << 20` (1 MB) | When dropping the cache, logging will happen after this many bytes have been written. -| `hhvm.log.file` | `string` | standard error (`stderr`) | The location of the HHVM error log file. If `hhvm.log.use_cronolog` is set, then this setting will be used as the cron output file. -| `hhvm.log.force_error_reporting_level` | `int` | `0` | A bitmask that will be ORed (`|`) with `hhvm.log.runtime_error_reporting_level` to determine the actual error reporting level. -| `hhvm.log.header` | `bool` | `false` | If enabled, the request header is logged. Header includes timestamp, process id, 34 thread id, request id (counted from 1 since the server started), message id (counted from 1 since request started) and extra header text from command line option. -| `hhvm.log.header_mangle` | `int` | `0` | This setting controls the logging of potentially malicious headers. If set to a value greater than 0, then HHVM will log one in every `n` (where `n` is the value of the setting) requests where a header collision has occurred. Such collisions almost certainly indicate a malicious attempt to set headers which are either set or filtered by a proxy. -| `hhvm.log.level` | `string` | `Warning` | The level of output to the log. From least to most verbose: `None`, `Error`, `Warning`, `Info`, `Verbose`. -| `hhvm.log.max_messages_per_request` | `int` | `-1` | Controls maximum number of messages each request can log. If positive, then that number will be the threshold. Otherwise, unlimited messages per request can be logged. -| `hhvm.log.native_stack_trace` | `bool` | `true` | Turn off to disable the logging of the native stack trace. There are two kinds of stacktraces: (1) C++ stacktrace, which is hex-encoded and printed on every line of logging right after header. These stacktraces can be translated into human readable frames by running "-m translate" with the compiled program. (2) PHP stacktrace from code injection. Generated C++ code injects stacktrace preparation code into every frame of functions and methods. -| `hhvm.log.no_silencer` | `bool` | `false` | If enabled, even when silencer (`@`) operator is used, still output errors. -| `hhvm.log.runtime_error_reporting_level` | `int` | `HPHP_ALL` | A numeric setting similar to [error_reporting](http://php.net/manual/en/errorfunc.constants.php) in PHP. See [below](#logging_error-reporting-levels) for the possible settings. -| `hhvm.log.sym_link` | `string` | `''` | You can provide a symlink to the `hhvm.log.file`. If `hhvm.log.use_cronolog` is set, then this setting will be used to create a symlink to the cron output file. -| `hhvm.log.use_cronolog` | `bool` | `false` | If enabled, this will switch to a rotating log paradigm via [`cronolog`](http://linux.die.net/man/1/cronolog). -| `hhvm.log.use_log_file` | `bool` | `true` | The default logging mechanism via the log file specified by `hhvm.log.file`. -| `hhvm.log.use_request_log` | `bool` | `false` | If enabled, requests are logged into a special file where the root of that file is specified `hhvm.sandbox.logs_root`. -| `hhvm.log.use_syslog` | `bool` | `false` | Also log to the system log (syslog). -| `hhvm.log.access` | `Map<string>` | *empty* | The location and format of explicit access logs. You set them in the form of `hhvm.log.access["file"]="format"`. If you are setting just one, command line `-d` is fine. Otherwise, for multiple settings, use a `.ini` file. **This setting is currently not retrievable via `ini_get()`** - -### Error Reporting Levels - -Here are the error reporting levels you can provide to `hhvm.log.runtime_error_reporting_level`. - -``` -ERROR = 1, -WARNING = 2, -PARSE = 4, // not supported -NOTICE = 8, -CORE_ERROR = 16, // not supported -CORE_WARNING = 32, // not supported -COMPILE_ERROR = 64, // not supported -COMPILE_WARNING = 128, // not supported -USER_ERROR = 256, -USER_WARNING = 512, -USER_NOTICE = 1024, -STRICT = 2048, -RECOVERABLE_ERROR = 4096, -PHP_DEPRECATED = 8192, // DEPRECATED conflicts with macro definitions -USER_DEPRECATED = 16384, - -/* - * PHP's fatal errors cannot be fed into error handler. HipHop can. We - * still need "ERROR" bit, so old PHP error handler can see this error. - * The extra 24th bit will help people who want to find out if it's - * a fatal error only HipHop throws or not. - */ -FATAL_ERROR = ERROR | (1 << 24), // 16777217 - -PHP_ALL = ERROR | WARNING | PARSE | NOTICE | CORE_ERROR | CORE_WARNING | - COMPILE_ERROR | COMPILE_WARNING | USER_ERROR | USER_WARNING | - USER_NOTICE | RECOVERABLE_ERROR | PHP_DEPRECATED | USER_DEPRECATED, - -HPHP_ALL = PHP_ALL | FATAL_ERROR, - -/* Errors that can be upgraded to E_USER_ERROR. */ -UPGRADEABLE_ERROR = WARNING | USER_WARNING | NOTICE | USER_NOTICE -``` - -## Admin Server - -The [admin server](/hhvm/advanced-usage/admin-server) allows the administrator of the HHVM server to query and control the HHVM server process. - -| Setting | Type | Default | Description -|---------|------|---------|------------ -| `hhvm.admin_server.password` | `string` | `''` | A password required for all requests to the admin server, other than the index. Is passed to the request as the `auth` request var. -| `hhvm.admin_server.port` | `int` | `0` | The port the admin server should listen on. If set to 0, the admin server is not started. -| `hhvm.admin_server.thread_count` | `int` | `1` | The number of threads the admin server should use. - -## CLI Server - -The [CLI server](/hhvm/advanced-usage/CLI-server) allows you to run command line scripts on a running HHVM server. This means the translation cache can persist between runs of your scripts. - -| Setting | Type | Default | Description -|---------|------|---------|------------ -| `hhvm.use_remote_unix_server` | `string` | `no` | Enable the use of the CLI server. -| `hhvm.unix_server_path` | `string` | `''` | The path to the unix socket for the CLI server. -| `hhvm.unix_server_workers` | `int` | CPU cores | The number of worker threads the CLI server will allow. -| `hhvm.unix_server_quarantine_apc` | `bool` | `false` | Quarantine APC from the scripts being run. -| `hhvm.unix_server_quarantine_units` | `bool` | `false` | Quarantine the loaded units from the scripts being run on a per user bases. -| `hhvm.unix_server_verify_exe_access` | `bool` | `false` | Checks units are readable by client before executing them on the server. -| `hhvm.unix_server_fail_when_busy` | `bool` | `false` | Fail if there are no available workers. -| `hhvm.unix_server_allowed_users` | `Vector<string>` | *empty* | Users allowed to use the CLI server. -| `hhvm.unix_server_allowed_groups` | `Vector<string>` | *empty* | Groups allowed to use the CLI server. - -## Debug Settings - -These settings are useful when you are debugging actual HHVM issues. - -| Setting | Type | Default | Description -|---------|------|---------|------------ -| `hhvm.debug.clear_input_on_success` | `bool` | `true` | Automatically delete requests that had a 200 response code when recording input. This allows for the capturing of error-prone requests without cluttering up with good ones. -| `hhvm.debug.core_dump_email` | `string` | `''` | When HHVM produces a core dump, if this is set to an email address, then an email will be sent with the core dump information. -| `hhvm.debug.core_dump_report` | `bool` | `true` | If enabled, HHVM will generate a core dump report as necessary. -| `hhvm.debug.core_dump_report_directory` | `string` | `/tmp` | When a core dump is produced, it will be put in this directory. -| `hhvm.debug.native_stack_trace` | `bool` | `false` | If enabled, a native static trace will be produced. -| `hhvm.debug.profiler_output_dir` | `string` | `/tmp` | Building with GOOGLE_CPU_PROFILER set lets you collect profiles from the server or from the command line. This option lets you control where the profiles get created. -| `hhvm.debug.record_input` | `bool` | `false` | If enabled, record bad HTTP requests to a file `/tmp/hphp_request_XXXXXX`. -| `hhvm.debug.server_error_message` | `bool` | `false` | If enabled, turn on error messages in HTTP responses with detailed stacktrace information. Send the error message to the output stream - corresponds to `display_errors` in PHP. -| `hhvm.debug.simple_counter.sample_stack_count` | `int` | `0` | HHVM has an implementation of a set of [request-local named counters](https://github.com/facebook/hhvm/commit/e3896255cb329bfe09dee9e0e9f3fa19fcd7abd3). This setting controls how many samples of the named counter should there be. -| `hhvm.debug.simple_counter.sample_stack_depth` | `int` | `5` | For each sample stack from `hhvm.debug.simple_counter.sample_stack_count`, this controls the depth of each sample. -| `hhvm.dump_ast` | `bool` | `false` | If enabled, the AST will be dumped to `stdout`. -| `hhvm.dump_bytecode` | `int` | `0` | If positive, before executing a PHP file, dump out its HHBC along with some interesting metadata, then continue executing the file. If `1` then the user PHP bytecode is dumpted. If `2` then user PHP and System library information is dumped. Useful only for debugging. -| `hhvm.dump_hhas` | `bool` | `false` | If enabled, instead of executing a PHP file, dump out an hhas (HHVM Assembly) file and exit. Useful for debugging, or if you need to directly write some hhas and need an easy way to get started. -| `hhvm.dump_ring_buffer_on_crash` | `int` | `0` | If positive, then when HHVM crashes, the ring buffer will be dumped. -| `hhvm.dump_tc` | `bool` | `false` | If enabled, dump contents of translation cache when executing program from the command line. -| `hhvm.dump_tc_anchors` | `bool` | `false` | If enabled, dump the translation cache anchors. -| `hhvm.keep_perf_pid_map` | `bool` | `false` | If enabled, don't delete the perf pid map. -| `hhvm.perf_data_map` | `bool` | `false` | If enabled, generate a perf data map. -| `hhvm.perf_pid_map` | `bool` | `true` | If enabled, generate a perf pid map. - -## Sandbox - -A sandbox in HHVM is a set of configuration options (document root, log file path, etc.) that can be used to serve your web application. - -Here are a few **important** points: - -- The sandbox configuration file must end in `.hdf` or `.hphp`. Most people name it `.hphp`. -- Having a configuration file end in `.ini` is currently broken, but a fix is being worked on now. When HDF is removed in favor of INI, this will be fixed. -- A user is always appended to `hhvm.sandbox.home`. So if you set that setting to `/home`, it will end up being `/home/user`. Thus the `hhvm.sandbox.conf_file` will end up having an absolute path of `/home/user/.hphp`. -- The sandbox pattern assumes that you have valid URLs that can be associated with that pattern. You would need to have those URLs bound in something like `/etc/hosts` (e.g., `127.0.0.1 user-another_site.localhost.com`). -- If you do not specify a sandbox name in the URL, it assumes the default sandbox. e.g., if you type or `curl` `user.localhost.com`, that will assume your default sandbox. -- If you enable `hhvm.sandbox.from_common_root`, make sure you have running code available from that root, or that root prepended by the value of `hhvm.sandbox.directories_root`, if you have that set as well. -- If you are using the HHVM builtin webserver [proxygen](/hhvm/basic-usage/proxygen), as long as you are running the server from a location where there is access to your sandbox (e.g., the root of a sandbox directory), all of your sandboxes URLs should be available to you for testing. - -Below is a general configuration setup for a sandbox that you can use as a template. - -*ini file* - -`user-another_site.localhost.com` would fit the `hhvm.sandbox.pattern` pattern. - -``` -hhvm.sandbox.sandbox_mode = 1 -hhvm.sandbox.home=/home -hhvm.sandbox.conf_file=.hphp -hhvm.sandbox.pattern=([^-]*(-[^-]*)?).localhost.com -``` - -*Sandbox configuration file ~/.hphp* - -If you have `hhvm.sandbox.home set`, `default.xxx` can be relative to that directory (remembering that a `user` is appended to what you set as `hhvm.sandbox.home`). For example, below, if we had `hhvm.sandbox.home = /home`, then we could set `default.path` to `sites/www`. - -The `default.ServerVars.ANY_SERVER_VARIABLE=1` is just an example. - -``` -default.path = /home/user/sites/www -default.log = /home/user/sites//error_log -default.accesslog = /home/user/logs/access_log -default.ServerVars.ANY_SERVER_VARIABLE=1 - -another_site.path = /home/user/sites/another-site -another_site.log = /home/user/sites/another-site/logs/error_log -another_site.accesslog = /home/user/sites/another-site/logs/access_log -``` - -| Setting | Type | Default | Description -|---------|------|---------|------------ -| `hhvm.sandbox.sandbox_mode` | `bool` | `false` | If enabled, sandbox mode is turned on; generally coincides with turning on [HHVM server debugging](#debugger). -| `hhvm.sandbox.home` | `string` | `''` | The home directory of your sandbox. e.g., If this is set to `/home`, then your sandbox path will be something like `/home/joelm/`. -| `hhvm.sandbox.conf_file` | `string` | `''` | The file which contains sandbox information like the path to the default sandbox, the path to other sandboxes, log paths, etc. You can use this file in conjunction with some of some of the other specific sandbox options. For example, if `hhvm.sandbox.home` is set, then this setting is *relative* to that path. -| `hhvm.sandbox.pattern` | `string` | `''` | The URL pattern of your sandbox host. It is a generally a regex pattern with at least one capture group. For example `www.[user]-[sandbox].[machine].yourdomain.com` or `www.([^-]*(-[^-]*)?).yourdomain.com` -| `hhvm.sandbox.from_common_root` | `bool` | `false` | If enabled, your sandboxes will be created from a common root path. This root path is based upon the `hhvm.sandbox.pattern` that you specify and the value of it will be the root string before the first `.` in the pattern. If you have a pattern like `([^-]*(-[^-]*)?).localhost.com` which maps to a sandbox at `user-another_site.localhost.com`, the root that is established by enabling this setting is `/joelm-another_site`. This setting as `true` supersedes any setting you have for `hhvm.sandbox.conf_file`. -| `hhvm.sandbox.directories_root` | `string` | `''` | If you have `hhvm.sandbox.from_common_root` enabled, this value will be prepended to your common root. -| `hhvm.sandbox.logs_root` | `string` | `''` | If you have `hhvm.sandbox.from_common_root` enabled, this value will be prepended to your common root. -| `hhvm.sandbox.fallback` | `string` | `''` | If for some reason your home path in `hhvm.sandbox.home` cannot be accessed, this will be your fallback to set as your home path. -| `hhvm.sandbox.server_variables` | `map` | *empty* | Any server variables that you want accessible when running your sandbox. - -## Debugger - -A sandbox is commonly used in conjunction with [debugging](#debugger) to debug HHVM in [server mode](/hhvm/basic-usage/server). When you connect the debugger to a server mode process, you will be given the option of a sandbox on which to attach the debugger. The first option you will always see (and attach to by default) is the dummy sandbox, which has no document root. It is primarily used for real-time evaluation of code from the debugger prompt. - -These options are used to allow you to use the `hphpd` debugger remotely via a sandbox. HHVM must be running in [server mode](/hhvm/basic-usage/server), as there needs to be a server process on which to attach. - -These are the common `.ini` file options to set to enable HHVM to start a debugger in server mode. - -``` -hhvm.sandbox.sandbox_mode=1 -hhvm.sandbox.home=/home -hhvm.sandbox.conf_file=.hphp -hhvm.sandbox.pattern="([^-]*(-[^-]*)?)\.localhost\.com" -hhvm.debugger.enable_debugger = 1 -hhvm.debugger.enable_debugger_server = 1 -hhvm.debugger.default_sandbox_path = /path/to/your/sandbox -``` - -If you run your server as `hhvm -m server -c this.ini` and in another terminal, type `hhvm -m debug -h localhost`, you will see: - -``` -Welcome to HipHop Debugger! -Type "help" or "?" for a complete list of commands. - -Connecting to localhost:8089... -Attaching to user's default sandbox and pre-loading, please wait... -localhost> m l - 1 user's default sandbox at /home/user/sites/www/ -``` - -To start debugging: - -``` -localhost> break start -break start -Breakpoint 1 set start of request -localhost> continue -continue -``` - -Then you can make a web request via your browser or `curl` to your sandbox URL. You can set breakpoints in your sandbox code to stop at certain places of execution as well. - -If you want to debug another sandbox instead of the default, you can explicitly specify the sandbox: - -``` -hhvm -m debug -h localhost --debug-sandbox another_site -``` - - -| Setting | Type | Default | Description -|---------|------|---------|------------ -| `hhvm.debugger.enable_debugger` | `bool` | `false` | You must set this to try in order for HHVM to listen to connections from the debugger. -| `hhvm.debugger.enable_debugger_server` | `bool` | `false` | This option is generally set in conjunction with `hhvm.debugger.enable_debugger` and actually allows for the listening to connections and remote debugging. -| `hhvm.debugger.default_sandbox_path` | `string` | `''` | Path to source files; similar to [`hhvm.server.source_root`](#common-options). -| `hhvm.debugger.disable_ipv6` | `bool` | `false` | If enabled, the debugger will only be able to communicate with ipv4 addresses (AF_INET). -| `hhvm.debugger.enable_debugger_color` | `bool` | `true` | Disable this if you do not want color in the debugger. -| `hhvm.debugger.enable_debugger_prompt` | `bool` | `true` | Disable this if you do not want a debugger prompt to be shown. -| `hhvm.debugger.enable_debugger_usage_log` | `bool` | `false` | *Currently this is only an internal setting*. -| `hhvm.debugger.port` | `int` | `8089` | The port on which debugger clients may connect. -| `hhvm.debugger.rpc.default_auth` | `string` | `''` | The password to be able to debug the HHVM server in RPC mode. -| `hhvm.debugger.rpc.default_port` | `int` | `8083` | The port on which commands will be sent to the server via RPC. -| `hhvm.debugger.rpc.default_timeout` | `int` | `30`| The timeout for commands to be available on the RPC port. -| `hhvm.debugger.rpc.host_domain` | `string` | `''` | The domain where your RPC server is hosted. -| `hhvm.debugger.signal_timeout` | `int` | `1` | The amount of time the debugger waits for a signal from the client before sending to a default dummy sandbox. -| `hhvm.debugger.startup_document` | `string` | `''` | The file that is executed before any other, when the server starts. Does not have to be the same your [default document](#common-options). Similar to `hhvm.server.startup_document`. -| `hhvm.bypass_access_check` | `bool` | `false` | If enabled, forces the debugger bypass access checks on class members. -| `hhvm.script_mode` | `bool` | `false` | If enabled, then the debugger is debugging in script mode. -| `hhvm.tutorial` | `bool` | `false` | If enabled, you can go through the debugger tutorial. -| `hhvm.tutorial.visited` | `bool` | `false` | If enabled, this will tell the debugger you have already seen the tutorial. -| `hhvm.print_level` | `int` | `5` | The amount of printing you want in the debugger. -| `hhvm.source_root` | `string` | `''` | If explicitly set, then the debugger will look for source code there. Otherwise, it is where the debugger is running from. -| `hhvm.small_step` | `bool` | `false` | If enabled, small steps will be used instead of entire lines. -| `hhvm.stack_args` | `bool` | `true` | If disabled, then stack arguments will not be shown in the debugger. -| `hhvm.max_code_lines` | `int` | `-1` | If positive, then limit the code shown after a step to that number of code lines. If `0`, then do not show any code after a step or next. If `-1`, then just show the default number of lines. -| `hhvm.utf8` | `bool` | `true` | If enabled, then use UTF8 by default. -| `hhvm.short_print_char_count` | `int` | `200` | Display at most count characters when doing `= command`. -| `hhvm.macros` | `Map` | *empty* | A custom list of macros that you want to be able to run in the debugger. You set them in the form of `hhvm.macros[name][]="cmd1"`, `hhvm.macros[name][]="cmd2"`, etc.. If you are setting just one, command line `-d` is fine. Otherwise, for multiple settings, use a `.ini` file. -| `hhvm.never_save_config` | `bool` | `false` | If enabled, then your debugger configuration settings will not be saved. - -## Error Handling - -These settings are used to help set or throttle certain errors/warnings/etc. that may arise in your PHP or Hack code. - -| Setting | Type | Default | Description -|---------|------|---------|------------ -| `hhvm.error_handling.call_user_handler_on_fatals` | `bool` | `false` | Call a callback installed via `set_error_handler()` when a fatal error occurs. -| `hhvm.error_handling.max_serialized_string_size` | throw exception if unserializing a string greater than this amount | `64 * 1024 * 1024` (64 MB) | -| `hhvm.error_handling.no_infinite_recursion_detection` | `bool` | `false` | If enabled, do not raise an error if infinite recursion is detected. -| `hhvm.error_handling.notice_frequency` | `int` | `1` | Log every N notices, where N is this number. If the value is `<=0`, then no notices are logged. -| `hhvm.error_handling.throw_exception_on_bad_method_call` | `bool` | `true` | If enabled, throw an error if calling a method on a non-object. -| `hhvm.error_handling.upgrade_level` | `int` | `0` | Bitmask of errors to upgrade to `E_USER_ERROR`. Only `E_WARNING`, `E_USER_WARNING`, `E_NOTICE`, and `E_USER_NOTICE` are supported. -| `hhvm.error_handling.warning_frequency` | `int` | `1` | Log every N warnings, where N is this number. If the value is `<=0`, then no warnings are logged. - -## XML - -The following are settings that you can use for `libxml` or `simplexml`, as specified. - -| Setting | Type | Default | Description -|---------|------|---------|------------ -| `hhvm.libxml.ext_entity_whitelist` | `string` | `'data'` | Loading of external entities in the libxml extension is disabled by default for security reasons. It can be re-enabled on a per-protocol basis with this setting. It is a comma separated list of protocols. The common ones are `file`, `http`, `compress.zlib`. An example of how the setting is set is: `hhvm._libxml.ext_entity.whitelist=file,http`. **This setting is currently not retrievable via `ini_get()`**. -| `hhvm.simple_xml.empty_namespace_matches_all` | `bool` | `false` | If enabled, an empty XML namespace matches all namespaces. - -## JIT Settings - -These settings can allow fine-grain tuning of HHVM's [JIT](https://en.wikipedia.org/wiki/Just-in-time_compilation) [compiler](http://hhvm.com/blog/2027/faster-and-cheaper-the-evolution-of-the-hhvm-jit). - -The [hacker's guide](https://github.com/facebook/hhvm/blob/master/hphp/doc/hackers-guide/jit-core.md) goes more in depth nin how the JIT works as well. - -| Setting | Type | Default | Description -|---------|------|---------|------------ -| `hhvm.jit` | `bool` | `true` | Enables the JIT compiler. This is turned on by default for all supported distributions. Times when you might want to turn this off is for a [short running script](/hhvm/FAQ/faq#why-is-my-code-slow-at-startup) that may not make use of the JIT. -| `hhvm.jit_always_interp_one` | `bool` | `false` | -| `hhvm.jit_disabled_by_hphpd` | `bool` | `false` | If enabled, the JIT is disabled in the debugger. -| `hhvm.jit_enable_rename_function` | `bool` | `false` | If `false`, `fb_rename_function()` will throw a fatal error. And HHVM knowing that functions cannot be renamed can increase performance. -| `hhvm.jit_global_translation_limit` | `int` | `-1` | How often the JIT does translation before falling back to interpreted code. The default is to always JIT. -| `hhvm.jit_max_request_translation_time` | `int` | `-1` | Sets a maximum number of microseconds to spend per request translating. This is useful for deployments that can't rely on a warm-up script. Default is an unlimited amount of time. Requires `hhvm.jit_timer` to be enabled. -| `hhvm.jit_keep_dbg_files` | `bool` | `false` | If enabled, elf writer based debug files will be kept. -| `hhvm.jit_llvm` | `int` | `0` | If enabled, then use the experimental LLVM backend, see [this blog post](http://hhvm.com/blog/10205/llvm-code-generation-in-hhvm) for more information. If `0`, LLVM is not used. If `1`, LLVM is used for TransOptimize translations. If `2`, LLVM is used for all translations. -| `hhvm.jit_loops` | `bool` | `true` | Disable this if you don't want loops to be compiled by the JIT, but rather interpreted. -| `hhvm.jit_max_translations` | `int` | `12` | Limits the number of translations allowed per `srckey`, and once this limit is hit any further retranslation requests will result in a call out to the interpreter. -| `hhvm.jit_no_gdb` | `bool` | `true` | If set to `false`, the the JIT will be enabled when running HHVM in GDB. -| `hhvm.jit_profile_interp_requests` | `int` | `1` or `11` | Profile interpreted requests per this number of times. For the defaults, if HHVM was compiled in debug mode, then `1`. Otherwise (e.g., release mode) `11`. -| `hhvm.jit_profile_record` | `bool` | `false` | If enabled, HHVM will record a profile of requests. -| `hhvm.jit_profile_requests` | `int` | `2147483648` or `500` | The number of requests to profile. For the defaults, if HHVM was compiled in debug mode, then `2147483648`; otherwise (e.g., release mode) `500`. -| `hhvm.jit_pseudomain` | `bool` | `true` | Whether or not to JIT pseudomains (code that doesn't exist inside a class). This is `false` by default on ARM. -| `hhvm.jit_region_selector` | `string` | `tracelet` | The regions of code that will be translating the bytecode to machine code. The default is is single basic blocks, or tracelets. Other options are `method` and `none`. -| `hhvm.jit_relocation_size` | `int` | `1048576` (1 MB) | The size of code relocation. -| `hhvm.jit_require_write_lease` | `bool` | `false` | The write Lease guards write access to the translation caches, srcDB, and TransDB. The term "lease" is meant to indicate that the right of ownership is conferred for a long, variable time: often the entire length of a request. If a request is not actively translating, it will perform a "hinted drop" of the lease: the lease is unlocked but all calls to `acquire(false)`` from other threads will fail for a short period of time. -| `hhvm.jit_retranslate_all_request` | `int` | `3000` or `0` | The number of profile requests, before retranslating all code into optimized translations. -| `hhvm.jit_stress_lease` | `bool` | `false` | If HHVM was compiled in debug mode, the you can enable this setting to cede the write lease half the time. -| `hhvm.jit_target_cache_size` | `int` | `67108864` | The size, in bytes, of the target cache. -| `hhvm.jit_timer` | `bool` | `true` | Timer is used to track how much CPU time we spend in the different stages of the jit. Typical usage starts and stops timing with construction/destruction of the object, respectively. The stop() function may be called to stop timing early, in case it's not reasonable to add a new scope just for timing. -| `hhvm.jit_trans_counters` | `bool` | `false` | If enabled, JIT translation profiling counters will be enabled. -| `hhvm.jit_unlikely_dec_ref_percent` | `int` | `10` | The percentage of ref counted types to destroy. -| `hhvm.jit_use_vtune_api` | `bool` | `false` | If enabled, the VTune API will be used for profiling. - -### JIT Translation Cache Size - -The translation cache stores the JIT'd code. It's split into several sections depending on how often the code is (or is expected to be) executed. The sum of all the bits has to be less than 2GB. - -| Setting | Type | Default | Description -|---------|------|---------|------------ -| `hhvm.jit_a_size` | `int` | `62914560` (60 MB) | Size in bytes of main translation cache. -| `hhvm.jit_a_cold_size` | `int` | `25165824` (24 MB) | Size of cold code cache. Code that is unlikely to be executed is deemed cold. (Recommended: 0.5x `hhvm.jit_a_size`). -| `hhvm.jit_a_frozen_size` | `int` | `41943040` (40 MB) | Size of extremely cold code cache. Code that is almost never executed, or executed once and then freed up, is deemed frozen. (Recommended: 1x `hhvm.jit_a_size`). -| `hhvm.jit_a_hot_size` | `int` | `0` | Size of hot code cache. (Enabled only in [RepoAuthoritative mode](/hhvm/advanced-usage/repo-authoritative) when `hhvm.repo.authoritative` is `true`). -| `hhvm.jit_a_prof_size` | `int` | `67108864` (64 MB) | Size of profiling code cache. (Recommended: 1x `hhvm.jit_a_size`). -| `hhvm.jit_a_max_usage` | `int` | `62914560` (60 MB) | Maximum amount of code to generate. (Recommended: 1x `hhvm.jit_a_size`). -| `hhvm.jit_global_data_size` | `int` | `15728640` (15 MB) | Size of the global data cache. -| `hhvm.tc_num_huge_cold_mb` | `int` | `4` | The number of megabytes of cold regions to hold in the translation cache. -| `hhvm.tc_num_huge_hot_mb` | `int` | `16` | The number of megabytes of hot regions to hold in the tranlsation cache. - -### PGO - -These are settings of the JIT for [Profile Guided Optimizations](https://en.wikipedia.org/wiki/Profile-guided_optimization). - -| Setting | Type | Default | Description -|---------|------|---------|------------ -| `hhvm.jit_pgo` | `bool` | `true` | Turn on PGO in the JIT. This is disabled by default for ARM. -| `hhvm.jit_pgo_hot_only` | `bool` | `false` | If enabled, only profile hot sections of code. -| `hhvm.jit_pgo_region_selector` | `string` | `hotcfg` | The regions to translate during PGO. The default are hot sections of code. -| `hhvm.jit_pgo_release_vv_min_percent` | `int` | `10` | The minimum percentage of extra args, varenvs and locals that will be released. -| `hhvm.jit_pgo_threshold` | `int` | `2` or `5000` | The maximum amount of PGO translations. For the defaults, `2` when HHVM is compiled in debug mode; `5000` otherwise. -| `hhvm.jit_pgo_use_post_conditions` | `bool` | `true` | For profiling translations, grab the postconditions to be used for region selection whenever we decide to retranslate. - -## Garbage Collector Settings - -These are settings for the automated garbage collector. To enable the automated GC, set `hhvm.enable_gc` to true. - -| Setting | Type | Default | Description -| ------- | ---- | ------- | ----------- -| `hhvm.enable_gc` | `bool` | `HHVM_EAGER_GC` | Enable the garbage collector. -| `hhvm.eager_gc` | `bool` | `HHVM_EAGER_GC` | Debugging tool. Run the GC as often as possible. Only supported in Debug builds. -| `hhvm.filter_gc_points` | `bool` | `true` | Limit eager gc runs to once per surprise point. -| `hhvm.quarantine` | `bool` | `HHVM_EAGER_GC` | Debugging tool. Instead of freeing memory, mark it as a 'Hole', fill with 0x8a, and leak. -| `hhvm.gc_sample_rate` | `int` | `0` | -| `hhvm.gc_min_trigger` | `int` | `64 << 20` | -| `hhvm.gc_trigger_pct` | `double` | `0.5` | - - -## APC Settings - -These are custom HHVM settings to the [Alternative PHP Cache (APC)](http://php.net/manual/en/book.apc.php). - -| Setting | Type | Default | Description -|---------|------|---------|------------ -| `hhvm.server.apc.expire_on_sets` | `bool` | `false` | If enabled, this will turn on item purging on expiration. And it is done once per `hhvm.server.apc.purge_frequency` of sets. -| `hhvm.server.apc.purge_frequency` | `int` | `4096` | Expired items will be purged every this many APC sets. -| `hhvm.server.apc.purge_rate` | `int` | `-1` | Evict at most this many items on each purge. No limit if `-1`. - -## Repo Authoritative - -When using HHVM's [Repo-Authoritative](/hhvm/advanced-usage/repo-authoritative) mode, these are the settings that help configure its use. - -| Setting | Type | Default | Description -|---------|------|---------|------------ -| `hhvm.repo.authoritative` | `boolean` | `false` | If `true`, you are specifying that you will be using HHVM's repo- authoritative mode to serve requests. -| `hhvm.repo.path` | `string` | `""` | The path to the `hhvm.hhbc` file created when you compiled a repo-authoritative repo. (before HHVM 4.115: `hhvm.repo.central.path`) -| `hhvm.repo.commit` | `bool` | `true` | If enabled, this will commit newly emitted units to the repo. -| `hhvm.repo.debug_info` | `bool` | `true` | If enabled, the full source locations will be stored in the repo; otherwise, only line numbers will be stored. -| `hhvm.repo.journal` | `string` | `delete` | If `delete`, then delete the on-disk SQLite journal upon each successful transaction commit. If `memory`, then store the SQLite journal in memory. `delete` is the safer mode to use. -| `hhvm.repo.local.mode` | `string` | `r-` | `rw` to use the local repo for reading and writing (if file permissions allow). `r-` to use the local repo for reading (if it exists and is readable). `--`` to completely ignore the local repo, even if it exists. -| `hhvm.repo.local.path` | `string` | `''` | `hhvm.repo.loca.path`or the environment variable `HHVM_REPO_LOCAL_PATH` (the former takes precedence) can be used to specify where the local repo is. If unspecified, then the local repo is `path/to/cli.php.hhbc` in [cli](/hhvm/basic-usage/command-line) mode or `<cwd>/hhvm.hhbc` in [server](/hhvm/basic-usage/server) mode. -| `hhvm.repo.mode` | `string` | `readonly` | `local` to write eval units to the local repo if it is writeable; otherwise write to the central repo. `central` to write eval units to the central repo. `readonly` to not write eval units to a repo, but still search for them in repos. -| `hhvm.repo.preload` | `bool` | `false` | If enabled, preload all units from the repo in parallel during startup. -| `hhvm.disable_some_repo_auth_notices` | `bool` | `true` | Make the repo authoritative notices you receive less verbose. - -## Statistics - -These settings allow you to collect various statistics for various parts of the runtime, from web statistics and mysql to memory and the [profiler](https://github.com/facebook/hhvm/blob/master/hphp/doc/profiling.md). - -| Setting | Type | Default | Description -|---------|------|---------|------------ -| `hhvm.stats.enable` | `bool` | `false` | Set this to `true` in order to enable stats collection. -| `hhvm.stats.apc` | `bool` | `false` | Set this to `true` to enable collection APC statistics. -| `hhvm.stats.enable_hot_profiler` | `bool` | `true` | Enable the hot profiler and [xhprof](http://php.net/manual/en/book.xhprof.php). -| `hhvm.stats.max_slot` | `int` | `72` (12 hours) | For each page, we collect stats by time slots. Each time slot is configured as `hhvm.stats.slot_duration` seconds and server internally keeps the number of slots specified by this setting. Inside each slot, we keep a set of stats by page or URL. These stats include 3 built-in ones ("url", "code" and "hit") and many key-value pairs defined by different parts of the system. -| `hhvm.stats.memory `| `bool` | `false` | Set this to `true` to enable memory statistics. -| `hhvm.stats.network_io` | `bool` | `false` | Set this to `true` to enable network I/O statistics and status. -| `hhvm.stats.profiler_max_trace_buffer` | `int` | `0` | The maximum size of a trace buffer in the profiler; if `0`, there is no maximum. -| `hhvm.stats.profiler_trace_buffer` | `int`| `2000000` | The size of the profiler trace buffer array. -| `hhvm.stats.profiler_trace_expansion` | `double` | `1.2` | How much bigger to make the profiler trace buffer array when it gets full. `hhvm.stats.profiler_trace_buffer` * this setting. -| `hhvm.stats.slot_duration` | `int` | `600` (seconds) | How long each slot described in `hhvm.stats.max_slot` is kept. -| `hhvm.stats.sql` | `bool` | `false` | If set to `true`, this will enable the collection of MySQL connection statistics. -| `hhvm.stats.sql_table` | `bool` | `false` | If set to `true`, this will enable the collection of MySQL table statistics. -| `hhvm.stats.web` | `bool` | `false` | If set to `true`, this will enable the collection of web/server statistics. -| `hhvm.stats.xsl` | `string` | `''` | Stats are written as XML. If this is set to something non-empty, the XSL used for the XML is referred to by that setting. -| `hhvm.stats.xsl_proxy` | `string` | `''` | Stats are written as XML. If this is set to somehing non-empty, the XSL proxy used for the XML is referred to by that setting. - -## Resource Limits - -These are resource limit settings such as how often to check maximum memory and the default socket timeout. - -| Setting | Type | Default | Description -|---------|------|---------|------------ -| `hhvm.resource_limit.core_file_size` | `int` | `0` | If set to something `> 0`, then this is the maximum size of a core dump file. If `0`, the no core dumps are created. -| `hhvm.resource_limit.drop_cache_cycle` | `int` | `0` | If set to something `> 0`, then this is how often the disk cache is dropped. -| `hhvm.resource_limit.max_rss` | `int` | `0` | If set to something `> 0`, then this is the maximum amount of memory (in bytes) of the HHVM process should get. -| `hhvm.resource_limit.max_rss_polling_cycle` | `int` | `0` | If set to something `> 0`, then this is how often to check whether we are hitting our `hhvm.resource_limit.max_rss` limit. -| `hhvm.resource_limit.max_sql_row_count` | `int` | `0` | If set to something `> 0`, then this is the maximum number of rows that will be fetched at any given time. -| `hhvm.resource_limit.serialization_size_limit` | `int` | `2146435072` (~2 GB) | The maximum size of a serialized string. -| `hhvm.resource_limit.socket_default_timeout` | `int` | `60` | The amount of time (in seconds) before an unused socket times out. - -## Regular Expressions - -These are the settings you can toggle for HHVM's [PCRE](http://www.pcre.org/) implementation. - -| Setting | Type | Default | Description -|---------|------|---------|------------ -| `hhvm.preg.backtrace_limit` | `int` | `1000000` | The maximum bind length a call to something like `preg_replace_callback()` can make. -| `hhvm.preg.error_log` | `bool` | `true` | If a PRCE error occurs, then it will be logged if this is enabled. -| `hhvm.preg.recursion_limit` | `int` | `100000` | The maximum recursion limit for PCRE. Setting this value too high could cause the utilization of all of the process stack. -| `hhvm.pcre_cache_type` | `string` | `static` | May be `static`, for a very fast cache which never evicts, `lru`, for a cache which evicts the least-recently used item when full, or `scalable` for a cache which is slightly slower than `lru` at low concurrency but much faster for a high-concurrency tight-loop workload. -| `hhvm.pcre_table_size` | `int` | `0` | The number of patterns which can be stored in the PCRE cache. - -## MySQL - -These setting control the behavior of the HHVM MySQL extension. - -| Setting | Type | Default | Description -|---------|------|---------|------------ -| `hhvm.mysql.typed_results`| `bool` | `true` | Zend returns strings and `null` only for MySQL results, not integers or floats. HHVM return ints (and, sometimes, actual doubles). This behavior can be disabled by setting this to `false`. -| `hhvm.mysql.slow_query_threshold` | `int` | `1000` | In milliseconds, log slow queries as errors. -| `hhvm.mysql.read_only` | `bool` | `false` | If enabled, the database is read only. -| `hhvm.mysql.read_timeout` | `int` | `60000` | How long, in milliseconds, before a read query times out. -| `hhvm.mysql.connect_timeout` | `int` | `1000` | How long, in milliseconds, before a connection times out. -| `hhvm.mysql.wait_timeout` | `int` | `-1` | If positive, how long, in milliseconds, before a wait timeout. -| `hhvm.mysql.kill_on_timeout` | `bool` | `false` | If enabled, when a query takes long time to execute on server, client has a chance to kill it to avoid extra server cost. -| `hhvm.mysql.max_retry_open_on_fail` | `int` | `1` | How many times to retry opening a connection if the first time failed. -| `hhvm.mysql.max_retry_query_on_fail` | `int` | `1` | How many times to retry a query if the first time failed. -| `hhvm.mysql.socket` | `string` | `''` | Default location to look for `mysql.sock`. - -## Advanced Settings - -These are settings that generally won't be used by most users of HHVM. Some won't be documented, other than the type and default value. - -### HHIR - -These settings control various aspects of the [HHVM Intermediate Representation](https://github.com/facebook/hhvm/blob/master/hphp/doc/hackers-guide/jit-core.md#hhir) (HHIR). - -| Setting | Type | Default -|---------|------|-------- -| `hhvm.hhir_alloc_simd_regs` | `bool` | `true` -| `hhvm.hhir_licm` | `bool` | `false` -| `hhvm.hhir_dead_code_elim` | `bool` | `true` -| `hhvm.hhir_direct_exit` | `bool` | `true` -| `hhvm.hhir_enable_coalescing` | `bool` | `true` -| `hhvm.hhir_enable_gen_time_inlining` | `bool` | `true` -| `hhvm.hhir_enable_pre_coloring` | `bool` | `true` -| `hhvm.hhir_gen_opts` | `bool` | `true` -| `hhvm.hhir_generate_asserts` | `bool` | `true` (if HHVM was compiled in debug mode); `false` otherwise. -| `hhvm.hhir_global_value_numbering` | `bool` | `true` -| `hhvm.hhir_inline_frame_opts` | `bool` | `true` -| `hhvm.hhir_inline_singletons` | `bool` | `true` -| `hhvm.hhir_inline_region_mode` | `string` | `"both"` -| `hhvm.hhir_inlining_max_bind_jmps` | `int` | `0` -| `hhvm.hhir_inlining_max_cost` | `int` | `13` -| `hhvm.hhir_pgo_inlining_max_cost` | `int` | `6` -| `hhvm.hhir_inlining_max_depth` | `int` | `4` -| `hhvm.hhir_inlining_max_return_dec_refs` | `int` | `6` -| `hhvm.hhir_inlining_max_returns` | `int` | `3` -| `hhvm.hhir_memory_opts` | `bool` | `true` -| `hhvm.hhir_outline_generic_inc_dec_ref` | `bool` | `true` -| `hhvm.hhir_prediction_opts` | `bool` | `true` -| `hhvm.hhir_refcount_opts` | `bool` | `true` -| `hhvm.hhir_simplification` | `bool` | `true` -| `hhvm.hhir_store_pre` | `bool` | `true` -| `hhvm.hhir_stress_spill` | `bool` | `true` -| `hhvm.hhir_type_check_hoisting` | `bool` | `false` - -### Xbox Server - -An xbox server provides cross-machine communication, similar to a message queuing system. It also allows local processing of messages, then working as a multithreading facility for PHP execution. More documentation will be coming for xbox applications. - -| Setting | Type | Default -|---------|------|-------- -| `hhvm.xbox.default_local_timeout_milli_seconds` | `int` | `500` -| `hhvm.xbox.default_remote_timeout_seconds` | `int` | `5` -| `hhvm.xbox.process_message_func` | `string` | `xbox_process_message` -| `hhvm.xbox.server_info.always_reset` | `bool` | `false` -| `hhvm.xbox.server_info.log_info `| `bool` | `false` -| `hhvm.xbox.server_info.max_duration` | `int` | `120` -| `hhvm.xbox.server_info.max_queue_length` | `int` | `INT_MAX` -| `hhvm.xbox.server_info.max_request` | `int` | `500` -| `hhvm.xbox.server_info.port` | `int` | `0` -| `hhvm.xbox.server_info.request_init_document` | `string` | `''` -| `hhvm.xbox.server_info.request_init_function` | `string` | `''` -| `hhvm.xbox.server_info.thread_count` | `int` | `10` -| `hhvm.xbox.server_info.warmup_document` | `string` | `''` -| `hhvm.xbox.password` | `string` | `''` (not `ini_get()` enabled) -| `hhvm.xbox.passwords` | `Set<string>` | *empty* (not `ini_get()` enabled) - -### Pagelet Server - -A pagelet server is essentially the same as local CURL, except it's more efficient. This allows parallel execution of a web page, preparing two panels or iframes at the same time. - -| Setting | Type | Default -|---------|------|-------- -| `hhvm.pagelet_server.queue_limit` | `int` | `0` -| `hhvm.pagelet_server.thread_count` | `int` | `0` -| `hhvm.pagelet_server.thread_drop_cache_timeout_seconds` | `int` | `0` -| `hhvm.pagelet_server.thread_drop_stack` | `bool` | `false` -| `hhvm.pagelet_server.thread_round_robin` | `bool` | `false` - -### Emitter - -Settings for the HHVM compiler code emitter. - -| Setting | Type | Default -|---------|------|-------- -| `hhvm.emit_switch` | `bool` | `true` -| `hhvm.enable_emitter_stats` | `bool` | `true` -| `hhvm.random_hot_funcs` | `bool` | `false` - -### Xenon - -Settings for the Xenon server, which snapshots server activity at regular intervals, showing which code is on CPU. - -| Setting | Type | Default | Description -|---------|------|---------|------------ -| `hhvm.xenon.force_always_on` | `bool` | `false` | Gather PHP and async stacks at every function enter/exit. This will gather potentially large amounts of data and is mostly useful for small script debugging. -| `hhvm.xenon.period` | `double` | `0.0` | Configure Xenon to gather PHP and async stacks every this many seconds. - -### Mail - -These are settings for the Mail extension. - -| Setting | Type | Default -|---------|------|-------- -| hhvm.mail.force_extra_parameters | `string` | `''` -| hhvm.mail.sendmail_path | `string` | `sendmail -t -i` - -### Code Checks - -These settings are for toggling various code checks (e.g., typehints). - -| Setting | Type | Default | Description -|---------|------|---------|------------ -| `hhvm.check_flush_on_user_close` | `bool` | `true` | Determines whether or not close() for user streams (registered by `stream_wrapper_register()`) will consider the return value of the implicit call to `flush()`` when calculating its return value. -| `hhvm.check_return_type_hints` | `int` | `2` | Whether to check return type hints at runtime, and if so how. `0` means no return type checking. `1` - Raises `E_WARNING` if a return type hint fails. `2` - Raises `E_RECOVERABLE_ERROR` if regular return type hint fails, raises `E_WARNING` if soft return type hint fails. If a regular return type hint fails, it's possible for execution to resume normally if the user error handler doesn't throw and returns something other than boolean `false`. `3` - Same as `2`, except if a regular type hint fails the runtime will not allow execution to resume normally; if the user error handler returns something other than boolean `false`, the runtime will throw a fatal error (this goes together with `hhvm.hard_return_type_hints`). -| `hhvm.hard_return_type_hints` | `bool` | `false` | Check hard return type hints. Only used when compiling. -| `hhvm.check_sym_link` | `bool` | `true` | Whether to follow symlinks when looking up units in the bytecode cache. - -### Profiling - -These are additional settings for the HHVM profiler. HHProf uses jemalloc per heap profiling. - -| Setting | Type | Default -|---------|------|-------- -| `hhvm.profile_bc` | `bool` | `false` -| `hhvm.profile_heap_across_requests` | `bool` | `false` -| `hhvm.profile_hw_enable` | `bool` | `true` -| `hhvm.profile_hw_events` | `string` | `''` -| `hhvm.hh_prof.enabled` | `bool` | `false` -| `hhvm.hh_prof.active` | `bool` | `false` -| `hhvm.hh_prof.accum` | `bool` | `false` -| `hhvm.hh_prof.request` | `bool` | `false` -| `hhvm.record_code_coverage` | `bool`| `false` | -| `hhvm.code_coverage_output_file` | `bool` | `false` -| `hhvm.hot_func_count` | `int` | `4100` -| `hhvm.num_single_jit_requests` | `int` | `5` (in server mode); `0` otherwise - -### Proxies - -These are settings for reverse proxying. - -| Setting | Type | Default -|---------|------|-------- -| `hhvm.proxy.origin` | `string` | `''` -| `hhvm.proxy.percentage` | `int` | `0` -| `hhvm.proxy.proxy_patterns` | `Vector<string>` | *empty* -| `hhvm.proxy.proxy_urls` | `Set<string>` | *empty* -| `hhvm.proxy.retry` | `int` | 3 -| `hhvm.proxy.serve_urls` | `Set<string>` | *empty* - -### Other - -Here are some other HHVM settings that may be useful in an advanced situation. - -| Setting | Type | Default | Description -|---------|------|---------|------------ -| `hhvm.allow_hhas` | `bool` | `false` | Allow executing HHVM Assembly (hhas) files, which is code written directly in [HHVM Bytecode (HHBC)](https://github.com/facebook/hhvm/blob/master/hphp/doc/bytecode.specification). Directly writing HHBC can easily crash HHVM, and is rarely a useful thing to do anyways. -| `hhvm.spin_on_crash` | `bool` | `false` | If enabled, when HHVM crashes, this will wait for the debugger to attach to the pid. -| `hhvm.simulate_arm` | `bool` | `false` | If enabled, this will allow HHVM to simulate running on ARM architecture. -| `hhvm.timeouts_use_wall_time` | `bool` | `true` | Determines whether or not to interpret set_time_limit timeouts as wall time or CPU time. -| `hhvm.dynamic_extension_path` | `string` | `.` | path to look for extensions if a fully qualified path is not provided. The current path is the default. -| `hhvm.gdb_sync_chunks` | `int` | `128` | This forces the VM to sync debug info synchronously with gdb, this many chunks at a time. -| `hhvm.hhbc_arena_chunk_size` | `int` | `10485760` (1 MB) | The chunk size for the HHBC arena. -| `hhvm.initial_named_entity_table_size` | `int` | `30000` | The initial size of the named entity table. -| `hhvm.initial_static_string_table_size` | `int` | `500000` | The initial size of the static string table. -| `hhvm.map_tc_huge` | `bool` | `false` -| `hhvm.map_tgt_cache_huge` | `bool` | `false` -| `hhvm.max_low_mem_huge_pages` | `int` | `0` -| `hhvm.vm_initial_global_table_size` | `int` | `512` | The initial global table size.s -| `hhvm.vm_stack_elms` | `int` | `16384` | The maximum stack size. - -## Unused Settings - -These are settings that are currently not used in the codebase. - -| Setting | Type | Default | -|---------|------|---------| -| `hhvm.enable_alternative` | `int` | `0` -| `hhvm.server.enable_cuf_async` | `bool` | `false` -| `hhvm.server.lib_event_sync_send` | `bool` | `true` -| `hhvm.server.response_queue_count` | `int` | `0` -| `hhvm.server.shutdown_listen_no_work` | `int` | `-1` -| `hhvm.debug.full_backtrace` | `bool` | `false` -| `hhvm.debug.local_memcache` | `bool` | `false` -| `hhvm.debug.memcache_read_only` | `bool` | `false` -| `hhvm.debug.translate_leak_stack_trace` | `bool` | `false` -| `hhvm.debug.translate_source` | `bool` | `false` | Used to translate C++ file and line numbers into original PHP file and line numbers. -| `hhvm.error_handling.enable_hip_hop_errors` | `bool` | `true` -| `hhvm.error_handling.max_loop_count` | `int` | `0` -| `hhvm.error_handling.warn_too_many_arguments` | `bool` | `false` -| `hhvm.hack_array_warn_frequency` | `int` | `0` -| `hhvm.resource_limit.max_memcache_key_count` | `int` | `0` -| `hhvm.resource_limit.string_offset_limit` | `int` | `10 * 1024 * 1024` (10 MB) diff --git a/guides/hhvm/04-configuration/configuration-category.txt b/guides/hhvm/04-configuration/configuration-category.txt deleted file mode 100644 index 8754b08ba..000000000 --- a/guides/hhvm/04-configuration/configuration-category.txt +++ /dev/null @@ -1 +0,0 @@ -Learn diff --git a/guides/hhvm/04-configuration/configuration-summary.txt b/guides/hhvm/04-configuration/configuration-summary.txt deleted file mode 100644 index 9f56676a6..000000000 --- a/guides/hhvm/04-configuration/configuration-summary.txt +++ /dev/null @@ -1 +0,0 @@ -How to configure HHVM with various user-configurable options. diff --git a/guides/hhvm/04-configuration/guides-generated-markdown b/guides/hhvm/04-configuration/guides-generated-markdown deleted file mode 120000 index 603d58964..000000000 --- a/guides/hhvm/04-configuration/guides-generated-markdown +++ /dev/null @@ -1 +0,0 @@ -../../../build/scratch/guides-generated-markdown \ No newline at end of file diff --git a/guides/hhvm/05-extensions/01-introduction.md b/guides/hhvm/05-extensions/01-introduction.md deleted file mode 100644 index cd97f122a..000000000 --- a/guides/hhvm/05-extensions/01-introduction.md +++ /dev/null @@ -1,130 +0,0 @@ -HHVM provides dozens of built-in, integrated extensions and allows for other extensions to be dynamically loaded. Since this is an HHVM user's guide, this does not discuss how to build your own extension, but there are resources for that listed below. - -## Integrated Extensions - -If you call `get_loaded_extensions()` from HHVM, you will find that the following extensions are integrated into HHVM - -This documentation links to the PHP documentation about PHP extensions. -It is however important to keep in mind that hhvm has been slowly drifting away from PHP. -Most extensions have the features that they had in PHP 7.0 or 7.1. -Features added in newer releases of PHP may not have been implemented. -Some functionality may be missing or may not have typechecker definitions. - -Some APIs may have changed (think of `&$references` to `inout` changes). -Some functions may have been split up into multiple functions if the PHP function took an optional `&$reference` argument. -For the most up-to-date function signatures, please refer to your version of the typechecker definitions. - -* [apache](http://php.net/manual/en/book.apache.php) -* [array](http://php.net/manual/en/book.array.php) -* [asio](/hack/asynchronous-operations/utility-functions) -* [async_mysql](/hack/asynchronous-operations/extensions#mysql) -* [bc](http://php.net/manual/en/book.bc.php) -* [bz2](http://php.net/manual/en/book.bzip2.php) -* [ctype](http://php.net/manual/en/book.ctype.php) -* [curl](http://php.net/manual/en/book.curl.php) ([async curl](/hack/asynchronous-operations/extensions#curl)) -* [datetime](https://www.php.net/manual/en/book.datetime.php) -* [debugger (phpdbg)](https://www.php.net/manual/en/book.phpdbg.php) -* [dom](http://php.net/manual/en/book.dom.php) -* domdocument -* [enum](/hack/built-in-types/enum) -* [exif](http://php.net/manual/en/book.exif.php) -* fb -* [fileinfo](http://php.net/manual/en/book.fileinfo.php) -* [filter](http://php.net/manual/en/book.filter.php) -* [gd](https://www.php.net/manual/en/book.image.php) -* [gmp](http://php.net/manual/en/book.gmp.php) -* [hash](http://php.net/manual/en/book.hash.php) -* hhvm.debugger -* hhvm.ini -* hosthealthmonitor -* hotprofiler -* [iconv](http://php.net/manual/en/book.iconv.php) -* [idn](http://php.net/manual/en/ref.intl.idn.php) -* [imagick](http://php.net/manual/en/book.imagick.php) -* [imap](http://php.net/manual/en/book.imap.php) -* intervaltimer -* [intl](http://php.net/manual/en/book.intl.php) -* [json](http://php.net/manual/en/book.json.php) -* [ldap](http://php.net/manual/en/book.ldap.php) -* [libxml](http://php.net/manual/en/book.libxml.php) -* [mail](http://php.net/manual/en/book.mail.php) -* [mailparse](http://php.net/manual/en/book.mailparse.php) -* [mbstring](http://php.net/manual/en/book.mbstring.php) -* [mcrouter](/hack/asynchronous-operations/extensions#mcrouter) -* [mcrypt](http://php.net/manual/en/book.mcrypt.php) -* [memcache](http://php.net/manual/en/book.memcache.php) -* [memcached](http://php.net/manual/en/book.memcached.php) -* objprof -* [openssl](http://php.net/manual/en/book.openssl.php) -* [pcntl](http://php.net/manual/en/book.pcntl.php) -* [pcre](http://php.net/manual/en/book.pcre.php) -* [pdo](http://php.net/manual/en/book.pdo.php) -* [pdo_mysql](http://php.net/manual/en/ref.pdo-mysql.php) -* [pdo_pgsql](http://php.net/manual/en/ref.pdo-pgsql.php) -* [pdo_sqlite](http://php.net/manual/en/ref.pdo-sqlite.php) -* [pgsql](http://php.net/manual/en/book.pgsql.php) -* [posix](http://php.net/manual/en/book.posix.php) -* [readline](http://php.net/manual/en/book.readline.php) -* [reflection](http://php.net/manual/en/book.reflection.php) -* server -* [SimpleXML](http://php.net/manual/en/book.simplexml.php) -* [soap](http://php.net/manual/en/book.soap.php) -* [sockets](http://php.net/manual/en/book.sockets.php) -* [spl](http://php.net/manual/en/book.spl.php) -* [sqlite3](http://php.net/manual/en/book.sqlite3.php) -* [stream](http://php.net/manual/en/book.stream.php) ([async streams](/hack/asynchronous-operations/extensions#streams)) -* [string](http://php.net/manual/en/book.strings.php) -* sysvmsg -* sysvsem -* sysvshm -* thrift_protocol -* [url](http://php.net/manual/en/book.url.php) -* xenon -* [xhprof](http://php.net/manual/en/book.xhprof.php) -* [xml](http://php.net/manual/en/book.xml.php) -* [xmlreader](http://php.net/manual/en/book.xmlreader.php) -* [xmlwriter](http://php.net/manual/en/book.xmlwriter.php) -* [xsl](http://php.net/manual/en/book.xsl.php) -* [zip](http://php.net/manual/en/book.zip.php) -* [zlib](http://php.net/manual/en/book.zlib.php) - -## Dynamically Loaded Extensions - -* [dbase](https://github.com/skyfms/hhvm-ext_dbase) -* [geoip](https://github.com/vipsoft/hhvm-ext-geoip) -* [msgpack](https://github.com/reeze/msgpack-hhvm) -* [shp](https://github.com/skyfms/hhvm-ext_shape) -* [ssdeep](https://github.com/treffynnon/hhvm-ssdeep) -* [uuid](https://github.com/vipsoft/hhvm-ext-uuid) -* [uv](https://github.com/chobie/hhvm-uv) -* [zmq](https://github.com/Orvid/php-zmq) - -### Loading - -To load a dynamically loaded extension, follow the instructions for that extension. However, it generally goes like this: - -``` -cd /path/to/extension -hphpize -cmake . -make -``` - -This will create an `.so` file. Then in your configuration `.ini` file: - -``` -extension_dir = /etc/hhvm -hhvm.extensions[extension_name] = extension.so -``` - -or - -``` -hhvm.dynamic_extensions[extension_name] = extension.so -``` - -## Building Your Own Extension - -Creating your own extension is beyond the scope of this user guide, but there are some good external resources to help get you started: - -http://blog.golemon.com/2015/01/hhvm-extension-writing-part-i.html diff --git a/guides/hhvm/05-extensions/extensions-category.txt b/guides/hhvm/05-extensions/extensions-category.txt deleted file mode 100644 index 8754b08ba..000000000 --- a/guides/hhvm/05-extensions/extensions-category.txt +++ /dev/null @@ -1 +0,0 @@ -Learn diff --git a/guides/hhvm/05-extensions/extensions-summary.txt b/guides/hhvm/05-extensions/extensions-summary.txt deleted file mode 100644 index 6bce7c3ee..000000000 --- a/guides/hhvm/05-extensions/extensions-summary.txt +++ /dev/null @@ -1 +0,0 @@ -The built in and dynamic extensions that HHVM currently supports. diff --git a/guides/hhvm/98-FAQ/01-faq.md b/guides/hhvm/98-FAQ/01-faq.md deleted file mode 100644 index 51359e2c8..000000000 --- a/guides/hhvm/98-FAQ/01-faq.md +++ /dev/null @@ -1,74 +0,0 @@ -This FAQ contains helpful hints and frequently asked questions about HHVM. - -## General - -### What is the history of HHVM? - -For a history of what is now HHVM, please visit [our Wikipedia page](http://en.wikipedia.org/wiki/HHVM). - -### How does Facebook use and run HHVM? - -Facebook's entire site runs on HHVM (desktop, API and mobile), both in development and production. - -### What platforms is HHVM supported on? - -* **Linux**: HHVM has [Linux](/hhvm/installation/linux) support on flavors of Ubuntu and Debian. -* **Mac OS X**: HHVM has limited [MacOS](/hhvm/installation/mac) support via Homebrew. - -## Users - -### How do I install HHVM? Where are the binaries? - -New users should read the [HHVM Introduction](/hhvm/basic-usage/introduction) guide. - -### When does HHVM release a new version? - -[Every two weeks](/hhvm/installation/release-schedule); each release is supported -for 6 weeks. - -### Why is HHVM released every two weeks? - -This allows users to choose between many small updates, or fewer, larger -updates. - -### What code does HHVM currently run? - -The following sites use Hack and HHVM: - -* [Facebook](https://www.facebook.com) -* [Slack](https://slack.com) -* [Quizlet](https://quizlet.com) -* This website - [source is available](https://github.com/hhvm/user-documentation). - -### What do I do if I run into a problem (e.g., an error, fatal or segfault)? - -If you believe you may have found a security issue, please [see HHVM's SECURITY.md](https://github.com/facebook/hhvm/blob/master/SECURITY.md); otherwise, please [submit an issue](https://github.com/facebook/hhvm/wiki/How-to-Report-Issues). - -Our user community is [on Facebook](https://facebook.com/groups/hhvm.general) -and [on Slack](https://hhvm.com/slack). - -### Should I use Proxygen or FastCGI? - -[Proxygen](/hhvm/basic-usage/proxygen) is strongly recommended, and used in production by Facebook. - -[FastCGI](/hhvm/advanced-usage/fastCGI) is not recommended, but available for -legacy or niche use cases. - -### When will HHVM support Apache or Nginx? - -HHVM can be used either with `mod_proxy` and the Proxygen server, or FastCGI. - -Proxygen is recommended, but care is needed to forward headers appropriately. - - -## Configuration and Deployment - -### Why is my code slow at startup? - -The HHVM JIT needs time to warm up. The warmup usually occurs somewhere on the order of 10-11 requests, at which point the JIT has performed its optimizations and off we go at peak speed. - -So, in HHVM server mode, you start out by running the first couple requests in interp mode to get things primed. You don't really want to be optimizing the first few requests since that is when initialization is occurring, caches are being loaded, etc. Those code paths are generally cold later on. - -After the first few requests, the JIT is on its way to optimizing. - -It is advisable, but not required, if you are running an HHVM server to send the server some explicit requests that are representative of what user requests will be coming through. You can use `curl`, for example, to send these requests. This way the JIT has the information necessary to make the best optimizations for your code before any requests are actually served. diff --git a/guides/hhvm/98-FAQ/faq-category.txt b/guides/hhvm/98-FAQ/faq-category.txt deleted file mode 100644 index 8754b08ba..000000000 --- a/guides/hhvm/98-FAQ/faq-category.txt +++ /dev/null @@ -1 +0,0 @@ -Learn diff --git a/guides/hhvm/98-FAQ/faq-summary.txt b/guides/hhvm/98-FAQ/faq-summary.txt deleted file mode 100644 index 2d2d890fa..000000000 --- a/guides/hhvm/98-FAQ/faq-summary.txt +++ /dev/null @@ -1 +0,0 @@ -Common information and questions regarding HHVM. diff --git a/hackttp.patch b/hackttp.patch deleted file mode 100644 index 25ceb7e54..000000000 --- a/hackttp.patch +++ /dev/null @@ -1,46 +0,0 @@ -diff --git a/vendor/usox/hackttp/src/Response/TemporaryFileSapiEmitter.hack b/vendor/usox/hackttp/src/Response/TemporaryFileSapiEmitter.hack -index 5eb02f6..747753a 100644 ---- a/vendor/usox/hackttp/src/Response/TemporaryFileSapiEmitter.hack -+++ b/vendor/usox/hackttp/src/Response/TemporaryFileSapiEmitter.hack -@@ -34,27 +34,33 @@ final class TemporaryFileSapiEmitter implements EmitterInterface { - - $body = $response->getBody(); - -- /* HH_FIXME[4053] */ -- $path = $body->getPath(); -- -- $path as File\Path; -+ // Lambda is used to force $path to be string, not TAny (`_`). -+ $path = (): string ==> { -+ /*HH_FIXME[4053] getPath is not part of the WriteHandle interface.*/ -+ $path_maybe_object = $body->getPath(); -+ // Path is going to be removed from the hsl. -+ // We just used `->toString()` anyway. -+ // This hacky expression is needed, because `$path_maybe_object` -+ // is of the TAny type (`_`), so the typechecker won't error when -+ // `->getPath()` starts returning a string. -+ // This expression works for both Path and string. -+ return $path_maybe_object |> $$ is string ? $$ : $$->toString(); -+ }(); - - $this->writeStatusLine($response); - $this->writeHeaders($response); - -- $temporary_file_path = $path->toString(); -- - if ($body is IO\CloseableHandle) { - $body->close(); - } - -- $read_handle = File\open_read_only($temporary_file_path); -+ $read_handle = File\open_read_only($path); - using ($read_handle->closeWhenDisposed()) { - $out = IO\request_output(); - $content = await $read_handle->readAllAsync(); - await $out->writeAllAsync($content); - }; -- \unlink($temporary_file_path); -+ \unlink($path); - } - - /** diff --git a/hh_autoload.json b/hh_autoload.json deleted file mode 100644 index ab384b28f..000000000 --- a/hh_autoload.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "roots": [ - "src/", - "build/final/codegen/", - "tests/" - ], - "extraFiles": [ "LocalConfig.php" ], - "devFailureHandler": null -} diff --git a/hhast-lint.json b/hhast-lint.json deleted file mode 100644 index 6a389c6d3..000000000 --- a/hhast-lint.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "roots": [ "src/", "tests/" ] -} diff --git a/hhvm.dev.ini b/hhvm.dev.ini deleted file mode 100644 index 220489635..000000000 --- a/hhvm.dev.ini +++ /dev/null @@ -1,7 +0,0 @@ -hhvm.server.default_document=index.php -hhvm.server.error_document404=index.php -hhvm.server.thread_count=20 -hhvm.hack_compiler_workers=4 -hhvm.jit_worker_threads=1 -hhvm.jit_worker_arenas=1 -hhvm.check_return_type_hints=3 diff --git a/hhvm.prod.ini b/hhvm.prod.ini deleted file mode 100644 index bba2a31e9..000000000 --- a/hhvm.prod.ini +++ /dev/null @@ -1,24 +0,0 @@ -; relative to public/ -hhvm.server.default_document=index.php -hhvm.server.error_document404=index.php -hhvm.server.thread_count=20 -hhvm.jit_worker_threads=1 -hhvm.jit_worker_arenas=1 -hhvm.check_return_type_hints=3 - -; ----------------------------------- -; -- REPO AUTH CONFIG STARTS HERE --- -; ----------------------------------- -; -hhvm.repo.authoritative=true -hhvm.repo.path=/var/www/hhvm.hhbc -hhvm.server.enable_static_content_from_disk=false -hhvm.server.file_cache=/var/www/file.cache -hhvm.server.source_root=/var/www - -; rewrite requests - including for the default/error documents - from `/foo` to -; `/public/foo`. -; -; the value is relative to the source root, which defaults to HHVM's current -; working directory -hhvm.virtual_host[default][path_translation]=public diff --git a/legacy-docs-site-index.json b/legacy-docs-site-index.json deleted file mode 100644 index 0475f4207..000000000 --- a/legacy-docs-site-index.json +++ /dev/null @@ -1 +0,0 @@ -[["","index","authorgroup"],["","copyright","legalnotice"],["","index","info"],["","preface","section"],["","preface","preface"],["","manual","book"],["","install-intro.install","chapter"],["","install-intro.intro.php","example"],["","install-intro.intro.php","section"],["","install-intro.intro.hack","example"],["","install-intro.intro.hack","section"],["","install-intro.intro.hhvm","section"],["","install-intro.intro","chapter"],["","install-intro","book"],["","hack.intro.whatis","sect1"],["","hack.intro.background","sect1"],["","hack.intro.summary","sect1"],["","hack.intro","chapter"],["","hack.arrays","chapter"],["","hack.async.asyncawait","sect1"],["","hack.async.annotating","sect1"],["","hack.async.fetchingexample","sect1"],["","hack.async.signatureexamples","sect1"],["","hack.async.awaitablesvsgenerators","sect1"],["","hack.async.lambdas","sect1"],["","hack.async.builtins","sect1"],["","hack.async.external.resources","sect1"],["","hack.async","chapter"],["","hack.attributes.override","sect2"],["","hack.attributes.override","sect1"],["","hack.attributes.memoize","sect1"],["","hack.attributes.consistentconstruct","sect1"],["","hack.attributes","chapter"],["","hack.collections.goals","sect1"],["","hack.collections.vector","sect1"],["","hack.collections.map","sect1"],["","hack.collections.set","sect1"],["","hack.collections.pair","sect1"],["","hack.collections.immutable","sect1"],["","hack.collections.interfaces","sect2"],["","hack.collections.interfaces","sect2"],["","hack.collections.interfaces","sect2"],["","hack.collections.interfaces","sect2"],["","hack.collections.interfaces","sect1"],["","hack.collections.squarebracketsyntax","sect1"],["","hack.collections.literalsyntax","sect1"],["","hack.collections.phpoperators","sect1"],["","hack.collections.phpbuiltins","sect1"],["","hack.collections.examples","sect2"],["","hack.collections.examples","sect2"],["","hack.collections.examples","sect2"],["","hack.collections.examples","sect2"],["","hack.collections.examples","sect2"],["","hack.collections.examples","sect2"],["","hack.collections.examples","sect2"],["","hack.collections.examples","sect2"],["","hack.collections.examples","sect2"],["","hack.collections.examples","sect2"],["","hack.collections.examples","sect2"],["","hack.collections.examples","sect2"],["","hack.collections.examples","sect2"],["","hack.collections.examples","sect2"],["","hack.collections.examples","sect2"],["","hack.collections.examples","sect2"],["","hack.collections.examples","sect1"],["","hack.collections.limitations","sect1"],["","hack.collections.futurework","sect1"],["","hack.collections","chapter"],["","hack.constructorargumentpromotion","chapter"],["","hack.enums.details","sect1"],["","hack.enums.functions","sect1"],["","hack.enums","chapter"],["","hack.generics.introexample","sect1"],["","hack.generics.class","sect1"],["","hack.generics.traitsandinterfaces","sect1"],["","hack.generics.method","sect1"],["","hack.generics.typeinference","sect1"],["","hack.generics.overrideonreturntype","sect1"],["","hack.generics.mixedcompat","sect1"],["","hack.generics.constraints","sect1"],["","hack.generics.covariance","sect1"],["","hack.generics.openandclosedtypes","sect1"],["","hack.generics.styleguidelines","sect1"],["","hack.generics","chapter"],["","hack.modes.strict","sect1"],["","hack.modes.partial","sect1"],["","hack.modes.decl","sect1"],["","hack.modes.unsafe","sect1"],["","hack.modes","chapter"],["","hack.lambda.design","sect1"],["","hack.lambda.operator","sect1"],["","hack.lambda.examples","sect1"],["","hack.lambda","chapter"],["","hack.methoddispatch","chapter"],["","hack.nullable.why","sect1"],["","hack.nullable.whynotalwaysuse","sect1"],["","hack.nullable.casestudy","sect1"],["","hack.nullable.examples","sect2"],["","hack.nullable.examples","sect2"],["","hack.nullable.examples","sect2"],["","hack.nullable.examples","sect2"],["","hack.nullable.examples","sect2"],["","hack.nullable.examples","sect2"],["","hack.nullable.examples","sect1"],["","hack.nullable.scenarios","sect2"],["","hack.nullable.scenarios","sect2"],["","hack.nullable.scenarios","sect2"],["","hack.nullable.scenarios","sect2"],["","hack.nullable.scenarios","sect1"],["","hack.nullable","chapter"],["","hack.otherrulesandfeatures.varargs","sect1"],["","hack.otherrulesandfeatures.numberhandling","sect2"],["","hack.otherrulesandfeatures.numberhandling","sect1"],["","hack.otherrulesandfeatures.typeinference","sect2"],["","hack.otherrulesandfeatures.typeinference","sect2"],["","hack.otherrulesandfeatures.typeinference","sect1"],["","hack.otherrulesandfeatures.classinitialization","sect1"],["","hack.otherrulesandfeatures.callbacks","sect1"],["","hack.otherrulesandfeatures.overridereturntype","sect1"],["","hack.otherrulesandfeatures.invariant","sect1"],["","hack.otherrulesandfeatures.initialization","sect1"],["","hack.otherrulesandfeatures.uniontypes","sect1"],["","hack.otherrulesandfeatures.heredocs","sect1"],["","hack.otherrulesandfeatures.nowdocs","sect1"],["","hack.otherrulesandfeatures.casting","sect1"],["","hack.otherrulesandfeatures.classnameresolution","sect1"],["","hack.otherrulesandfeatures","chapter"],["","class.hack.traversabletv","section"],["","class.hack.traversabletv","section"],["Traversable<Tv>","class.hack.traversabletv","phpdoc:classref"],["","class.hack.indexishtktv","section"],["","class.hack.indexishtktv","section"],["Indexish<Tk,Tv>","class.hack.indexishtktv","phpdoc:classref"],["","class.hack.keyedtraversabletktv","section"],["","class.hack.keyedtraversabletktv","section"],["KeyedTraversable<Tk,Tv>","class.hack.keyedtraversabletktv","phpdoc:classref"],["","class.hack.iteratortv","section"],["","class.hack.iteratortv","section"],["","class.hack.iteratortv","example"],["","class.hack.iteratortv","section"],["Iterator<Tv>::current","hack.iteratortv.current","refentry"],["Iterator<Tv>::key","hack.iteratortv.key","refentry"],["Iterator<Tv>::next","hack.iteratortv.next","refentry"],["Iterator<Tv>::rewind","hack.iteratortv.rewind","refentry"],["Iterator<Tv>::valid","hack.iteratortv.valid","refentry"],["Iterator<Tv>","class.hack.iteratortv","phpdoc:classref"],["","class.hack.keyediteratortktv","section"],["","class.hack.keyediteratortktv","section"],["","class.hack.keyediteratortktv","example"],["","class.hack.keyediteratortktv","section"],["KeyedIterator<Tv>::key","hack.keyediteratortv.key","refentry"],["KeyedIterator<Tk, Tv>","class.hack.keyediteratortktv","phpdoc:classref"],["","class.hack.iteratoraggregatetv","section"],["","class.hack.iteratoraggregatetv","section"],["","class.hack.iteratoraggregatetv","example"],["","class.hack.iteratoraggregatetv","section"],["IteratorAggregate<Tv>::getIterator","hack.iteratoraggregatetv.getiterator","refentry"],["IteratorAggregate<Tv>","class.hack.iteratoraggregatetv","phpdoc:classref"],["","class.hack.iterabletv","section"],["","class.hack.iterabletv","section"],["Iterable<Tv>::getIterator","hack.iterabletv.getiterator","refentry"],["Iterable<Tv>::toArray","hack.iterabletv.toarray","refentry"],["Iterable<Tv>::toValuesArray","hack.iterabletv.tovaluesarray","refentry"],["Iterable<Tv>::toVector","hack.iterabletv.tovector","refentry"],["Iterable<Tv>::toImmVector","hack.iterabletv.toimmvector","refentry"],["Iterable<Tv>::toSet","hack.iterabletv.toset","refentry"],["Iterable<Tv>::toImmSet","hack.iterabletv.toimmset","refentry"],["Iterable<Tv>::values","hack.iterabletv.values","refentry"],["Iterable<Tv>::lazy","hack.iterabletv.lazy","refentry"],["Iterable<Tv>::map<Tu>","hack.iterabletv.map","refentry"],["Iterable<Tv>::filter","hack.iterabletv.filter","refentry"],["Iterable<Tv>::zip<Tu>","hack.iterabletv.zip","refentry"],["Iterable<Tv>","class.hack.iterabletv","phpdoc:classref"],["","class.hack.keyediterabletktv","section"],["","class.hack.keyediterabletktv","section"],["KeyedIterable<Tk, Tv>::getIterator","hack.keyediterabletktv.getiterator","refentry"],["KeyedIterable<Tk, TV>::toKeysArray","hack.keyediterabletktv.tokeysarray","refentry"],["KeyedIterable<Tk, Tv>::toMap","hack.keyediterabletktv.tomap","refentry"],["KeyedIterable<Tk, Tv>::keys","hack.keyediterabletktv.keys","refentry"],["KeyedIterable<Tk, Tv>::lazy","hack.keyediterabletktv.lazy","refentry"],["KeyedIterable<Tk, Tv>::map<Tu>","hack.keyediterabletktv.map","refentry"],["KeyedIterable<Tk, Tv>::mapWithKey<Tu>","hack.keyediterabletktv.mapwithkey","refentry"],["KeyedIterable<Tk, Tv>::filter","hack.keyediterabletktv.filter","refentry"],["KeyedIterable<Tk, Tv>::filterWithKey","hack.keyediterabletktv.filterwithkey","refentry"],["KeyedIterable<Tk, Tv>::zip<Tu>","hack.keyediterabletktv.zip","refentry"],["KeyedIterable<Tk, Tv>","class.hack.keyediterabletktv","phpdoc:classref"],["","class.hack.arrayaccesstktv","section"],["","class.hack.arrayaccesstktv","section"],["","class.hack.arrayaccesstktv","example"],["","class.hack.arrayaccesstktv","section"],["","hack.arrayaccesstktv.offsetexists","example"],["ArrayAccess<Tk, Tv>::offsetExists","hack.arrayaccesstktv.offsetexists","refentry"],["ArrayAccess<Tk, Tv>::offsetGet","hack.arrayaccesstktv.offsetget","refentry"],["ArrayAccess<Tk, Tv>::offsetSet","hack.arrayaccesstktv.offsetset","refentry"],["ArrayAccess<Tk, Tv>::offsetUnset","hack.arrayaccesstktv.offsetunset","refentry"],["ArrayAccess<Tk, Tv>","class.hack.arrayaccesstktv","phpdoc:classref"],["","class.hack.awaitablet","section"],["","class.hack.awaitablet","section"],["Awaitable<T>::getWaitHandle","hack.awaitablet.getwaithandle","refentry"],["Awaitable<T>","class.hack.awaitablet","phpdoc:classref"],["","class.hack.xhpchild","section"],["","class.hack.xhpchild","section"],["XHPChild","class.hack.xhpchild","phpdoc:classref"],["","hack.predefined.interfaces","part"],["","hack.shapes.simpleexample","sect1"],["","hack.shapes.acrossfiles","sect1"],["","hack.shapes.generics","sect1"],["","hack.shapes.summary","sect1"],["","hack.shapes","chapter"],["","hack.traits.requirements","sect1"],["","hack.traits","chapter"],["","hack.tuples.usecases","sect1"],["","hack.tuples.implementation","sect1"],["","hack.tuples.annotations","sect1"],["","hack.tuples.returningfrommethod","sect1"],["","hack.tuples.initializerexpressions","sect1"],["","hack.tuples","chapter"],["","hack.typealiasing.typealiasing","sect1"],["","hack.typealiasing.opaquetypealiasing","sect1"],["","hack.typealiasing.opaquewithconstraints","sect1"],["","hack.typealiasing.examples","sect2"],["","hack.typealiasing.examples","sect2"],["","hack.typealiasing.examples","sect2"],["","hack.typealiasing.examples","sect2"],["","hack.typealiasing.examples","sect2"],["","hack.typealiasing.examples","sect2"],["","hack.typealiasing.examples","sect1"],["","hack.typealiasing.summary","sect1"],["","hack.typealiasing","chapter"],["","hack.annotations.introexample","sect1"],["","hack.annotations.why","sect1"],["","hack.annotations.types","sect1"],["","hack.annotations.usingtypes","sect1"],["","hack.annotations.examples","sect1"],["","hack.annotations.typecasting","sect1"],["","hack.annotations.arrays","sect1"],["","hack.annotations.functiontypes","sect1"],["","hack.annotations.constructors","sect1"],["","hack.annotations.this","sect1"],["","hack.annotations.mixedtypes","sect1"],["","hack.annotations.passingbyreference","sect1"],["","hack.annotations.generators","sect1"],["","hack.annotations.summary","sect1"],["","hack.annotations","chapter"],["","hack.unsupportedphpfeatures.toplevelcode","sect1"],["","hack.unsupportedphpfeatures.collisions","sect1"],["","hack.unsupportedphpfeatures.explicitconstructors","sect1"],["","hack.unsupportedphpfeatures.parentstaticmethods","sect1"],["","hack.unsupportedphpfeatures.callingstaticmethods","sect1"],["","hack.unsupported","chapter"],["","hack.xhp.types","sect1"],["","hack.xhp.xhpchild","sect1"],["","hack.xhp.returningxhpelements","sect1"],["","hack.xhp.other","sect1"],["","hack.xhp.future","sect1"],["","hack.xhp","chapter"],["","hacklangref","book"],["","hackfuncref","info"],["","intro.collections","preface"],["","class.hack.vectortv","section"],["","class.hack.vectortv","section"],["Vector<Tv>::add","hack.vectortv.add","refentry"],["Vector<Tv>::addAll","hack.vectortv.addall","refentry"],["Vector<Tv>::at","hack.vectortv.at","refentry"],["Vector<Tv>::clear","hack.vectortv.clear","refentry"],["Vector<Tv>::__construct","hack.vectortv.construct","refentry"],["Vector<Tv>::containsKey","hack.vectortv.containskey","refentry"],["Vector<Tv>::count","hack.vectortv.count","refentry"],["Vector<Tv>::filter","hack.vectortv.filter","refentry"],["Vector<Tv>::filterWithKey","hack.vectortv.filterwithkey","refentry"],["Vector<Tv>::fromItems","hack.vectortv.fromitems","refentry"],["Vector<Tv>::get","hack.vectortv.get","refentry"],["Vector<Tv>::getIterator","hack.vectortv.getiterator","refentry"],["Vector<Tv>::isEmpty","hack.vectortv.isempty","refentry"],["Vector<Tv>::items","hack.vectortv.items","refentry"],["Vector<Tv>::keys","hack.vectortv.keys","refentry"],["Vector<Tv>::lazy","hack.vectortv.lazy","refentry"],["Vector<Tv>::linearSearch","hack.vectortv.linearsearch","refentry"],["Vector<Tv>::map<Tu>","hack.vectortv.maptu","refentry"],["Vector<Tv>::mapWithKey<Tu>","hack.vectortv.mapwithkeytu","refentry"],["Vector<Tv>::pop","hack.vectortv.pop","refentry"],["Vector<Tv>::removeKey","hack.vectortv.removekey","refentry"],["Vector<Tv>::reserve","hack.vectortv.reserve","refentry"],["Vector<Tv>::resize","hack.vectortv.resize","refentry"],["Vector<Tv>::reverse","hack.vectortv.reverse","refentry"],["Vector<Tv>::set","hack.vectortv.set","refentry"],["Vector<Tv>::setAll","hack.vectortv.setall","refentry"],["Vector<Tv>::shuffle","hack.vectortv.shuffle","refentry"],["Vector<Tv>::splice","hack.vectortv.splice","refentry"],["Vector<Tv>::toArray","hack.vectortv.toarray","refentry"],["Vector<Tv>::toImmMap","hack.vectortv.toimmmap","refentry"],["Vector<Tv>::toImmSet","hack.vectortv.toimmset","refentry"],["Vector<Tv>::toImmVector","hack.vectortv.toimmvector","refentry"],["Vector<Tv>::toKeysArray","hack.vectortv.tokeysarray","refentry"],["Vector<Tv>::toMap","hack.vectortv.tomap","refentry"],["Vector<Tv>::toSet","hack.vectortv.toset","refentry"],["Vector<Tv>::__toString","hack.vectortv.tostring","refentry"],["Vector<Tv>::toValuesArray","hack.vectortv.tovaluesarray","refentry"],["Vector<Tv>::toVector","hack.vectortv.tovector","refentry"],["Vector<Tv>::values","hack.vectortv.values","refentry"],["Vector<Tv>::zip<Tu>","hack.vectortv.ziptu","refentry"],["Vector<Tv>","class.hack.vectortv","phpdoc:classref"],["","class.hack.immvectortv","section"],["","class.hack.immvectortv","section"],["ImmVector<Tv>::at","hack.immvectortv.at","refentry"],["ImmVector<Tv>::__construct","hack.immvectortv.construct","refentry"],["ImmVector<Tv>::containsKey","hack.immvectortv.containskey","refentry"],["ImmVector<Tv>::count","hack.immvectortv.count","refentry"],["ImmVector<Tv>::filter","hack.immvectortv.filter","refentry"],["ImmVector<Tv>::filterWithKey","hack.immvectortv.filterwithkey","refentry"],["ImmVector<Tv>::fromItems","hack.immvectortv.fromitems","refentry"],["ImmVector<Tv>::get","hack.immvectortv.get","refentry"],["ImmVector<Tv>::getIterator","hack.immvectortv.getiterator","refentry"],["ImmVector<Tv>::isEmpty","hack.immvectortv.isempty","refentry"],["ImmVector<Tv>::items","hack.immvectortv.items","refentry"],["ImmVector<Tv>::keys","hack.immvectortv.keys","refentry"],["ImmVector<Tv>::lazy","hack.immvectortv.lazy","refentry"],["ImmVector<Tv>::linearSearch","hack.immvectortv.linearsearch","refentry"],["ImmVector<Tv>::map<Tu>","hack.immvectortv.maptu","refentry"],["ImmVector<Tv>::mapWithKey<Tu>","hack.immvectortv.mapwithkeytu","refentry"],["ImmVector<Tv>::toArray","hack.immvectortv.toarray","refentry"],["ImmVector<Tv>::toImmMap","hack.immvectortv.toimmmap","refentry"],["ImmVector<Tv>::toImmSet","hack.immvectortv.toimmset","refentry"],["ImmVector<Tv>::toImmVector","hack.immvectortv.toimmvector","refentry"],["ImmVector<Tv>::toKeysArray","hack.immvectortv.tokeysarray","refentry"],["ImmVector<Tv>::toMap","hack.immvectortv.tomap","refentry"],["ImmVector<Tv>::toSet","hack.immvectortv.toset","refentry"],["ImmVector<Tv>::__toString","hack.immvectortv.tostring","refentry"],["ImmVector<Tv>::toValuesArray","hack.immvectortv.tovaluesarray","refentry"],["ImmVector<Tv>::toImmVector","hack.immvectortv.tovector","refentry"],["ImmVector<Tv>::values","hack.immvectortv.values","refentry"],["ImmVector<Tv>::zip<Tu>","hack.immvectortv.ziptu","refentry"],["ImmVector<Tv>","class.hack.immvectortv","phpdoc:classref"],["","class.hack.maptktv","section"],["","class.hack.maptktv","section"],["Map<Tk, Tv>::add","hack.maptktv.add","refentry"],["Map<Tk, Tv>::addAll","hack.maptktv.addall","refentry"],["Map<Tk, Tv>::at","hack.maptktv.at","refentry"],["Map<Tk, Tv>::clear","hack.maptktv.clear","refentry"],["Map<Tk, Tv>::__construct","hack.maptktv.construct","refentry"],["Map<Tk, Tv>::contains","hack.maptktv.contains","refentry"],["Map<Tk, Tv>::containsKey","hack.maptktv.containskey","refentry"],["Map<Tk, Tv>::count","hack.maptktv.count","refentry"],["Map<Tk, Tv>::filter","hack.maptktv.filter","refentry"],["Map<Tk, Tv>::filterWithKey","hack.maptktv.filterwithkey","refentry"],["Map<Tk, Tv>::fromItems","hack.maptktv.fromitems","refentry"],["Map<Tk, Tv>::get","hack.maptktv.get","refentry"],["Map<Tk, Tv>::getIterator","hack.maptktv.getiterator","refentry"],["Map<Tk, Tv>::isEmpty","hack.maptktv.isempty","refentry"],["Map<Tk, Tv>::items","hack.maptktv.items","refentry"],["Map<Tk, Tv>::keys","hack.maptktv.keys","refentry"],["Map<Tk, Tv>::lazy","hack.maptktv.lazy","refentry"],["Map<Tk, Tv>::map<Tu>","hack.maptktv.maptu","refentry"],["Map<Tk, Tv>::mapWithKey<Tu>","hack.maptktv.mapwithkeytu","refentry"],["Map<Tk, Tv>::remove","hack.maptktv.remove","refentry"],["Map<Tk, Tv>::removeKey","hack.maptktv.removekey","refentry"],["Map<Tk, Tv>::set","hack.maptktv.set","refentry"],["Map<Tk, Tv>::setAll","hack.maptktv.setall","refentry"],["Map<Tk, Tv>::toArray","hack.maptktv.toarray","refentry"],["Map<Tk, Tv>::toImmMap","hack.maptktv.toimmmap","refentry"],["Map<Tk, Tv>::toImmVector","hack.maptktv.toimmvector","refentry"],["Map<Tk, Tv>::toImmSet","hack.maptktv.toimmset","refentry"],["Map<Tk, Tv>::toKeysArray","hack.maptktv.tokeysarray","refentry"],["Map<Tk, Tv>::toMap","hack.maptktv.tomap","refentry"],["Map<Tk, Tv>::toSet","hack.maptktv.toset","refentry"],["Map<Tk, Tv>::__toString","hack.maptktv.tostring","refentry"],["Map<Tk, Tv>::toValuesArray","hack.maptktv.tovaluesarray","refentry"],["Map<Tk, Tv>::toVector","hack.maptktv.tovector","refentry"],["Map<Tk, Tv>::values","hack.maptktv.values","refentry"],["Map<Tk, Tv>::zip<Tu>","hack.maptktv.ziptu","refentry"],["Map<Tk, Tv>","class.hack.maptktv","phpdoc:classref"],["","class.hack.immmaptktv","section"],["","class.hack.immmaptktv","section"],["ImmMap<Tk, Tv>::at","hack.immmaptktv.at","refentry"],["ImmMap<Tk, Tv>::__construct","hack.immmaptktv.construct","refentry"],["ImmMap<Tk, Tv>::contains","hack.immmaptktv.contains","refentry"],["ImmMap<Tk, Tv>::containsKey","hack.immmaptktv.containskey","refentry"],["ImmMap<Tk, Tv>::count","hack.immmaptktv.count","refentry"],["ImmMap<Tk, Tv>::differenceByKey","hack.immmaptktv.differencebykey","refentry"],["ImmMap<Tk, Tv>::filter","hack.immmaptktv.filter","refentry"],["ImmMap<Tk, Tv>::filterWithKey","hack.immmaptktv.filterwithkey","refentry"],["ImmMap<Tk, Tv>::fromItems","hack.immmaptktv.fromitems","refentry"],["ImmMap<Tk, Tv>::get","hack.immmaptktv.get","refentry"],["ImmMap<Tk, Tv>::getIterator","hack.immmaptktv.getiterator","refentry"],["ImmMap<Tk, Tv>::isEmpty","hack.immmaptktv.isempty","refentry"],["ImmMap<Tk, Tv>::items","hack.immmaptktv.items","refentry"],["ImmMap<Tk, Tv>::keys","hack.immmaptktv.keys","refentry"],["ImmMap<Tk, Tv>::lazy","hack.immmaptktv.lazy","refentry"],["ImmMap<Tk, Tv>::map<Tu>","hack.immmaptktv.maptu","refentry"],["ImmMap<Tk, Tv>::mapWithKey<Tu>","hack.immmaptktv.mapwithkeytu","refentry"],["ImmMap<Tk, Tv>::toArray","hack.immmaptktv.toarray","refentry"],["ImmMap<Tk, Tv>::toImmMap","hack.immmaptktv.toimmmap","refentry"],["ImmMap<Tk, Tv>::toImmSet","hack.immmaptktv.toimmset","refentry"],["ImmMap<Tk, Tv>::toImmVector","hack.immmaptktv.toimmvector","refentry"],["ImmMap<Tk, Tv>::toKeysArray","hack.immmaptktv.tokeysarray","refentry"],["ImmMap<Tk, Tv>::toMap","hack.immmaptktv.tomap","refentry"],["ImmMap<Tk, Tv>::toSet","hack.immmaptktv.toset","refentry"],["ImmMap<Tk, Tv>::__toString","hack.immmaptktv.tostring","refentry"],["ImmMap<Tk, Tv>::toValuesArray","hack.immmaptktv.tovaluesarray","refentry"],["ImmMap<Tk, Tv>::toVector","hack.immmaptktv.tovector","refentry"],["ImmMap<Tk, Tv>::values","hack.immmaptktv.values","refentry"],["ImmMap<Tk, Tv>::zip<Tu>","hack.immmaptktv.ziptu","refentry"],["ImmMap<Tk, Tv>","class.hack.immmaptktv","phpdoc:classref"],["","class.hack.settv","section"],["","class.hack.settv","section"],["Set<Tv>::add","hack.settv.add","refentry"],["Set<Tv>::addAll","hack.settv.addall","refentry"],["Set<Tv>::clear","hack.settv.clear","refentry"],["Set<Tv>::__construct","hack.settv.construct","refentry"],["Set<Tv>::contains","hack.settv.contains","refentry"],["Set<Tv>::count","hack.settv.count","refentry"],["Set<Tv>::filter","hack.settv.filter","refentry"],["Set<Tv>::fromArrays","hack.settv.fromarrays","refentry"],["Set<Tv>::fromItems","hack.settv.fromitems","refentry"],["Set<Tv>::getIterator","hack.settv.getiterator","refentry"],["Set<Tv>::isEmpty","hack.settv.isempty","refentry"],["Set<Tv>::items","hack.settv.items","refentry"],["Set<Tv>::lazy","hack.settv.lazy","refentry"],["Set<Tv>::map<Tu>","hack.settv.maptu","refentry"],["Set<Tv>::remove","hack.settv.remove","refentry"],["Set<Tv>::removeAll","hack.settv.removeall","refentry"],["Set<Tv>::toArray","hack.settv.toarray","refentry"],["Set<Tv>::toImmSet","hack.settv.toimmset","refentry"],["Set<Tv>::toImmVector","hack.settv.toimmvector","refentry"],["Set<Tv>::toSet","hack.settv.toset","refentry"],["Set<Tv>::__toString","hack.settv.tostring","refentry"],["Set<Tv>::toValuesArray","hack.settv.tovaluesarray","refentry"],["Set<Tv>::toVector","hack.settv.tovector","refentry"],["Set<Tv>::values","hack.settv.values","refentry"],["Set<Tv>::zip<Tu>","hack.settv.ziptu","refentry"],["Set<Tv>","class.hack.settv","phpdoc:classref"],["","class.hack.immsettv","section"],["","class.hack.immsettv","section"],["ImmSet<Tv>::__construct","hack.immsettv.construct","refentry"],["ImmSet<Tv>::contains","hack.immsettv.contains","refentry"],["ImmSet<Tv>::count","hack.immsettv.count","refentry"],["ImmSet<Tv>::filter","hack.immsettv.filter","refentry"],["ImmSet<Tv>::fromArrays","hack.immsettv.fromarrays","refentry"],["ImmSet<Tv>::fromItems","hack.immsettv.fromitems","refentry"],["ImmSet<Tv>::getIterator","hack.immsettv.getiterator","refentry"],["ImmSet<Tv>::isEmpty","hack.immsettv.isempty","refentry"],["ImmSet<Tv>::items","hack.immsettv.items","refentry"],["ImmSet<Tv>::lazy","hack.immsettv.lazy","refentry"],["ImmSet<Tv>::map<Tu>","hack.immsettv.maptu","refentry"],["ImmSet<Tv>::toArray","hack.immsettv.toarray","refentry"],["ImmSet<Tv>::toImmSet","hack.immsettv.toimmset","refentry"],["ImmSet<Tv>::toImmVector","hack.immsettv.toimmvector","refentry"],["ImmSet<Tv>::toSet","hack.immsettv.toset","refentry"],["ImmSet<Tv>::__toString","hack.immsettv.tostring","refentry"],["ImmSet<Tv>::toValuesArray","hack.immsettv.tovaluesarray","refentry"],["ImmSet<Tv>::toVector","hack.immsettv.tovector","refentry"],["ImmSet<Tv>::values","hack.immsettv.values","refentry"],["ImmSet<Tv>::zip<Tu>","hack.immsettv.ziptu","refentry"],["ImmSet<Tv>","class.hack.immsettv","phpdoc:classref"],["","class.hack.pairtv1tv2","section"],["","class.hack.pairtv1tv2","section"],["Pair<Tv1, Tv2>::at","hack.pairtv1tv2.at","refentry"],["Pair<Tv1, Tv2>::__construct","hack.pairtv1tv2.construct","refentry"],["Pair<Tv1, Tv2>::containsKey","hack.pairtv1tv2.containskey","refentry"],["Pair<Tv1, Tv2>::count","hack.pairtv1tv2.count","refentry"],["Pair<Tv1, Tv2>::filter","hack.pairtv1tv2.filter","refentry"],["Pair<Tv1, Tv2>::filterWithKey","hack.pairtv1tv2.filterwithkey","refentry"],["Pair<Tv1, Tv2>::get","hack.pairtv1tv2.get","refentry"],["Pair<Tv1, Tv2>::getIterator","hack.pairtv1tv2.getiterator","refentry"],["Pair<Tv1, Tv2>::isEmpty","hack.pairtv1tv2.isempty","refentry"],["Pair<Tv1, Tv2>::keys","hack.pairtv1tv2.keys","refentry"],["Pair<Tv1, Tv2>::lazy","hack.pairtv1tv2.lazy","refentry"],["Pair<Tv1, Tv2>::map<Tu>","hack.pairtv1tv2.maptu","refentry"],["Pair<Tv1, Tv2>::mapWithKey<Tu>","hack.pairtv1tv2.mapwithkeytu","refentry"],["Pair<Tv1, Tv2>::toArray","hack.pairtv1tv2.toarray","refentry"],["Pair<Tv1, Tv2>::toKeysArray","hack.pairtv1tv2.tokeysarray","refentry"],["Pair<Tv1, Tv2>::toMap","hack.pairtv1tv2.tomap","refentry"],["Pair<Tv1, Tv2>::toSet","hack.pairtv1tv2.toset","refentry"],["Pair<Tv1, Tv2>::__toString","hack.pairtv1tv2.tostring","refentry"],["Pair<Tv1, Tv2>::toValuesArray","hack.pairtv1tv2.tovaluesarray","refentry"],["Pair<Tv1, Tv2>::toVector","hack.pairtv1tv2.tovector","refentry"],["Pair<Tv1, Tv2>::values","hack.pairtv1tv2.values","refentry"],["Pair<Tv1, Tv2>::zip<Tu>","hack.pairtv1tv2.ziptu","refentry"],["Pair<Tv1, Tv2>","class.hack.pairtv1tv2","phpdoc:classref"],["","class.hack.constvectortv","section"],["","class.hack.constvectortv","section"],["ConstVector<Tv>::filter","hack.constvectortv.filter","refentry"],["ConstVector<Tv>::filterWithKey","hack.constvectortv.filterwithkey","refentry"],["ConstVector<Tv>::keys","hack.constvectortv.keys","refentry"],["ConstVector<Tv>::map<Tu>","hack.constvectortv.map","refentry"],["ConstVector<Tv>::mapWithKey<Tu>","hack.constvectortv.mapwithkey","refentry"],["ConstVector<Tv>::zip<Tu>","hack.constvectortv.zip","refentry"],["ConstVector<Tv>","class.hack.constvectortv","phpdoc:classref"],["","class.hack.mutablevectortv","section"],["","class.hack.mutablevectortv","section"],["MutableVector<Tv>::filter","hack.mutablevectortv.filter","refentry"],["MutableVector<Tv>::filterWithKey","hack.mutablevectortv.filterwithkey","refentry"],["MutableVector<Tv>::keys","hack.mutablevectortv.keys","refentry"],["MutableVector<Tv>::map<Tu>","hack.mutablevectortv.map","refentry"],["MutableVector<Tv>::mapWithKey<Tu>","hack.mutablevectortv.mapwithkey","refentry"],["MutableVector<Tv>::zip<Tu>","hack.mutablevectortv.zip","refentry"],["MutableVector<Tv>","class.hack.mutablevectortv","phpdoc:classref"],["","class.hack.constmaptktv","section"],["","class.hack.constmaptktv","section"],["ConstMap<Tk, Tv>::filter","hack.constmaptktv.filter","refentry"],["ConstMap<Tk, Tv>::filterWithKey","hack.constmaptktv.filterwithkey","refentry"],["ConstMap<Tk, Tv>::keys","hack.constmaptktv.keys","refentry"],["ConstMap<Tk, Tv>::map<Tu>","hack.constmaptktv.map","refentry"],["ConstMap<Tk, Tv>::mapWithKey<Tu>","hack.constmaptktv.mapwithkey","refentry"],["ConstMap<Tk, Tv>::zip<Tu>","hack.constmaptktv.zip","refentry"],["ConstMap<Tk, Tv>","class.hack.constmaptktv","phpdoc:classref"],["","class.hack.mutablemaptktv","section"],["","class.hack.mutablemaptktv","section"],["MutableMap<Tk, Tv>::filter","hack.mutablemaptktv.filter","refentry"],["MutableMap<Tk, Tv>::filterWithKey","hack.mutablemaptktv.filterwithkey","refentry"],["MutableMap<Tk, Tv>::keys","hack.mutablemaptktv.keys","refentry"],["MutableMap<Tk, Tv>::map<Tu>","hack.mutablemaptktv.map","refentry"],["MutableMap<Tk, Tv>::mapWithKey<Tu>","hack.mutablemaptktv.mapwithkey","refentry"],["MutableMap<Tk, Tv>::zip<Tu>","hack.mutablemaptktv.zip","refentry"],["MutableMap<Tk, Tv>","class.hack.mutablemaptktv","phpdoc:classref"],["","class.hack.constsettv","section"],["","class.hack.constsettv","section"],["ConstSet<Tv>::filter","hack.constsettv.filter","refentry"],["ConstSet<Tv>::map<Tu>","hack.constsettv.map","refentry"],["ConstSet<Tv>::zip<Tu>","hack.constsettv.zip","refentry"],["ConstSet<Tv>","class.hack.constsettv","phpdoc:classref"],["","class.hack.mutablesettv","section"],["","class.hack.mutablesettv","section"],["MutableSet<Tv>::filter","hack.mutablesettv.filter","refentry"],["MutableSet<Tv>::map<Tu>","hack.mutablesettv.map","refentry"],["MutableSet<Tv>::zip<Tu>","hack.mutablesettv.zip","refentry"],["MutableSet<Tv>","class.hack.mutablesettv","phpdoc:classref"],["","class.hack.constsetaccesstm","section"],["","class.hack.constsetaccesstm","section"],["ConstSetAccess<Tm>::contains","hack.constsetaccesstm.contains","refentry"],["ConstSetAccess<Te>","class.hack.constsetaccesstm","phpdoc:classref"],["","class.hack.setaccesstm","section"],["","class.hack.setaccesstm","section"],["SetAccess<Tm>::remove","hack.setaccesstm.remove","refentry"],["SetAccess<Te>","class.hack.setaccesstm","phpdoc:classref"],["","class.hack.constindexaccesstktv","section"],["","class.hack.constindexaccesstktv","section"],["ConstIndexAccess<Tk, Tv>::at","hack.constindexaccesstktv.at","refentry"],["ConstIndexAccess<Tk, Tv>::containsKey","hack.constindexaccesstktv.containskey","refentry"],["ConstIndexAccess<Tk, Tv>::get","hack.constindexaccesstktv.get","refentry"],["ConstIndexAccess<Tk, Tv>","class.hack.constindexaccesstktv","phpdoc:classref"],["","class.hack.indexaccesstktv","section"],["","class.hack.indexaccesstktv","section"],["IndexAccess<Tk, Tv>::removeKey","hack.indexaccesstktv.removekey","refentry"],["IndexAccess<Tk, Tv>::set","hack.indexaccesstktv.set","refentry"],["IndexAccess<Tk, Tv>::setAll","hack.indexaccesstktv.setall","refentry"],["IndexAccess<Tk, Tv>","class.hack.indexaccesstktv","phpdoc:classref"],["","class.hack.constmapaccesstktv","section"],["","class.hack.constmapaccesstktv","section"],["ConstMapAccess<Tk,Tv>","class.hack.constmapaccesstktv","phpdoc:classref"],["","class.hack.mapaccesstktv","section"],["","class.hack.mapaccesstktv","section"],["MapAccess<Tk,Tv>","class.hack.mapaccesstktv","phpdoc:classref"],["","class.hack.constcollectionte","section"],["","class.hack.constcollectionte","section"],["ConstCollection<Te>::count","hack.constcollectionte.count","refentry"],["ConstCollection<Te>::isEmpty","hack.constcollectionte.isempty","refentry"],["ConstCollection<Te>::items","hack.constcollectionte.items","refentry"],["ConstCollection<Te>","class.hack.constcollectionte","phpdoc:classref"],["","class.hack.outputcollectionte","section"],["","class.hack.outputcollectionte","section"],["OutputCollection<Te>::add","hack.outputcollectionte.add","refentry"],["OutputCollection<Te>::addAll","hack.outputcollectionte.addall","refentry"],["OutputCollection<Te>","class.hack.outputcollectionte","phpdoc:classref"],["","class.hack.collectionte","section"],["","class.hack.collectionte","section"],["Collection<Te>::clear","hack.collectionte.clear","refentry"],["Collection<Te>","class.hack.collectionte","phpdoc:classref"],["","book.hackcollections","book"],["","intro.enums","preface"],["Enum::getValues","function.hack.enums.getvalues","refentry"],["Enum::getNames","function.hack.enums.getnames","refentry"],["Enum::isValid","function.hack.enums.isvalid","refentry"],["Enum::coerce","function.hack.enums.coerce","refentry"],["Enum::assert","function.hack.enums.assert","refentry"],["Enum::assertAll","function.hack.enums.assertall","refentry"],["","ref.enums","reference"],["","book.enums","book"],["","intro.hackmagic","preface"],["","function.hack.invariant","example"],["","function.hack.invariant","example"],["invariant","function.hack.invariant","refentry"],["","function.hack.invariant_violation","example"],["invariant_violation","function.hack.invariant_violation","refentry"],["","function.hack.invariant_callback_register","example"],["invariant_callback_register","function.hack.invariant_callback_register","refentry"],["","function.hack.fun","example"],["","function.hack.fun","example"],["fun","function.hack.fun","refentry"],["","function.hack.class_meth","example"],["","function.hack.class_meth","example"],["","function.hack.class_meth","example"],["class_meth","function.hack.class_meth","refentry"],["","function.hack.inst_meth","example"],["","function.hack.inst_meth","example"],["","function.hack.inst_meth","example"],["inst_meth","function.hack.inst_meth","refentry"],["","function.hack.meth_caller","example"],["","function.hack.meth_caller","example"],["","function.hack.meth_caller","example"],["meth_caller","function.hack.meth_caller","refentry"],["","ref.hackmagic","reference"],["","book.hackmagic","book"],["","intro.async.mysql","preface"],["","hack.async.mysql.examples","example"],["","hack.async.mysql.examples","chapter"],["","class.hack.async.mysql.asyncmysqlclient","section"],["","class.hack.async.mysql.asyncmysqlclient","section"],["AsyncMysqlClient::adoptConnection","hack.async.mysql.asyncmysqlclient.adoptconnection","refentry"],["AsyncMysqlClient::connect","hack.async.mysql.asyncmysqlclient.connect","refentry"],["AsyncMysqlClient::setPoolsConnectionLimit","hack.async.mysql.asyncmysqlclient.setpoolsconnectionslimit","refentry"],["AsyncMysqlClient","class.hack.async.mysql.asyncmysqlclient","phpdoc:classref"],["","class.hack.async.mysql.asyncmysqlconnectionpool","section"],["","class.hack.async.mysql.asyncmysqlconnectionpool","section"],["AsyncMysqlConnectionPool::__construct","hack.async.mysql.asyncmysqlconnectionpool.construct","refentry"],["AsyncMysqlConnectionPool::connect","hack.async.mysql.asyncmysqlconnectionpool.connect","refentry"],["AsyncMysqlConnectionPool::getPoolStats","hack.async.mysql.asyncmysqlconnectionpool.getpoolstats","refentry"],["AsyncMysqlConnectionPool","class.hack.async.mysql.asyncmysqlconnectionpool","phpdoc:classref"],["","class.hack.async.mysql.asyncmysqlconnection","section"],["","class.hack.async.mysql.asyncmysqlconnection","section"],["AsyncMysqlConnection::close","hack.async.mysql.asyncmysqlconnection.close","refentry"],["AsyncMysqlConnection::escapeString","hack.async.mysql.asyncmysqlconnection.escapestring","refentry"],["AsyncMysqlConnection::host","hack.async.mysql.asyncmysqlconnection.host","refentry"],["AsyncMysqlConnection::isReusable","hack.async.mysql.asyncmysqlconnection.isreusable","refentry"],["AsyncMysqlConnection::multiQuery","hack.async.mysql.asyncmysqlconnection.multiquery","refentry"],["AsyncMysqlConnection::port","hack.async.mysql.asyncmysqlconnection.port","refentry"],["AsyncMysqlConnection::query","hack.async.mysql.asyncmysqlconnection.query","refentry"],["AsyncMysqlConnection::queryf","hack.async.mysql.asyncmysqlconnection.queryf","refentry"],["AsyncMysqlConnection::releaseConnection","hack.async.mysql.asyncmysqlconnection.releaseconnection","refentry"],["AsyncMysqlConnection::serverInfo","hack.async.mysql.asyncmysqlconnection.serverinfo","refentry"],["AsyncMysqlConnection::setReusable","hack.async.mysql.asyncmysqlconnection.setreusable","refentry"],["AsyncMysqlConnection::warningCount","hack.async.mysql.asyncmysqlconnection.warningcount","refentry"],["AsyncMysqlConnection","class.hack.async.mysql.asyncmysqlconnection","phpdoc:classref"],["","class.hack.async.mysql.asyncmysqlresult","section"],["","class.hack.async.mysql.asyncmysqlresult","section"],["AsyncMysqlResult::elapsedMicros","hack.async.mysql.asyncmysqlresult.elapsedmicros","refentry"],["AsyncMysqlResult::endTime","hack.async.mysql.asyncmysqlresult.endtime","refentry"],["AsyncMysqlResult::startTime","hack.async.mysql.asyncmysqlresult.starttime","refentry"],["AsyncMysqlResult","class.hack.async.mysql.asyncmysqlresult","phpdoc:classref"],["","class.hack.async.mysql.asyncmysqlerrorresult","section"],["","class.hack.async.mysql.asyncmysqlerrorresult","section"],["AsyncMysqlErrorResult::elapsedMicros","hack.async.mysql.asyncmysqlerrorresult.elapsedmicros","refentry"],["AsyncMysqlErrorResult::endTime","hack.async.mysql.asyncmysqlerrorresult.endtime","refentry"],["AsyncMysqlErrorResult::failureType","hack.async.mysql.asyncmysqlerrorresult.failuretype","refentry"],["AsyncMysqlErrorResult::mysql_errno","hack.async.mysql.asyncmysqlerrorresult.mysqlerrno","refentry"],["AsyncMysqlErrorResult::mysql_error","hack.async.mysql.asyncmysqlerrorresult.mysqlerror","refentry"],["AsyncMysqlErrorResult::startTime","hack.async.mysql.asyncmysqlerrorresult.starttime","refentry"],["AsyncMysqlErrorResult","class.hack.async.mysql.asyncmysqlerrorresult","phpdoc:classref"],["","class.hack.async.mysql.asyncmysqlqueryerrorresult","section"],["","class.hack.async.mysql.asyncmysqlqueryerrorresult","section"],["AsyncMysqlQueryErrorResult::getSuccessfulQueries","hack.async.mysql.asyncmysqlqueryerrorresult.getsuccessfulqueries","refentry"],["AsyncMysqlQueryErrorResult::numSuccessfulQueries","hack.async.mysql.asyncmysqlqueryerrorresult.numsuccessfulqueries","refentry"],["AsyncMysqlQueryErrorResult","class.hack.async.mysql.asyncmysqlqueryerrorresult","phpdoc:classref"],["","class.hack.async.mysql.asyncmysqlqueryresult","section"],["","class.hack.async.mysql.asyncmysqlqueryresult","section"],["AsyncMysqlQueryResult::elapsedMicros","hack.async.mysql.asyncmysqlqueryresult.elapsedmicros","refentry"],["AsyncMysqlQueryResult::endTime","hack.async.mysql.asyncmysqlqueryresult.endtime","refentry"],["AsyncMysqlQueryResult::lastInsertId","hack.async.mysql.asyncmysqlqueryresult.lastinsertid","refentry"],["AsyncMysqlQueryResult::mapRows","hack.async.mysql.asyncmysqlqueryresult.maprows","refentry"],["AsyncMysqlQueryResult::mapRowsTyped","hack.async.mysql.asyncmysqlqueryresult.maprowstyped","refentry"],["AsyncMysqlQueryResult::numRows","hack.async.mysql.asyncmysqlqueryresult.numrows","refentry"],["AsyncMysqlQueryResult::numRowsAffected","hack.async.mysql.asyncmysqlqueryresult.numrowsaffected","refentry"],["AsyncMysqlQueryResult::rowBlocks","hack.async.mysql.asyncmysqlqueryresult.rowblocks","refentry"],["AsyncMysqlQueryResult::startTime","hack.async.mysql.asyncmysqlqueryresult.starttime","refentry"],["AsyncMysqlQueryResult::vectorRows","hack.async.mysql.asyncmysqlqueryresult.vectorrows","refentry"],["AsyncMysqlQueryResult::vectorRowsTyped","hack.async.mysql.asyncmysqlqueryresult.vectorrowstyped","refentry"],["AsyncMysqlQueryResult","class.hack.async.mysql.asyncmysqlqueryresult","phpdoc:classref"],["","class.hack.async.mysql.asyncmysqlrowblock","section"],["","class.hack.async.mysql.asyncmysqlrowblock","section"],["AsyncMysqlRowBlock::at","hack.async.mysql.asyncmysqlrowblock.at","refentry"],["AsyncMysqlRowBlock::count","hack.async.mysql.asyncmysqlrowblock.count","refentry"],["AsyncMysqlRowBlock::fieldFlags","hack.async.mysql.asyncmysqlrowblock.fieldflags","refentry"],["AsyncMysqlRowBlock::fieldName","hack.async.mysql.asyncmysqlrowblock.fieldname","refentry"],["AsyncMysqlRowBlock::fieldsCount","hack.async.mysql.asyncmysqlrowblock.fieldscount","refentry"],["AsyncMysqlRowBlock::fieldType","hack.async.mysql.asyncmysqlrowblock.fieldtype","refentry"],["AsyncMysqlRowBlock::getFieldAsDouble","hack.async.mysql.asyncmysqlrowblock.getfieldasdouble","refentry"],["AsyncMysqlRowBlock::getFieldAsInt","hack.async.mysql.asyncmysqlrowblock.getfieldasint","refentry"],["AsyncMysqlRowBlock::getFieldAsString","hack.async.mysql.asyncmysqlrowblock.getfieldasstring","refentry"],["AsyncMysqlRowBlock::getIterator","hack.async.mysql.asyncmysqlrowblock.getiterator","refentry"],["AsyncMysqlRowBlock::getRow","hack.async.mysql.asyncmysqlrowblock.getrow","refentry"],["AsyncMysqlRowBlock::isEmpty","hack.async.mysql.asyncmysqlrowblock.isempty","refentry"],["AsyncMysqlRowBlock::isNull","hack.async.mysql.asyncmysqlrowblock.isnull","refentry"],["AsyncMysqlRowBlock","class.hack.async.mysql.asyncmysqlrowblock","phpdoc:classref"],["","class.hack.async.mysql.asyncmysqlrowblockiterator","section"],["","class.hack.async.mysql.asyncmysqlrowblockiterator","section"],["AsyncMysqlRowBlockIterator::current","hack.async.mysql.asyncmysqlrowblockiterator.current","refentry"],["AsyncMysqlRowBlockIterator::key","hack.async.mysql.asyncmysqlrowblockiterator.key","refentry"],["AsyncMysqlRowBlockIterator::next","hack.async.mysql.asyncmysqlrowblockiterator.next","refentry"],["AsyncMysqlRowBlockIterator::rewind","hack.async.mysql.asyncmysqlrowblockiterator.rewind","refentry"],["AsyncMysqlRowBlockIterator::valid","hack.async.mysql.asyncmysqlrowblockiterator.valid","refentry"],["AsyncMysqlRowBlockIterator","class.hack.async.mysql.asyncmysqlrowblockiterator","phpdoc:classref"],["","class.hack.async.mysql.asyncmysqlrow","section"],["","class.hack.async.mysql.asyncmysqlrow","section"],["AsyncMysqlRow::at","hack.async.mysql.asyncmysqlrow.at","refentry"],["AsyncMysqlRow::count","hack.async.mysql.asyncmysqlrow.count","refentry"],["AsyncMysqlRow::fieldType","hack.async.mysql.asyncmysqlrow.fieldtype","refentry"],["AsyncMysqlRow::getFieldAsDouble","hack.async.mysql.asyncmysqlrow.getfieldasdouble","refentry"],["AsyncMysqlRow::getFieldAsInt","hack.async.mysql.asyncmysqlrow.getfieldasint","refentry"],["AsyncMysqlRow::getFieldAsString","hack.async.mysql.asyncmysqlrow.getfieldasstring","refentry"],["AsyncMysqlRow::getIterator","hack.async.mysql.asyncmysqlrow.getiterator","refentry"],["AsyncMysqlRow::isNull","hack.async.mysql.asyncmysqlrow.isnull","refentry"],["AsyncMysqlRow","class.hack.async.mysql.asyncmysqlrow","phpdoc:classref"],["","class.hack.async.mysql.asyncmysqlrowiterator","section"],["","class.hack.async.mysql.asyncmysqlrowiterator","section"],["AsyncMysqlRowIterator::current","hack.async.mysql.asyncmysqlrowiterator.current","refentry"],["AsyncMysqlRowIterator::key","hack.async.mysql.asyncmysqlrowiterator.key","refentry"],["AsyncMysqlRowIterator::next","hack.async.mysql.asyncmysqlrowiterator.next","refentry"],["AsyncMysqlRowIterator::rewind","hack.async.mysql.asyncmysqlrowiterator.rewind","refentry"],["AsyncMysqlRowIterator::valid","hack.async.mysql.asyncmysqlrowiterator.valid","refentry"],["AsyncMysqlRowIterator","class.hack.async.mysql.asyncmysqlrowiterator","phpdoc:classref"],["Async Mysql","book.hack.async.mysql","book"],["","intro.mcrouter","preface"],["","hack.mcrouter.examples","example"],["","hack.mcrouter.examples","example"],["","hack.mcrouter.examples","chapter"],["","class.hack.mcrouter.mcrouter","section"],["","class.hack.mcrouter.mcrouter","section"],["MCRouter::add","hack.mcrouter.mcrouter.add","refentry"],["MCRouter::append","hack.mcrouter.mcrouter.append","refentry"],["MCRouter::__construct","hack.mcrouter.mcrouter.construct","refentry"],["MCRouter::createSimple","hack.mcrouter.mcrouter.createsimple","refentry"],["MCRouter::incr","hack.mcrouter.mcrouter.decr","refentry"],["MCRouter::del","hack.mcrouter.mcrouter.del","refentry"],["MCRouter::flushAll","hack.mcrouter.mcrouter.flushall","refentry"],["MCRouter::getOpName","hack.mcrouter.mcrouter.getopname","refentry"],["MCRouter::getResultName","hack.mcrouter.mcrouter.getresultname","refentry"],["MCRouter::get","hack.mcrouter.mcrouter.get","refentry"],["MCRouter::incr","hack.mcrouter.mcrouter.incr","refentry"],["MCRouter::prepend","hack.mcrouter.mcrouter.prepend","refentry"],["MCRouter::replace","hack.mcrouter.mcrouter.replace","refentry"],["MCRouter::set","hack.mcrouter.mcrouter.set","refentry"],["MCRouter::version","hack.mcrouter.mcrouter.version","refentry"],["MCRouter","class.hack.mcrouter.mcrouter","phpdoc:classref"],["","class.hack.mcrouter.mcrouterexception","section"],["","class.hack.mcrouter.mcrouterexception","section"],["MCRouterException::__construct","hack.mcrouter.mcrouterexception.construct","refentry"],["MCRouterException::getKey","hack.mcrouter.mcrouterexception.getkey","refentry"],["MCRouterException::getOp","hack.mcrouter.mcrouterexception.getop","refentry"],["MCRouterException","class.hack.mcrouter.mcrouterexception","phpdoc:classref"],["","class.hack.mcrouter.mcrouteroptionexception","section"],["","class.hack.mcrouter.mcrouteroptionexception","section"],["MCRouterOptionException::__construct","hack.mcrouter.mcrouteroptionexception.construct","refentry"],["MCRouterOptionException::getErrors","hack.mcrouter.mcrouteroptionexception.geterrors","refentry"],["MCRouterOptionException","class.hack.mcrouter.mcrouteroptionexception","phpdoc:classref"],["MCRouter","book.hack.mcrouter","book"],["","intro.asio","preface"],["later","hack.asio.function.later","refentry"],["","hack.asio.function.m","example"],["HH\\Asio\\m","hack.asio.function.m","refentry"],["mc","hack.asio.function.mc","refentry"],["mcw","hack.asio.function.mcw","refentry"],["mf","hack.asio.function.mf","refentry"],["mfk","hack.asio.function.mfk","refentry"],["mm","hack.asio.function.mm","refentry"],["mmk","hack.asio.function.mmk","refentry"],["mw","hack.asio.function.mw","refentry"],["usleep","hack.asio.function.usleep","refentry"],["","hack.asio.function.v","example"],["HH\\Asio\\v","hack.asio.function.v","refentry"],["va","hack.asio.function.va","refentry"],["vac","hack.asio.function.vac","refentry"],["vacw","hack.asio.function.vacw","refentry"],["val","hack.asio.function.val","refentry"],["vaw","hack.asio.function.vaw","refentry"],["vc","hack.asio.function.vc","refentry"],["vcw","hack.asio.function.vcw","refentry"],["vf","hack.asio.function.vf","refentry"],["vfk","hack.asio.function.vfk","refentry"],["vm","hack.asio.function.vm","refentry"],["vmk","hack.asio.function.vmk","refentry"],["vw","hack.asio.function.vw","refentry"],["wrap","hack.asio.function.wrap","refentry"],["","hack.ref.asio","reference"],["","class.hack.asio.resultorexceptionwrapper","section"],["ResultOrExceptionWrapper::getException","hack.asio.resultexceptionwrapper.getexception","refentry"],["ResultOrExceptionWrapper::getResult","hack.asio.resultexceptionwrapper.getresult","refentry"],["ResultOrExceptionWrapper::isFailed","hack.asio.resultexceptionwrapper.isfailed","refentry"],["ResultOrExceptionWrapper::isSucceeded","hack.asio.resultexceptionwrapper.issucceeded","refentry"],["ResultOrExceptionWrapper","class.hack.asio.resultorexceptionwrapper","phpdoc:classref"],["","class.hack.asio.wrappedexception","section"],["WrappedException::__construct","hack.asio.wrappedexception.construct","refentry"],["WrappedException::getException","hack.asio.wrappedexception.getexception","refentry"],["WrappedException::getResult","hack.asio.wrappedexception.getresult","refentry"],["WrappedException::isFailed","hack.asio.wrappedexception.isfailed","refentry"],["WrappedException::isSucceeded","hack.asio.wrappedexception.issucceeded","refentry"],["WrappedException","class.hack.asio.wrappedexception","phpdoc:classref"],["","class.hack.asio.wrappedresult","section"],["WrappedResult::__construct","hack.asio.wrappederesult.construct","refentry"],["WrappedResult::getException","hack.asio.wrappedresult.getexception","refentry"],["WrappedResult::getResult","hack.asio.wrappedresult.getresult","refentry"],["WrappedResult::isFailed","hack.asio.wrappedresult.isfailed","refentry"],["WrappedResult::isSucceeded","hack.asio.wrappedresult.issucceeded","refentry"],["WrappedResult","class.hack.asio.wrappedresult","phpdoc:classref"],["asio","book.hack.asio","book"],["","hackfuncref","set"],["","language.basic-syntax.phptags","sect1"],["","language.basic-syntax.phpmode","example"],["","language.basic-syntax.phpmode","example"],["","language.basic-syntax.phpmode","example"],["","language.basic-syntax.phpmode","sect1"],["","language.basic-syntax.instruction-separation","sect1"],["","language.basic-syntax.comments","sect1"],["","language.basic-syntax","chapter"],["","language.types.intro","sect1"],["","language.types.boolean","sect2"],["","language.types.boolean","sect2"],["","language.types.boolean","sect1"],["","language.types.integer","example"],["","language.types.integer","example"],["","language.types.integer","sect2"],["","language.types.integer","example"],["","language.types.integer","example"],["","language.types.integer","sect2"],["","language.types.integer","sect3"],["","language.types.integer","sect3"],["","language.types.integer","sect3"],["","language.types.integer","sect3"],["","language.types.integer","sect2"],["","language.types.integer","sect1"],["","language.types.float","warning"],["","language.types.float","sect2"],["","language.types.float","sect2"],["","language.types.float","sect2"],["","language.types.float","sect1"],["","language.types.string","sect3"],["","language.types.string","sect3"],["","language.types.string","example"],["","language.types.string","example"],["","language.types.string","example"],["","language.types.string","example"],["","language.types.string","example"],["","language.types.string","sect3"],["","language.types.string","example"],["","language.types.string","example"],["","language.types.string","sect3"],["","language.types.string","example"],["","language.types.string","sect4"],["","language.types.string","sect4"],["","language.types.string","sect3"],["","language.types.string","example"],["","language.types.string","example"],["","language.types.string","sect3"],["","language.types.string","sect2"],["","language.types.string","sect2"],["","language.types.string","sect2"],["","language.types.string","sect2"],["","language.types.string","sect2"],["","language.types.string","sect1"],["","language.types.array","example"],["","language.types.array","example"],["","language.types.array","example"],["","language.types.array","example"],["","language.types.array","example"],["","language.types.array","sect3"],["","language.types.array","example"],["","language.types.array","example"],["","language.types.array","sect3"],["","language.types.array","sect3"],["","language.types.array","sect2"],["","language.types.array","sect2"],["","language.types.array","sect4"],["","language.types.array","sect3"],["","language.types.array","sect2"],["","language.types.array","sect2"],["","language.types.array","sect2"],["","language.types.array","example"],["","language.types.array","example"],["","language.types.array","example"],["","language.types.array","example"],["","language.types.array","example"],["","language.types.array","example"],["","language.types.array","example"],["","language.types.array","sect2"],["","language.types.array","sect1"],["","language.types.object","sect2"],["","language.types.object","sect2"],["","language.types.object","sect1"],["","language.types.resource","sect2"],["","language.types.resource","sect2"],["","language.types.resource","sect1"],["","language.types.null","sect2"],["","language.types.null","sect2"],["","language.types.null","sect1"],["","language.types.callable","example"],["","language.types.callable","example"],["","language.types.callable","sect2"],["","language.types.callable","sect1"],["","language.pseudo-types","sect2"],["","language.pseudo-types","sect2"],["","language.pseudo-types","sect2"],["","language.pseudo-types","sect2"],["","language.pseudo-types","sect2"],["","language.pseudo-types","sect1"],["","language.types.type-juggling","sect2"],["","language.types.type-juggling","sect1"],["","language.types","chapter"],["","language.variables.basics","example"],["","language.variables.basics","sect1"],["","language.variables.predefined","sect1"],["","language.variables.scope","warning"],["","language.variables.scope","example"],["","language.variables.scope","example"],["","language.variables.scope","example"],["","language.variables.scope","sect2"],["","language.variables.scope","example"],["","language.variables.scope","example"],["","language.variables.scope","example"],["","language.variables.scope","example"],["","language.variables.scope","sect2"],["","language.variables.scope","sect2"],["","language.variables.scope","sect1"],["","language.variables.variable","example"],["","language.variables.variable","sect1"],["","language.variables.external","example"],["","language.variables.external","example"],["","language.variables.external","example"],["","language.variables.external","sect3"],["","language.variables.external","sect2"],["","language.variables.external","example"],["","language.variables.external","sect2"],["","language.variables.external","sect2"],["","language.variables.external","sect2"],["","language.variables.external","sect1"],["","language.variables","chapter"],["","language.constants","example"],["","language.constants.syntax","example"],["","language.constants.syntax","example"],["","language.constants.syntax","sect1"],["","language.constants.predefined","sect1"],["","language.constants","chapter"],["","language.expressions","chapter"],["","language.operators.precedence","example"],["","language.operators.precedence","example"],["","language.operators.precedence","sect1"],["","language.operators.arithmetic","sect1"],["","language.operators.assignment","example"],["","language.operators.assignment","sect2"],["","language.operators.assignment","sect1"],["","language.operators.bitwise","example"],["","language.operators.bitwise","example"],["","language.operators.bitwise","example"],["","language.operators.bitwise","sect1"],["","language.operators.comparison","table"],["","language.operators.comparison","example"],["","language.operators.comparison","example"],["","language.operators.comparison","example"],["","language.operators.comparison","example"],["","language.operators.comparison","sect2"],["","language.operators.comparison","sect1"],["","language.operators.errorcontrol","sect1"],["","language.operators.execution","sect1"],["","language.operators.increment","example"],["","language.operators.increment","sect1"],["","language.operators.logical","example"],["","language.operators.logical","sect1"],["","language.operators.string","sect1"],["","language.operators.array","example"],["","language.operators.array","sect1"],["","language.operators.type","example"],["","language.operators.type","example"],["","language.operators.type","example"],["","language.operators.type","example"],["","language.operators.type","example"],["","language.operators.type","example"],["","language.operators.type","example"],["","language.operators.type","sect1"],["","language.operators","chapter"],["","control-structures.intro","sect1"],["","control-structures.if","sect1"],["","control-structures.else","sect1"],["","control-structures.elseif","sect1"],["","control-structures.alternative-syntax","sect1"],["","control-structures.while","sect1"],["","control-structures.do.while","sect1"],["","control-structures.for","sect1"],["","control-structures.foreach","sect2"],["","control-structures.foreach","sect1"],["","control-structures.break","sect1"],["","control-structures.continue","sect1"],["","control-structures.switch","example"],["","control-structures.switch","example"],["","control-structures.switch","sect1"],["","control-structures.declare","example"],["","control-structures.declare","example"],["","control-structures.declare","sect2"],["","control-structures.declare","example"],["","control-structures.declare","sect2"],["","control-structures.declare","sect1"],["","function.return","sect1"],["","function.require","sect1"],["","function.include","example"],["","function.include","example"],["","function.include","example"],["","function.include","example"],["","function.include","example"],["","function.include","example"],["","function.include","sect1"],["","function.require-once","sect1"],["","function.include-once","example"],["","function.include-once","sect1"],["","control-structures.goto","example"],["","control-structures.goto","example"],["","control-structures.goto","example"],["","control-structures.goto","sect1"],["","language.control-structures","chapter"],["","functions.user-defined","example"],["","functions.user-defined","example"],["","functions.user-defined","example"],["","functions.user-defined","example"],["","functions.user-defined","sect1"],["","functions.arguments","example"],["","functions.arguments","example"],["","functions.arguments","sect2"],["","functions.arguments","example"],["","functions.arguments","example"],["","functions.arguments","example"],["","functions.arguments","example"],["","functions.arguments","sect2"],["","functions.arguments","sect2"],["","functions.arguments","sect1"],["","functions.returning-values","example"],["","functions.returning-values","example"],["","functions.returning-values","example"],["","functions.returning-values","sect1"],["","functions.variable-functions","example"],["","functions.variable-functions","example"],["","functions.variable-functions","example"],["","functions.variable-functions","sect1"],["","functions.internal","sect1"],["","functions.anonymous","example"],["","functions.anonymous","example"],["","functions.anonymous","example"],["","functions.anonymous","sect1"],["","language.functions","chapter"],["","oop5.intro","sect1"],["","language.oop5.basic","example"],["","language.oop5.basic","example"],["","language.oop5.basic","sect2"],["","language.oop5.basic","example"],["","language.oop5.basic","example"],["","language.oop5.basic","example"],["","language.oop5.basic","sect2"],["","language.oop5.basic","example"],["","language.oop5.basic","sect2"],["","language.oop5.basic","example"],["","language.oop5.basic","sect2"],["","language.oop5.basic","sect1"],["","language.oop5.properties","example"],["","language.oop5.properties","example"],["","language.oop5.properties","sect1"],["","language.oop5.constants","example"],["","language.oop5.constants","example"],["","language.oop5.constants","sect1"],["","language.oop5.autoload","example"],["","language.oop5.autoload","example"],["","language.oop5.autoload","example"],["","language.oop5.autoload","example"],["","language.oop5.autoload","sect1"],["","language.oop5.decon","methodsynopsis"],["","language.oop5.decon","example"],["","language.oop5.decon","example"],["","language.oop5.decon","sect2"],["","language.oop5.decon","methodsynopsis"],["","language.oop5.decon","example"],["","language.oop5.decon","sect2"],["","language.oop5.decon","sect1"],["","language.oop5.visibility","example"],["","language.oop5.visibility","sect2"],["","language.oop5.visibility","example"],["","language.oop5.visibility","sect2"],["","language.oop5.visibility","example"],["","language.oop5.visibility","sect2"],["","language.oop5.visibility","sect1"],["","language.oop5.inheritance","example"],["","language.oop5.inheritance","sect2"],["","language.oop5.inheritance","sect1"],["","language.oop5.paamayim-nekudotayim","example"],["","language.oop5.paamayim-nekudotayim","example"],["","language.oop5.paamayim-nekudotayim","example"],["","language.oop5.paamayim-nekudotayim","sect1"],["","language.oop5.static","example"],["","language.oop5.static","example"],["","language.oop5.static","sect1"],["","language.oop5.abstract","example"],["","language.oop5.abstract","example"],["","language.oop5.abstract","sect1"],["","language.oop5.interfaces","sect2"],["","language.oop5.interfaces","sect2"],["","language.oop5.interfaces","example"],["","language.oop5.interfaces","example"],["","language.oop5.interfaces","example"],["","language.oop5.interfaces","example"],["","language.oop5.interfaces","sect2"],["","language.oop5.interfaces","sect1"],["","language.oop5.traits","example"],["","language.oop5.traits","example"],["","language.oop5.traits","example"],["","language.oop5.traits","sect2"],["","language.oop5.traits","example"],["","language.oop5.traits","sect2"],["","language.oop5.traits","example"],["","language.oop5.traits","sect2"],["","language.oop5.traits","example"],["","language.oop5.traits","sect2"],["","language.oop5.traits","example"],["","language.oop5.traits","sect2"],["","language.oop5.traits","example"],["","language.oop5.traits","sect2"],["","language.oop5.traits","example"],["","language.oop5.traits","example"],["","language.oop5.traits","sect2"],["","language.oop5.traits","example"],["","language.oop5.traits","example"],["","language.oop5.traits","sect2"],["","language.oop5.traits","sect1"],["","language.oop5.overloading","sect2"],["","language.oop5.overloading","methodsynopsis"],["","language.oop5.overloading","methodsynopsis"],["","language.oop5.overloading","methodsynopsis"],["","language.oop5.overloading","methodsynopsis"],["","language.oop5.overloading","example"],["","language.oop5.overloading","sect2"],["","language.oop5.overloading","methodsynopsis"],["","language.oop5.overloading","methodsynopsis"],["","language.oop5.overloading","example"],["","language.oop5.overloading","sect2"],["","language.oop5.overloading","sect1"],["","language.oop5.iterations","example"],["","language.oop5.iterations","example"],["","language.oop5.iterations","example"],["","language.oop5.iterations","sect1"],["","language.oop5.magic","methodsynopsis"],["","language.oop5.magic","methodsynopsis"],["","language.oop5.magic","example"],["","language.oop5.magic","sect2"],["","language.oop5.magic","methodsynopsis"],["","language.oop5.magic","example"],["","language.oop5.magic","sect2"],["","language.oop5.magic","methodsynopsis"],["","language.oop5.magic","example"],["","language.oop5.magic","sect2"],["","language.oop5.magic","methodsynopsis"],["","language.oop5.magic","example"],["","language.oop5.magic","sect2"],["","language.oop5.magic","sect1"],["","language.oop5.final","example"],["","language.oop5.final","example"],["","language.oop5.final","sect1"],["","language.oop5.cloning","methodsynopsis"],["","language.oop5.cloning","example"],["","language.oop5.cloning","sect1"],["","language.oop5.object-comparison","example"],["","language.oop5.object-comparison","sect1"],["","language.oop5.typehinting","example"],["","language.oop5.typehinting","sect1"],["","language.oop5.late-static-bindings","example"],["","language.oop5.late-static-bindings","sect2"],["","language.oop5.late-static-bindings","example"],["","language.oop5.late-static-bindings","example"],["","language.oop5.late-static-bindings","example"],["","language.oop5.late-static-bindings","sect2"],["","language.oop5.late-static-bindings","sect1"],["","language.oop5.references","example"],["","language.oop5.references","sect1"],["","language.oop5.serialization","sect1"],["","language.oop5.changelog","sect1"],["","language.oop5","chapter"],["","language.namespaces.rationale","example"],["","language.namespaces.rationale","sect1"],["","language.namespaces.definition","example"],["","language.namespaces.definition","example"],["","language.namespaces.definition","sect1"],["","language.namespaces.nested","example"],["","language.namespaces.nested","sect1"],["","language.namespaces.definitionmultiple","example"],["","language.namespaces.definitionmultiple","example"],["","language.namespaces.definitionmultiple","example"],["","language.namespaces.definitionmultiple","example"],["","language.namespaces.definitionmultiple","sect1"],["","language.namespaces.basics","example"],["","language.namespaces.basics","sect1"],["","language.namespaces.dynamic","example"],["","language.namespaces.dynamic","example"],["","language.namespaces.dynamic","sect1"],["","language.namespaces.nsconstants","example"],["","language.namespaces.nsconstants","example"],["","language.namespaces.nsconstants","example"],["","language.namespaces.nsconstants","example"],["","language.namespaces.nsconstants","example"],["","language.namespaces.nsconstants","sect1"],["","language.namespaces.importing","example"],["","language.namespaces.importing","example"],["","language.namespaces.importing","example"],["","language.namespaces.importing","example"],["","language.namespaces.importing","example"],["","language.namespaces.importing","sect2"],["","language.namespaces.importing","sect1"],["","language.namespaces.global","example"],["","language.namespaces.global","sect1"],["","language.namespaces.fallback","example"],["","language.namespaces.fallback","example"],["","language.namespaces.fallback","sect1"],["","language.namespaces.rules","example"],["","language.namespaces.rules","sect1"],["","language.namespaces.faq","example"],["","language.namespaces.faq","example"],["","language.namespaces.faq","sect2"],["","language.namespaces.faq","example"],["","language.namespaces.faq","sect2"],["","language.namespaces.faq","example"],["","language.namespaces.faq","sect2"],["","language.namespaces.faq","example"],["","language.namespaces.faq","sect2"],["","language.namespaces.faq","example"],["","language.namespaces.faq","sect2"],["","language.namespaces.faq","example"],["","language.namespaces.faq","sect2"],["","language.namespaces.faq","example"],["","language.namespaces.faq","sect2"],["","language.namespaces.faq","sect2"],["","language.namespaces.faq","sect2"],["","language.namespaces.faq","sect2"],["","language.namespaces.faq","example"],["","language.namespaces.faq","sect2"],["","language.namespaces.faq","example"],["","language.namespaces.faq","sect2"],["","language.namespaces.faq","example"],["","language.namespaces.faq","sect2"],["","language.namespaces.faq","sect1"],["","language.namespaces","chapter"],["","language.exceptions","example"],["","language.exceptions","example"],["","language.exceptions","example"],["","language.exceptions.extending","example"],["","language.exceptions.extending","example"],["","language.exceptions.extending","sect1"],["","language.exceptions","chapter"],["","language.generators.overview","example"],["","language.generators.overview","sect1"],["","language.generators.syntax","example"],["","language.generators.syntax","example"],["","language.generators.syntax","sect3"],["","language.generators.syntax","example"],["","language.generators.syntax","sect3"],["","language.generators.syntax","example"],["","language.generators.syntax","sect3"],["","language.generators.syntax","sect2"],["","language.generators.syntax","sect2"],["","language.generators.syntax","sect1"],["","language.generators.comparison","sect1"],["","language.generators","chapter"],["","language.references.whatare","sect1"],["","language.references.whatdo","example"],["","language.references.whatdo","example"],["","language.references.whatdo","example"],["","language.references.whatdo","sect2"],["","language.references.whatdo","sect2"],["","language.references.whatdo","sect2"],["","language.references.whatdo","sect1"],["","language.references.arent","sect1"],["","language.references.pass","sect1"],["","language.references.return","sect1"],["","language.references.unset","sect1"],["","language.references.spot","sect2"],["","language.references.spot","sect2"],["","language.references.spot","sect1"],["","language.references","chapter"],["Superglobals","language.variables.superglobals","phpdoc:varentry"],["","reserved.variables.globals","example"],["$GLOBALS","reserved.variables.globals","phpdoc:varentry"],["","reserved.variables.server","example"],["$_SERVER","reserved.variables.server","phpdoc:varentry"],["","reserved.variables.get","example"],["$_GET","reserved.variables.get","phpdoc:varentry"],["","reserved.variables.post","example"],["$_POST","reserved.variables.post","phpdoc:varentry"],["$_FILES","reserved.variables.files","phpdoc:varentry"],["$_REQUEST","reserved.variables.request","phpdoc:varentry"],["$_SESSION","reserved.variables.session","phpdoc:varentry"],["","reserved.variables.environment","example"],["$_ENV","reserved.variables.environment","phpdoc:varentry"],["","reserved.variables.cookies","example"],["$_COOKIE","reserved.variables.cookies","phpdoc:varentry"],["","reserved.variables.phperrormsg","example"],["$php_errormsg","reserved.variables.phperrormsg","phpdoc:varentry"],["$HTTP_RAW_POST_DATA","reserved.variables.httprawpostdata","phpdoc:varentry"],["","reserved.variables.httpresponseheader","example"],["$http_response_header","reserved.variables.httpresponseheader","phpdoc:varentry"],["","reserved.variables.argc","example"],["$argc","reserved.variables.argc","phpdoc:varentry"],["","reserved.variables.argv","example"],["$argv","reserved.variables.argv","phpdoc:varentry"],["","reserved.variables","reference"],["","class.exception","section"],["","class.exception","section"],["","class.exception","varlistentry"],["","class.exception","varlistentry"],["","class.exception","varlistentry"],["","class.exception","varlistentry"],["","class.exception","section"],["Exception::__construct","exception.construct","refentry"],["","exception.getmessage","example"],["Exception::getMessage","exception.getmessage","refentry"],["","exception.getprevious","example"],["Exception::getPrevious","exception.getprevious","refentry"],["","exception.getcode","example"],["Exception::getCode","exception.getcode","refentry"],["","exception.getfile","example"],["Exception::getFile","exception.getfile","refentry"],["","exception.getline","example"],["Exception::getLine","exception.getline","refentry"],["","exception.gettrace","example"],["Exception::getTrace","exception.gettrace","refentry"],["","exception.gettraceasstring","example"],["Exception::getTraceAsString","exception.gettraceasstring","refentry"],["","exception.tostring","example"],["Exception::__toString","exception.tostring","refentry"],["Exception::__clone","exception.clone","refentry"],["Exception","class.exception","phpdoc:exceptionref"],["","class.errorexception","section"],["","class.errorexception","section"],["","class.errorexception","varlistentry"],["","class.errorexception","section"],["","class.errorexception","example"],["","class.errorexception","section"],["ErrorException::__construct","errorexception.construct","refentry"],["","errorexception.getseverity","example"],["ErrorException::getSeverity","errorexception.getseverity","refentry"],["ErrorException","class.errorexception","phpdoc:exceptionref"],["","reserved.exceptions","part"],["","class.traversable","section"],["Traversable","class.traversable","phpdoc:classref"],["","class.iterator","section"],["Iterator","class.iterator","phpdoc:classref"],["","class.iteratoraggregate","section"],["IteratorAggregate","class.iteratoraggregate","phpdoc:classref"],["","class.arrayaccess","section"],["ArrayAccess","class.arrayaccess","phpdoc:classref"],["","class.serializable","section"],["","class.serializable","section"],["","class.serializable","example"],["","class.serializable","section"],["Serializable::serialize","serializable.serialize","refentry"],["Serializable::unserialize","serializable.unserialize","refentry"],["Serializable","class.serializable","phpdoc:classref"],["","class.closure","section"],["","class.closure","section"],["Closure::__construct","closure.construct","refentry"],["","closure.bind","example"],["Closure::bind","closure.bind","refentry"],["","closure.bindto","example"],["Closure::bindTo","closure.bindto","refentry"],["Closure","class.closure","phpdoc:classref"],["","class.generator","section"],["","class.generator","section"],["","class.generator","example"],["","class.generator","section"],["Generator::current","generator.current","refentry"],["Generator::key","generator.key","refentry"],["Generator::next","generator.next","refentry"],["Generator::rewind","generator.rewind","refentry"],["","generator.send","example"],["Generator::send","generator.send","refentry"],["","generator.throw","example"],["Generator::throw","generator.throw","refentry"],["Generator::valid","generator.valid","refentry"],["Generator::__wakeup","generator.wakeup","refentry"],["Generator<Tv>::getOrigFuncName","language.predefined.generator.getorigfuncname","refentry"],["Generator<Tv>::raise","language.predefined.generator.raise","refentry"],["Generator<Tv>::getLabel","language.predefined.generator.getlabel","refentry"],["Generator<Tv>::update","language.predefined.generator.update","refentry"],["Generator<Tv>::num_args","language.predefined.generator.numargs","refentry"],["Generator<Tv>::get_arg","language.predefined.generator.getarg","refentry"],["Generator","class.generator","phpdoc:classref"],["","reserved.interfaces","part"],["","context.socket","varlistentry"],["","context.socket","varlistentry"],["","context.socket","example"],["Socket context options","context.socket","refentry"],["","context.http","varlistentry"],["","context.http","varlistentry"],["","context.http","varlistentry"],["","context.http","varlistentry"],["","context.http","varlistentry"],["","context.http","varlistentry"],["","context.http","varlistentry"],["","context.http","varlistentry"],["","context.http","varlistentry"],["","context.http","varlistentry"],["","context.http","varlistentry"],["","context.http","example"],["","context.http","example"],["HTTP context options","context.http","refentry"],["","context.ftp","varlistentry"],["","context.ftp","varlistentry"],["","context.ftp","varlistentry"],["FTP context options","context.ftp","refentry"],["","context.ssl","varlistentry"],["","context.ssl","varlistentry"],["","context.ssl","varlistentry"],["","context.ssl","varlistentry"],["","context.ssl","varlistentry"],["","context.ssl","varlistentry"],["","context.ssl","varlistentry"],["","context.ssl","varlistentry"],["","context.ssl","varlistentry"],["","context.ssl","varlistentry"],["","context.ssl","varlistentry"],["","context.ssl","varlistentry"],["","context.ssl","varlistentry"],["","context.ssl","varlistentry"],["SSL context options","context.ssl","refentry"],["","context.curl","varlistentry"],["","context.curl","varlistentry"],["","context.curl","varlistentry"],["","context.curl","varlistentry"],["","context.curl","varlistentry"],["","context.curl","varlistentry"],["","context.curl","varlistentry"],["","context.curl","varlistentry"],["","context.curl","example"],["CURL context options","context.curl","refentry"],["","context.phar","varlistentry"],["","context.phar","varlistentry"],["Phar context options","context.phar","refentry"],["","context.params","varlistentry"],["Context parameters","context.params","refentry"],["","context","reference"],["file:\/\/","wrappers.file","refentry"],["","wrappers.http","example"],["http:\/\/","wrappers.http","refentry"],["ftp:\/\/","wrappers.ftp","refentry"],["","wrappers.php","example"],["","wrappers.php","example"],["","wrappers.php","example"],["","wrappers.php","example"],["php:\/\/","wrappers.php","refentry"],["zlib:\/\/","wrappers.compression","refentry"],["","wrappers.data","example"],["","wrappers.data","example"],["data:\/\/","wrappers.data","refentry"],["","wrappers.glob","example"],["glob:\/\/","wrappers.glob","refentry"],["phar:\/\/","wrappers.phar","refentry"],["","wrappers.ssh2","example"],["","wrappers.ssh2","example"],["ssh2:\/\/","wrappers.ssh2","refentry"],["","wrappers.rar","example"],["","wrappers.rar","example"],["rar:\/\/","wrappers.rar","refentry"],["ogg:\/\/","wrappers.audio","refentry"],["expect:\/\/","wrappers.expect","refentry"],["","wrappers","reference"],["","phplangref","book"],["","phpfuncref","info"],["","intro.apc","preface"],["","apc.requirements","section"],["","apc.installation","section"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","example"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","varlistentry"],["","apc.configuration","section"],["","apc.resources","section"],["","apc.setup","chapter"],["","apc.constants","varlistentry"],["","apc.constants","varlistentry"],["","apc.constants","varlistentry"],["","apc.constants","varlistentry"],["","apc.constants","varlistentry"],["","apc.constants","varlistentry"],["","apc.constants","varlistentry"],["","apc.constants","varlistentry"],["","apc.constants","varlistentry"],["","apc.constants","varlistentry"],["","apc.constants","varlistentry"],["","apc.constants","varlistentry"],["","apc.constants","varlistentry"],["","apc.constants","varlistentry"],["","apc.constants","varlistentry"],["","apc.constants","varlistentry"],["","apc.constants","varlistentry"],["","apc.constants","varlistentry"],["","apc.constants","varlistentry"],["","apc.constants","varlistentry"],["","apc.constants","varlistentry"],["","apc.constants","appendix"],["","function.apc-add","example"],["apc_add","function.apc-add","refentry"],["apc_bin_dump","function.apc-bin-dump","refentry"],["apc_bin_dumpfile","function.apc-bin-dumpfile","refentry"],["","function.apc-bin-load","example"],["apc_bin_load","function.apc-bin-load","refentry"],["apc_bin_loadfile","function.apc-bin-loadfile","refentry"],["","function.apc-cache-info","example"],["apc_cache_info","function.apc-cache-info","refentry"],["","function.apc-cas","example"],["apc_cas","function.apc-cas","refentry"],["apc_clear_cache","function.apc-clear-cache","refentry"],["apc_compile_file","function.apc-compile-file","refentry"],["","function.apc-dec","example"],["apc_dec","function.apc-dec","refentry"],["","function.apc-define-constants","example"],["apc_define_constants","function.apc-define-constants","refentry"],["","function.apc-delete-file","example"],["apc_delete_file","function.apc-delete-file","refentry"],["","function.apc-delete","example"],["apc_delete","function.apc-delete","refentry"],["","function.apc-exists","example"],["apc_exists","function.apc-exists","refentry"],["","function.apc-fetch","example"],["apc_fetch","function.apc-fetch","refentry"],["","function.apc-inc","example"],["apc_inc","function.apc-inc","refentry"],["","function.apc-load-constants","example"],["apc_load_constants","function.apc-load-constants","refentry"],["","function.apc-sma-info","example"],["apc_sma_info","function.apc-sma-info","refentry"],["","function.apc-store","example"],["apc_store","function.apc-store","refentry"],["","ref.apc","reference"],["","class.apciterator","section"],["","class.apciterator","section"],["","apciterator.construct","example"],["APCIterator::__construct","apciterator.construct","refentry"],["APCIterator::current","apciterator.current","refentry"],["APCIterator::getTotalCount","apciterator.gettotalcount","refentry"],["APCIterator::getTotalHits","apciterator.gettotalhits","refentry"],["APCIterator::getTotalSize","apciterator.gettotalsize","refentry"],["APCIterator::key","apciterator.key","refentry"],["APCIterator::next","apciterator.next","refentry"],["APCIterator::rewind","apciterator.rewind","refentry"],["APCIterator::valid","apciterator.valid","refentry"],["APCIterator","class.apciterator","phpdoc:classref"],["APC","book.apc","book"],["","intro.apd","preface"],["","apd.requirements","section"],["","apd.installation","section"],["","apd.configuration","varlistentry"],["","apd.configuration","varlistentry"],["","apd.configuration","section"],["","apd.resources","section"],["","apd.setup","chapter"],["","apd.constants","appendix"],["","apd.examples.usage","section"],["","apd.examples","appendix"],["","ref.apd","section"],["","function.apd-breakpoint","example"],["apd_breakpoint","function.apd-breakpoint","refentry"],["","function.apd-callstack","example"],["apd_callstack","function.apd-callstack","refentry"],["","function.apd-clunk","example"],["apd_clunk","function.apd-clunk","refentry"],["","function.apd-continue","example"],["apd_continue","function.apd-continue","refentry"],["","function.apd-croak","example"],["apd_croak","function.apd-croak","refentry"],["","function.apd-dump-function-table","example"],["apd_dump_function_table","function.apd-dump-function-table","refentry"],["","function.apd-dump-persistent-resources","example"],["apd_dump_persistent_resources","function.apd-dump-persistent-resources","refentry"],["","function.apd-dump-regular-resources","example"],["apd_dump_regular_resources","function.apd-dump-regular-resources","refentry"],["","function.apd-echo","example"],["apd_echo","function.apd-echo","refentry"],["","function.apd-get-active-symbols","example"],["apd_get_active_symbols","function.apd-get-active-symbols","refentry"],["","function.apd-set-pprof-trace","example"],["apd_set_pprof_trace","function.apd-set-pprof-trace","refentry"],["","function.apd-set-session-trace-socket","example"],["apd_set_session_trace_socket","function.apd-set-session-trace-socket","refentry"],["","function.apd-set-session-trace","example"],["apd_set_session_trace","function.apd-set-session-trace","refentry"],["","function.apd-set-session","example"],["apd_set_session","function.apd-set-session","refentry"],["","function.override-function","example"],["override_function","function.override-function","refentry"],["","function.rename-function","example"],["rename_function","function.rename-function","refentry"],["","ref.apd","reference"],["APD","book.apd","book"],["","intro.bcompiler","preface"],["","bcompiler.requirements","section"],["","bcompiler.installation","section"],["","bcompiler.configuration","section"],["","bcompiler.resources","section"],["","bcompiler.setup","chapter"],["","bcompiler.constants","appendix"],["","ref.bcompiler","section"],["","function.bcompiler-load-exe","example"],["bcompiler_load_exe","function.bcompiler-load-exe","refentry"],["","function.bcompiler-load","example"],["bcompiler_load","function.bcompiler-load","refentry"],["","function.bcompiler-parse-class","example"],["bcompiler_parse_class","function.bcompiler-parse-class","refentry"],["","function.bcompiler-read","example"],["bcompiler_read","function.bcompiler-read","refentry"],["","function.bcompiler-write-class","example"],["bcompiler_write_class","function.bcompiler-write-class","refentry"],["","function.bcompiler-write-constant","example"],["bcompiler_write_constant","function.bcompiler-write-constant","refentry"],["","function.bcompiler-write-exe-footer","example"],["bcompiler_write_exe_footer","function.bcompiler-write-exe-footer","refentry"],["","function.bcompiler-write-file","example"],["bcompiler_write_file","function.bcompiler-write-file","refentry"],["","function.bcompiler-write-footer","example"],["bcompiler_write_footer","function.bcompiler-write-footer","refentry"],["","function.bcompiler-write-function","example"],["bcompiler_write_function","function.bcompiler-write-function","refentry"],["","function.bcompiler-write-functions-from-file","example"],["bcompiler_write_functions_from_file","function.bcompiler-write-functions-from-file","refentry"],["","function.bcompiler-write-header","example"],["bcompiler_write_header","function.bcompiler-write-header","refentry"],["bcompiler_write_included_filename","function.bcompiler-write-included-filename","refentry"],["","ref.bcompiler","reference"],["bcompiler","book.bcompiler","book"],["","intro.blenc","preface"],["","blenc.requirements","section"],["","blenc.installation","section"],["","blenc.configuration","varlistentry"],["","blenc.configuration","section"],["","blenc.resources","section"],["","blenc.setup","chapter"],["","blenc.constants","varlistentry"],["","blenc.constants","appendix"],["","function.blenc-encrypt","example"],["blenc_encrypt","function.blenc-encrypt","refentry"],["","ref.blenc","reference"],["BLENC","book.blenc","book"],["","intro.errorfunc","preface"],["","errorfunc.requirements","section"],["","errorfunc.installation","section"],["","errorfunc.configuration","varlistentry"],["","errorfunc.configuration","varlistentry"],["","errorfunc.configuration","varlistentry"],["","errorfunc.configuration","varlistentry"],["","errorfunc.configuration","varlistentry"],["","errorfunc.configuration","varlistentry"],["","errorfunc.configuration","varlistentry"],["","errorfunc.configuration","varlistentry"],["","errorfunc.configuration","varlistentry"],["","errorfunc.configuration","varlistentry"],["","errorfunc.configuration","varlistentry"],["","errorfunc.configuration","varlistentry"],["","errorfunc.configuration","varlistentry"],["","errorfunc.configuration","varlistentry"],["","errorfunc.configuration","varlistentry"],["","errorfunc.configuration","varlistentry"],["","errorfunc.configuration","varlistentry"],["","errorfunc.configuration","section"],["","errorfunc.resources","section"],["","errorfunc.setup","chapter"],["","errorfunc.constants","table"],["","errorfunc.constants","appendix"],["","errorfunc.examples","example"],["","errorfunc.examples","appendix"],["","function.debug-backtrace","example"],["debug_backtrace","function.debug-backtrace","refentry"],["","function.debug-print-backtrace","example"],["debug_print_backtrace","function.debug-print-backtrace","refentry"],["","function.error-get-last","example"],["error_get_last","function.error-get-last","refentry"],["","function.error-log","example"],["error_log","function.error-log","refentry"],["","function.error-reporting","example"],["error_reporting","function.error-reporting","refentry"],["","function.restore-error-handler","example"],["restore_error_handler","function.restore-error-handler","refentry"],["","function.restore-exception-handler","example"],["restore_exception_handler","function.restore-exception-handler","refentry"],["","function.set-error-handler","example"],["set_error_handler","function.set-error-handler","refentry"],["","function.set-exception-handler","example"],["set_exception_handler","function.set-exception-handler","refentry"],["","function.trigger-error","example"],["trigger_error","function.trigger-error","refentry"],["user_error","function.user-error","refentry"],["","ref.errorfunc","reference"],["Error Handling","book.errorfunc","book"],["","intro.htscanner","preface"],["","htscanner.requirements","section"],["","htscanner.installation","section"],["","htscanner.configuration","varlistentry"],["","htscanner.configuration","varlistentry"],["","htscanner.configuration","varlistentry"],["","htscanner.configuration","varlistentry"],["","htscanner.configuration","section"],["","htscanner.resources","section"],["","htscanner.setup","chapter"],["htscanner","book.htscanner","book"],["","intro.inclued","preface"],["","inclued.requirements","section"],["","inclued.installation","section"],["","inclued.configuration","varlistentry"],["","inclued.configuration","varlistentry"],["","inclued.configuration","section"],["","inclued.resources","section"],["","inclued.setup","chapter"],["","inclued.constants","appendix"],["","inclued.examples-implementation","example"],["","inclued.examples-implementation","example"],["","inclued.examples-implementation","example"],["","inclued.examples-implementation","section"],["","inclued.examples","chapter"],["","function.inclued-get-data","example"],["inclued_get_data","function.inclued-get-data","refentry"],["","ref.inclued","reference"],["inclued","book.inclued","book"],["","intro.memtrack","preface"],["","memtrack.requirements","section"],["","memtrack.installation","section"],["","memtrack.ini","varlistentry"],["","memtrack.ini","varlistentry"],["","memtrack.ini","varlistentry"],["","memtrack.ini","varlistentry"],["","memtrack.ini","varlistentry"],["","memtrack.ini","section"],["","memtrack.resources","section"],["","memtrack.setup","chapter"],["","memtrack.constants","appendix"],["","memtrack.examples.basic","example"],["","memtrack.examples.basic","section"],["","memtrack.examples","appendix"],["Memtrack","book.memtrack","book"],["","intro.opcache","preface"],["","opcache.requirements","sect1"],["","opcache.installation","sect1"],["","opcache.configuration","varlistentry"],["","opcache.configuration","varlistentry"],["","opcache.configuration","varlistentry"],["","opcache.configuration","varlistentry"],["","opcache.configuration","varlistentry"],["","opcache.configuration","varlistentry"],["","opcache.configuration","varlistentry"],["","opcache.configuration","varlistentry"],["","opcache.configuration","varlistentry"],["","opcache.configuration","varlistentry"],["","opcache.configuration","varlistentry"],["","opcache.configuration","varlistentry"],["","opcache.configuration","varlistentry"],["","opcache.configuration","varlistentry"],["","opcache.configuration","varlistentry"],["","opcache.configuration","varlistentry"],["","opcache.configuration","varlistentry"],["","opcache.configuration","varlistentry"],["","opcache.configuration","varlistentry"],["","opcache.configuration","varlistentry"],["","opcache.configuration","varlistentry"],["","opcache.configuration","varlistentry"],["","opcache.configuration","varlistentry"],["","opcache.configuration","varlistentry"],["","opcache.configuration","varlistentry"],["","opcache.configuration","varlistentry"],["","opcache.configuration","sect1"],["","opcache.resources","sect1"],["","opcache.setup","chapter"],["opcache_compile_file","function.opcache-compile-file","refentry"],["opcache_get_configuration","function.opcache-get-configuration","refentry"],["opcache_get_status","function.opcache-get-status","refentry"],["opcache_invalidate","function.opcache-invalidate","refentry"],["opcache_reset","function.opcache-reset","refentry"],["","ref.opcache","reference"],["","book.opcache","book"],["","intro.outcontrol","preface"],["","outcontrol.requirements","section"],["","outcontrol.installation","section"],["","outcontrol.configuration","varlistentry"],["","outcontrol.configuration","varlistentry"],["","outcontrol.configuration","varlistentry"],["","outcontrol.configuration","section"],["","outcontrol.resources","section"],["","outcontrol.setup","chapter"],["","outcontrol.constants","varlistentry"],["","outcontrol.constants","varlistentry"],["","outcontrol.constants","varlistentry"],["","outcontrol.constants","varlistentry"],["","outcontrol.constants","varlistentry"],["","outcontrol.constants","varlistentry"],["","outcontrol.constants","varlistentry"],["","outcontrol.constants","varlistentry"],["","outcontrol.constants","varlistentry"],["","outcontrol.constants","varlistentry"],["","outcontrol.constants","varlistentry"],["","outcontrol.constants","appendix"],["","outcontrol.examples.basic","example"],["","outcontrol.examples.basic","section"],["","outcontrol.examples","appendix"],["flush","function.flush","refentry"],["ob_clean","function.ob-clean","refentry"],["","function.ob-end-clean","example"],["ob_end_clean","function.ob-end-clean","refentry"],["","function.ob-end-flush","example"],["ob_end_flush","function.ob-end-flush","refentry"],["ob_flush","function.ob-flush","refentry"],["","function.ob-get-clean","example"],["ob_get_clean","function.ob-get-clean","refentry"],["","function.ob-get-contents","example"],["ob_get_contents","function.ob-get-contents","refentry"],["","function.ob-get-flush","example"],["ob_get_flush","function.ob-get-flush","refentry"],["","function.ob-get-length","example"],["ob_get_length","function.ob-get-length","refentry"],["ob_get_level","function.ob-get-level","refentry"],["ob_get_status","function.ob-get-status","refentry"],["","function.ob-gzhandler","example"],["ob_gzhandler","function.ob-gzhandler","refentry"],["ob_implicit_flush","function.ob-implicit-flush","refentry"],["","function.ob-list-handlers","example"],["ob_list_handlers","function.ob-list-handlers","refentry"],["","function.ob-start","example"],["","function.ob-start","example"],["ob_start","function.ob-start","refentry"],["","function.output-add-rewrite-var","example"],["output_add_rewrite_var","function.output-add-rewrite-var","refentry"],["","function.output-reset-rewrite-vars","example"],["output_reset_rewrite_vars","function.output-reset-rewrite-vars","refentry"],["","ref.outcontrol","reference"],["Output Control","book.outcontrol","book"],["","intro.info","preface"],["","info.requirements","section"],["","info.installation","section"],["","info.configuration","varlistentry"],["","info.configuration","varlistentry"],["","info.configuration","varlistentry"],["","info.configuration","varlistentry"],["","info.configuration","varlistentry"],["","info.configuration","varlistentry"],["","info.configuration","varlistentry"],["","info.configuration","varlistentry"],["","info.configuration","varlistentry"],["","info.configuration","varlistentry"],["","info.configuration","varlistentry"],["","info.configuration","varlistentry"],["","info.configuration","varlistentry"],["","info.configuration","section"],["","info.resources","section"],["","info.setup","chapter"],["","info.constants","appendix"],["","function.assert-options","example"],["assert_options","function.assert-options","refentry"],["","function.assert","example"],["","function.assert","example"],["assert","function.assert","refentry"],["","function.cli-get-process-title","example"],["cli_get_process_title","function.cli-get-process-title","refentry"],["","function.cli-set-process-title","example"],["cli_set_process_title","function.cli-set-process-title","refentry"],["","function.dl","example"],["dl","function.dl","refentry"],["","function.extension-loaded","example"],["extension_loaded","function.extension-loaded","refentry"],["gc_collect_cycles","function.gc-collect-cycles","refentry"],["gc_disable","function.gc-disable","refentry"],["gc_enable","function.gc-enable","refentry"],["","function.gc-enabled","example"],["gc_enabled","function.gc-enabled","refentry"],["get_cfg_var","function.get-cfg-var","refentry"],["","function.get-current-user","example"],["get_current_user","function.get-current-user","refentry"],["","function.get-defined-constants","example"],["get_defined_constants","function.get-defined-constants","refentry"],["","function.get-extension-funcs","example"],["get_extension_funcs","function.get-extension-funcs","refentry"],["","function.get-include-path","example"],["get_include_path","function.get-include-path","refentry"],["","function.get-included-files","example"],["get_included_files","function.get-included-files","refentry"],["","function.get-loaded-extensions","example"],["get_loaded_extensions","function.get-loaded-extensions","refentry"],["","function.get-magic-quotes-gpc","example"],["get_magic_quotes_gpc","function.get-magic-quotes-gpc","refentry"],["","function.get-magic-quotes-runtime","example"],["get_magic_quotes_runtime","function.get-magic-quotes-runtime","refentry"],["get_required_files","function.get-required-files","refentry"],["","function.getenv","example"],["getenv","function.getenv","refentry"],["","function.getlastmod","example"],["getlastmod","function.getlastmod","refentry"],["getmygid","function.getmygid","refentry"],["getmyinode","function.getmyinode","refentry"],["getmypid","function.getmypid","refentry"],["getmyuid","function.getmyuid","refentry"],["","function.getopt","example"],["","function.getopt","example"],["","function.getopt","example"],["getopt","function.getopt","refentry"],["","function.getrusage","example"],["getrusage","function.getrusage","refentry"],["ini_alter","function.ini-alter","refentry"],["","function.ini-get-all","example"],["","function.ini-get-all","example"],["ini_get_all","function.ini-get-all","refentry"],["","function.ini-get","example"],["ini_get","function.ini-get","refentry"],["","function.ini-restore","example"],["ini_restore","function.ini-restore","refentry"],["","function.ini-set","example"],["ini_set","function.ini-set","refentry"],["magic_quotes_runtime","function.magic-quotes-runtime","refentry"],["main","function.main","refentry"],["memory_get_peak_usage","function.memory-get-peak-usage","refentry"],["","function.memory-get-usage","example"],["memory_get_usage","function.memory-get-usage","refentry"],["","function.php-ini-loaded-file","example"],["php_ini_loaded_file","function.php-ini-loaded-file","refentry"],["","function.php-ini-scanned-files","example"],["php_ini_scanned_files","function.php-ini-scanned-files","refentry"],["","function.php-logo-guid","example"],["php_logo_guid","function.php-logo-guid","refentry"],["","function.php-sapi-name","example"],["php_sapi_name","function.php-sapi-name","refentry"],["","function.php-uname","example"],["","function.php-uname","example"],["php_uname","function.php-uname","refentry"],["","function.phpcredits","example"],["","function.phpcredits","example"],["","function.phpcredits","example"],["phpcredits","function.phpcredits","refentry"],["","function.phpinfo","example"],["phpinfo","function.phpinfo","refentry"],["","function.phpversion","example"],["","function.phpversion","example"],["phpversion","function.phpversion","refentry"],["","function.putenv","example"],["putenv","function.putenv","refentry"],["","function.restore-include-path","example"],["restore_include_path","function.restore-include-path","refentry"],["","function.set-include-path","example"],["","function.set-include-path","example"],["set_include_path","function.set-include-path","refentry"],["","function.set-magic-quotes-runtime","example"],["set_magic_quotes_runtime","function.set-magic-quotes-runtime","refentry"],["set_time_limit","function.set-time-limit","refentry"],["","function.sys-get-temp-dir","example"],["sys_get_temp_dir","function.sys-get-temp-dir","refentry"],["","function.version-compare","example"],["version_compare","function.version-compare","refentry"],["","function.zend-logo-guid","example"],["zend_logo_guid","function.zend-logo-guid","refentry"],["","function.zend-thread-id","example"],["zend_thread_id","function.zend-thread-id","refentry"],["","function.zend-version","example"],["zend_version","function.zend-version","refentry"],["","ref.info","reference"],["PHP Options\/Info","book.info","book"],["","intro.runkit","preface"],["","runkit.constants","varlistentry"],["","runkit.constants","varlistentry"],["","runkit.constants","varlistentry"],["","runkit.constants","varlistentry"],["","runkit.constants","varlistentry"],["","runkit.constants","varlistentry"],["","runkit.constants","varlistentry"],["","runkit.constants","varlistentry"],["","runkit.constants","varlistentry"],["","runkit.constants","varlistentry"],["","runkit.constants","appendix"],["","runkit.requirements","section"],["","runkit.installation","section"],["","runkit.configuration","example"],["","runkit.configuration","varlistentry"],["","runkit.configuration","varlistentry"],["","runkit.configuration","section"],["","runkit.resources","section"],["","runkit.setup","chapter"],["","runkit.sandbox","example"],["","runkit.sandbox","example"],["","runkit.sandbox","example"],["","runkit.sandbox","example"],["Runkit_Sandbox","runkit.sandbox","refentry"],["","runkit.sandbox-parent","example"],["","runkit.sandbox-parent","example"],["Runkit_Sandbox_Parent","runkit.sandbox-parent","refentry"],["","function.runkit-class-adopt","example"],["runkit_class_adopt","function.runkit-class-adopt","refentry"],["","function.runkit-class-emancipate","example"],["runkit_class_emancipate","function.runkit-class-emancipate","refentry"],["runkit_constant_add","function.runkit-constant-add","refentry"],["runkit_constant_redefine","function.runkit-constant-redefine","refentry"],["runkit_constant_remove","function.runkit-constant-remove","refentry"],["","function.runkit-function-add","example"],["runkit_function_add","function.runkit-function-add","refentry"],["","function.runkit-function-copy","example"],["runkit_function_copy","function.runkit-function-copy","refentry"],["","function.runkit-function-redefine","example"],["runkit_function_redefine","function.runkit-function-redefine","refentry"],["runkit_function_remove","function.runkit-function-remove","refentry"],["runkit_function_rename","function.runkit-function-rename","refentry"],["runkit_import","function.runkit-import","refentry"],["runkit_lint_file","function.runkit-lint-file","refentry"],["runkit_lint","function.runkit-lint","refentry"],["","function.runkit-method-add","example"],["runkit_method_add","function.runkit-method-add","refentry"],["","function.runkit-method-copy","example"],["runkit_method_copy","function.runkit-method-copy","refentry"],["","function.runkit-method-redefine","example"],["runkit_method_redefine","function.runkit-method-redefine","refentry"],["","function.runkit-method-remove","example"],["runkit_method_remove","function.runkit-method-remove","refentry"],["","function.runkit-method-rename","example"],["runkit_method_rename","function.runkit-method-rename","refentry"],["","function.runkit-return-value-used","example"],["runkit_return_value_used","function.runkit-return-value-used","refentry"],["","function.runkit-sandbox-output-handler","example"],["runkit_sandbox_output_handler","function.runkit-sandbox-output-handler","refentry"],["runkit_superglobals","function.runkit-superglobals","refentry"],["","ref.runkit","reference"],["","book.runkit","book"],["","intro.scream","preface"],["","scream.requirements","section"],["","scream.installation","section"],["","scream.configuration","varlistentry"],["","scream.configuration","section"],["","scream.resources","section"],["","scream.setup","chapter"],["","scream.examples-simple","example"],["","scream.examples-simple","section"],["","scream.examples","chapter"],["scream","book.scream","book"],["","intro.weakref","example"],["","intro.weakref","preface"],["","weakref.requirements","section"],["","weakref.installation","section"],["","weakref.resources","section"],["","weakref.setup","chapter"],["","class.weakref","section"],["","class.weakref","section"],["","class.weakref","example"],["","class.weakref","section"],["","weakref.acquire","example"],["","weakref.acquire","example"],["Weakref::acquire","weakref.acquire","refentry"],["","weakref.construct","example"],["Weakref::__construct","weakref.construct","refentry"],["Weakref::get","weakref.get","refentry"],["","weakref.release","example"],["Weakref::release","weakref.release","refentry"],["Weakref::valid","weakref.valid","refentry"],["WeakRef","class.weakref","phpdoc:classref"],["","class.weakmap","section"],["","class.weakmap","section"],["","class.weakmap","example"],["","class.weakmap","section"],["WeakMap::__construct","weakmap.construct","refentry"],["WeakMap::count","weakmap.count","refentry"],["WeakMap::current","weakmap.current","refentry"],["WeakMap::key","weakmap.key","refentry"],["WeakMap::next","weakmap.next","refentry"],["WeakMap::offsetExists","weakmap.offsetexists","refentry"],["WeakMap::offsetGet","weakmap.offsetget","refentry"],["WeakMap::offsetSet","weakmap.offsetset","refentry"],["WeakMap::offsetUnset","weakmap.offsetunset","refentry"],["WeakMap::rewind","weakmap.rewind","refentry"],["WeakMap::valid","weakmap.valid","refentry"],["WeakMap","class.weakmap","phpdoc:classref"],["Weakref","book.weakref","book"],["","intro.xhprof","preface"],["","xhprof.requirements","section"],["","xhprof.installation","section"],["","xhprof.configuration","varlistentry"],["","xhprof.configuration","section"],["","xhprof.resources","section"],["","xhprof.setup","chapter"],["","xhprof.constants","varlistentry"],["","xhprof.constants","varlistentry"],["","xhprof.constants","varlistentry"],["","xhprof.constants","appendix"],["","xhprof.examples","example"],["","xhprof.examples","chapter"],["","hhvm.function.xhprof-disable","example"],["xhprof_disable","hhvm.function.xhprof-disable","refentry"],["","hhvm.function.xhprof-enable","example"],["xhprof_enable","hhvm.function.xhprof-enable","refentry"],["","hhvm.function.xhprof-sample-disable","example"],["xhprof_sample_disable","hhvm.function.xhprof-sample-disable","refentry"],["xhprof_sample_enable","hhvm.function.xhprof-sample-enable","refentry"],["","ref.xhprof","reference"],["Xhprof","book.xhprof","book"],["","refs.basic.php","set"],["","intro.id3","preface"],["","id3.requirements","section"],["","id3.installation","section"],["","id3.configuration","section"],["","id3.resources","section"],["","id3.setup","chapter"],["","id3.constants","varlistentry"],["","id3.constants","varlistentry"],["","id3.constants","varlistentry"],["","id3.constants","varlistentry"],["","id3.constants","varlistentry"],["","id3.constants","varlistentry"],["","id3.constants","varlistentry"],["","id3.constants","appendix"],["","function.id3-get-frame-long-name","example"],["id3_get_frame_long_name","function.id3-get-frame-long-name","refentry"],["","function.id3-get-frame-short-name","example"],["id3_get_frame_short_name","function.id3-get-frame-short-name","refentry"],["","function.id3-get-genre-id","example"],["id3_get_genre_id","function.id3-get-genre-id","refentry"],["","function.id3-get-genre-list","example"],["id3_get_genre_list","function.id3-get-genre-list","refentry"],["","function.id3-get-genre-name","example"],["id3_get_genre_name","function.id3-get-genre-name","refentry"],["","function.id3-get-tag","example"],["","function.id3-get-tag","example"],["id3_get_tag","function.id3-get-tag","refentry"],["","function.id3-get-version","example"],["id3_get_version","function.id3-get-version","refentry"],["","function.id3-remove-tag","example"],["id3_remove_tag","function.id3-remove-tag","refentry"],["","function.id3-set-tag","example"],["id3_set_tag","function.id3-set-tag","refentry"],["","ref.id3","reference"],["ID3","book.id3","book"],["","intro.ktaglib","preface"],["","ktaglib.requirements","section"],["","ktaglib.installation","section"],["","ktaglib.setup","chapter"],["","ktaglib.constants","varlistentry"],["","ktaglib.constants","varlistentry"],["","ktaglib.constants","varlistentry"],["","ktaglib.constants","varlistentry"],["","ktaglib.constants","varlistentry"],["","ktaglib.constants","varlistentry"],["","ktaglib.constants","varlistentry"],["","ktaglib.constants","varlistentry"],["","ktaglib.constants","varlistentry"],["","ktaglib.constants","varlistentry"],["","ktaglib.constants","varlistentry"],["","ktaglib.constants","varlistentry"],["","ktaglib.constants","varlistentry"],["","ktaglib.constants","varlistentry"],["","ktaglib.constants","varlistentry"],["","ktaglib.constants","varlistentry"],["","ktaglib.constants","varlistentry"],["","ktaglib.constants","varlistentry"],["","ktaglib.constants","varlistentry"],["","ktaglib.constants","varlistentry"],["","ktaglib.constants","varlistentry"],["","ktaglib.constants","varlistentry"],["","ktaglib.constants","varlistentry"],["","ktaglib.constants","appendix"],["","class.ktaglib-mpeg-file","section"],["","class.ktaglib-mpeg-file","section"],["","mpegfile.construct","example"],["KTaglib_MPEG_File::__construct","mpegfile.construct","refentry"],["KTaglib_MPEG_File::getAudioProperties","mpegfile.getaudioproperties","refentry"],["KTaglib_MPEG_File::getID3v1Tag","mpegfile.getid3v1tag","refentry"],["KTaglib_MPEG_File::getID3v2Tag","mpegfile.getid3v2tag","refentry"],["KTaglib_MPEG_File","class.ktaglib-mpeg-file","phpdoc:classref"],["","class.ktaglib-mpeg-audioproperties","section"],["","class.ktaglib-mpeg-audioproperties","section"],["KTaglib_MPEG_AudioProperties::getBitrate","audioproperties.getbitrate","refentry"],["KTaglib_MPEG_AudioProperties::getChannels","audioproperties.getchannels","refentry"],["KTaglib_MPEG_AudioProperties::getLayer","audioproperties.getlayer","refentry"],["KTaglib_MPEG_AudioProperties::getLength","audioproperties.getlength","refentry"],["KTaglib_MPEG_AudioProperties::getSampleBitrate","audioproperties.getsamplebitrate","refentry"],["KTaglib_MPEG_AudioProperties::getVersion","audioproperties.getversion","refentry"],["KTaglib_MPEG_AudioProperties::isCopyrighted","audioproperties.iscopyrighted","refentry"],["KTaglib_MPEG_AudioProperties::isOriginal","audioproperties.isoriginal","refentry"],["KTaglib_MPEG_AudioProperties::isProtectionEnabled","audioproperties.isprotectionenabled","refentry"],["KTaglib_MPEG_AudioProperties","class.ktaglib-mpeg-audioproperties","phpdoc:classref"],["","class.ktaglib-tag","section"],["","class.ktaglib-tag","section"],["KTaglib_Tag::getAlbum","tag.getalbum","refentry"],["KTaglib_Tag::getArtist","tag.getartist","refentry"],["KTaglib_Tag::getComment","tag.getcomment","refentry"],["KTaglib_Tag::getGenre","tag.getgenre","refentry"],["KTaglib_Tag::getTitle","tag.gettitle","refentry"],["KTaglib_Tag::getTrack","tag.gettrack","refentry"],["KTaglib_Tag::getYear","tag.getyear","refentry"],["KTaglib_Tag::isEmpty","tag.isempty","refentry"],["KTaglib_Tag","class.ktaglib-tag","phpdoc:classref"],["","class.ktaglib-id3v2-tag","section"],["","class.ktaglib-id3v2-tag","section"],["KTaglib_ID3v2_Tag::addFrame","id3v2tag.addframe","refentry"],["KTaglib_ID3v2_Tag::getFrameList","id3v2tag.getframelist","refentry"],["KTaglib_ID3v2_Tag","class.ktaglib-id3v2-tag","phpdoc:classref"],["","class.ktaglib-id3v2-frame","section"],["","class.ktaglib-id3v2-frame","section"],["KTaglib_ID3v2_Frame::getSize","id3v2frame.getsize","refentry"],["KTaglib_ID3v2_Frame::__toString","id3v2frame.tostring","refentry"],["KTaglib_ID3v2_Frame","class.ktaglib-id3v2-frame","phpdoc:classref"],["","class.ktaglib-id3v2-attachedpictureframe","section"],["","class.ktaglib-id3v2-attachedpictureframe","section"],["KTaglib_ID3v2_AttachedPictureFrame::getDescription","id3v2attachedpictureframe.getdescription","refentry"],["KTaglib_ID3v2_AttachedPictureFrame::getMimeType","id3v2attachedpictureframe.getmimetype","refentry"],["KTaglib_ID3v2_AttachedPictureFrame::getType","id3v2attachedpictureframe.gettype","refentry"],["KTaglib_ID3v2_AttachedPictureFrame::savePicture","id3v2attachedpictureframe.savepicture","refentry"],["KTaglib_ID3v2_AttachedPictureFrame::setMimeType","id3v2attachedpictureframe.setmimetype","refentry"],["KTaglib_ID3v2_AttachedPictureFrame::setPicture","id3v2attachedpictureframe.setpicture","refentry"],["KTaglib_ID3v2_AttachedPictureFrame::setType","id3v2attachedpictureframe.settype","refentry"],["KTaglib_ID3v2_AttachedPictureFrame","class.ktaglib-id3v2-attachedpictureframe","phpdoc:classref"],["","book.ktaglib","book"],["","intro.oggvorbis","preface"],["","oggvorbis.requirements","section"],["","oggvorbis.installation","section"],["","oggvorbis.configuration","section"],["","oggvorbis.resources","section"],["","oggvorbis.setup","chapter"],["","oggvorbis.constants","appendix"],["","oggvorbis.contexts","chapter"],["","oggvorbis.examples-basisc","example"],["","oggvorbis.examples-basisc","example"],["","oggvorbis.examples-basisc","section"],["","oggvorbis.examples","chapter"],["oggvorbis","book.oggvorbis","book"],["","intro.openal","preface"],["","openal.requirements","section"],["","openal.installation","section"],["","openal.configuration","section"],["","openal.resources","section"],["","openal.setup","chapter"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","varlistentry"],["","openal.constants","appendix"],["openal_buffer_create","function.openal-buffer-create","refentry"],["openal_buffer_data","function.openal-buffer-data","refentry"],["openal_buffer_destroy","function.openal-buffer-destroy","refentry"],["openal_buffer_get","function.openal-buffer-get","refentry"],["openal_buffer_loadwav","function.openal-buffer-loadwav","refentry"],["openal_context_create","function.openal-context-create","refentry"],["openal_context_current","function.openal-context-current","refentry"],["openal_context_destroy","function.openal-context-destroy","refentry"],["openal_context_process","function.openal-context-process","refentry"],["openal_context_suspend","function.openal-context-suspend","refentry"],["openal_device_close","function.openal-device-close","refentry"],["openal_device_open","function.openal-device-open","refentry"],["openal_listener_get","function.openal-listener-get","refentry"],["openal_listener_set","function.openal-listener-set","refentry"],["openal_source_create","function.openal-source-create","refentry"],["openal_source_destroy","function.openal-source-destroy","refentry"],["openal_source_get","function.openal-source-get","refentry"],["openal_source_pause","function.openal-source-pause","refentry"],["openal_source_play","function.openal-source-play","refentry"],["openal_source_rewind","function.openal-source-rewind","refentry"],["openal_source_set","function.openal-source-set","refentry"],["openal_source_stop","function.openal-source-stop","refentry"],["openal_stream","function.openal-stream","refentry"],["","ref.openal","reference"],["OpenAL","book.openal","book"],["","refs.utilspec.audio","set"],["","intro.kadm5","preface"],["","kadm5.requirements","section"],["","kadm5.installation","section"],["","kadm5.configuration","section"],["","kadm5.resources","section"],["","kadm5.setup","chapter"],["","kadm5.constantsaf","section"],["","pecl.kadm5.constantsop","section"],["","kadm5.constants","appendix"],["","kadm5.examples-connect","example"],["","kadm5.examples-connect","section"],["","kadm5.examples","chapter"],["","function.kadm5-chpass-principal","example"],["kadm5_chpass_principal","function.kadm5-chpass-principal","refentry"],["","function.kadm5-create-principal","example"],["kadm5_create_principal","function.kadm5-create-principal","refentry"],["","function.kadm5-delete-principal","example"],["kadm5_delete_principal","function.kadm5-delete-principal","refentry"],["kadm5_destroy","function.kadm5-destroy","refentry"],["kadm5_flush","function.kadm5-flush","refentry"],["","function.kadm5-get-policies","example"],["kadm5_get_policies","function.kadm5-get-policies","refentry"],["","function.kadm5-get-principal","example"],["kadm5_get_principal","function.kadm5-get-principal","refentry"],["","function.kadm5-get-principals","example"],["kadm5_get_principals","function.kadm5-get-principals","refentry"],["","function.kadm5-init-with-password","example"],["kadm5_init_with_password","function.kadm5-init-with-password","refentry"],["","function.kadm5-modify-principal","example"],["kadm5_modify_principal","function.kadm5-modify-principal","refentry"],["","ref.kadm5","reference"],["KADM5","book.kadm5","book"],["","intro.radius","preface"],["","radius.requirements","section"],["","radius.installation","section"],["","radius.configuration","section"],["","radius.resources","section"],["","radius.setup","chapter"],["","radius.constants","varlistentry"],["","radius.constants.options","varlistentry"],["","radius.constants.options","varlistentry"],["","radius.constants.options","section"],["","radius.constants.packets","varlistentry"],["","radius.constants.packets","varlistentry"],["","radius.constants.packets","varlistentry"],["","radius.constants.packets","varlistentry"],["","radius.constants.packets","varlistentry"],["","radius.constants.packets","varlistentry"],["","radius.constants.packets","varlistentry"],["","radius.constants.packets","varlistentry"],["","radius.constants.packets","varlistentry"],["","radius.constants.packets","varlistentry"],["","radius.constants.packets","varlistentry"],["","radius.constants.packets","varlistentry"],["","radius.constants.packets","section"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","example"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","varlistentry"],["","radius.constants.attributes","section"],["","radius.constants.vendor-specific","varlistentry"],["","radius.constants.vendor-specific","section"],["","radius.constants","appendix"],["","radius.examples","chapter"],["","function.radius-acct-open","example"],["radius_acct_open","function.radius-acct-open","refentry"],["","function.radius-add-server","example"],["radius_add_server","function.radius-add-server","refentry"],["","function.radius-auth-open","example"],["radius_auth_open","function.radius-auth-open","refentry"],["radius_close","function.radius-close","refentry"],["radius_config","function.radius-config","refentry"],["","function.radius-create-request","example"],["radius_create_request","function.radius-create-request","refentry"],["","function.radius-cvt-addr","example"],["radius_cvt_addr","function.radius-cvt-addr","refentry"],["","function.radius-cvt-int","example"],["radius_cvt_int","function.radius-cvt-int","refentry"],["","function.radius-cvt-string","example"],["radius_cvt_string","function.radius-cvt-string","refentry"],["radius_demangle_mppe_key","function.radius-demangle-mppe-key","refentry"],["radius_demangle","function.radius-demangle","refentry"],["","function.radius-get-attr","example"],["radius_get_attr","function.radius-get-attr","refentry"],["","function.radius-get-tagged-attr-data","example"],["radius_get_tagged_attr_data","function.radius-get-tagged-attr-data","refentry"],["","function.radius-get-tagged-attr-tag","example"],["radius_get_tagged_attr_tag","function.radius-get-tagged-attr-tag","refentry"],["","function.radius-get-vendor-attr","example"],["radius_get_vendor_attr","function.radius-get-vendor-attr","refentry"],["radius_put_addr","function.radius-put-addr","refentry"],["","function.radius-put-attr","example"],["radius_put_attr","function.radius-put-attr","refentry"],["","function.radius-put-int","example"],["radius_put_int","function.radius-put-int","refentry"],["","function.radius-put-string","example"],["radius_put_string","function.radius-put-string","refentry"],["radius_put_vendor_addr","function.radius-put-vendor-addr","refentry"],["","function.radius-put-vendor-attr","example"],["radius_put_vendor_attr","function.radius-put-vendor-attr","refentry"],["radius_put_vendor_int","function.radius-put-vendor-int","refentry"],["radius_put_vendor_string","function.radius-put-vendor-string","refentry"],["radius_request_authenticator","function.radius-request-authenticator","refentry"],["radius_salt_encrypt_attr","function.radius-salt-encrypt-attr","refentry"],["radius_send_request","function.radius-send-request","refentry"],["radius_server_secret","function.radius-server-secret","refentry"],["radius_strerror","function.radius-strerror","refentry"],["","ref.radius","reference"],["","book.radius","book"],["","refs.remote.auth","set"],["","intro.ncurses","preface"],["","ncurses.requirements","section"],["","ncurses.installation","section"],["","ncurses.configuration","section"],["","ncurses.resources","section"],["","ncurses.setup","chapter"],["","ncurses.errconsts","section"],["","ncurses.colorconsts","section"],["","ncurses.keyconsts","section"],["","ncurses.mouseconsts","section"],["","ncurses.constants","appendix"],["ncurses_addch","function.ncurses-addch","refentry"],["ncurses_addchnstr","function.ncurses-addchnstr","refentry"],["ncurses_addchstr","function.ncurses-addchstr","refentry"],["ncurses_addnstr","function.ncurses-addnstr","refentry"],["ncurses_addstr","function.ncurses-addstr","refentry"],["ncurses_assume_default_colors","function.ncurses-assume-default-colors","refentry"],["ncurses_attroff","function.ncurses-attroff","refentry"],["ncurses_attron","function.ncurses-attron","refentry"],["ncurses_attrset","function.ncurses-attrset","refentry"],["ncurses_baudrate","function.ncurses-baudrate","refentry"],["ncurses_beep","function.ncurses-beep","refentry"],["ncurses_bkgd","function.ncurses-bkgd","refentry"],["ncurses_bkgdset","function.ncurses-bkgdset","refentry"],["ncurses_border","function.ncurses-border","refentry"],["ncurses_bottom_panel","function.ncurses-bottom-panel","refentry"],["ncurses_can_change_color","function.ncurses-can-change-color","refentry"],["ncurses_cbreak","function.ncurses-cbreak","refentry"],["ncurses_clear","function.ncurses-clear","refentry"],["ncurses_clrtobot","function.ncurses-clrtobot","refentry"],["ncurses_clrtoeol","function.ncurses-clrtoeol","refentry"],["ncurses_color_content","function.ncurses-color-content","refentry"],["","function.ncurses-color-set","example"],["ncurses_color_set","function.ncurses-color-set","refentry"],["ncurses_curs_set","function.ncurses-curs-set","refentry"],["ncurses_def_prog_mode","function.ncurses-def-prog-mode","refentry"],["ncurses_def_shell_mode","function.ncurses-def-shell-mode","refentry"],["ncurses_define_key","function.ncurses-define-key","refentry"],["ncurses_del_panel","function.ncurses-del-panel","refentry"],["ncurses_delay_output","function.ncurses-delay-output","refentry"],["ncurses_delch","function.ncurses-delch","refentry"],["ncurses_deleteln","function.ncurses-deleteln","refentry"],["ncurses_delwin","function.ncurses-delwin","refentry"],["ncurses_doupdate","function.ncurses-doupdate","refentry"],["ncurses_echo","function.ncurses-echo","refentry"],["ncurses_echochar","function.ncurses-echochar","refentry"],["ncurses_end","function.ncurses-end","refentry"],["ncurses_erase","function.ncurses-erase","refentry"],["ncurses_erasechar","function.ncurses-erasechar","refentry"],["ncurses_filter","function.ncurses-filter","refentry"],["ncurses_flash","function.ncurses-flash","refentry"],["ncurses_flushinp","function.ncurses-flushinp","refentry"],["ncurses_getch","function.ncurses-getch","refentry"],["ncurses_getmaxyx","function.ncurses-getmaxyx","refentry"],["","function.ncurses-getmouse","example"],["ncurses_getmouse","function.ncurses-getmouse","refentry"],["ncurses_getyx","function.ncurses-getyx","refentry"],["ncurses_halfdelay","function.ncurses-halfdelay","refentry"],["","function.ncurses-has-colors","example"],["ncurses_has_colors","function.ncurses-has-colors","refentry"],["ncurses_has_ic","function.ncurses-has-ic","refentry"],["ncurses_has_il","function.ncurses-has-il","refentry"],["ncurses_has_key","function.ncurses-has-key","refentry"],["ncurses_hide_panel","function.ncurses-hide-panel","refentry"],["ncurses_hline","function.ncurses-hline","refentry"],["ncurses_inch","function.ncurses-inch","refentry"],["ncurses_init_color","function.ncurses-init-color","refentry"],["","function.ncurses-init-pair","example"],["ncurses_init_pair","function.ncurses-init-pair","refentry"],["ncurses_init","function.ncurses-init","refentry"],["ncurses_insch","function.ncurses-insch","refentry"],["ncurses_insdelln","function.ncurses-insdelln","refentry"],["ncurses_insertln","function.ncurses-insertln","refentry"],["ncurses_insstr","function.ncurses-insstr","refentry"],["ncurses_instr","function.ncurses-instr","refentry"],["ncurses_isendwin","function.ncurses-isendwin","refentry"],["ncurses_keyok","function.ncurses-keyok","refentry"],["ncurses_keypad","function.ncurses-keypad","refentry"],["ncurses_killchar","function.ncurses-killchar","refentry"],["ncurses_longname","function.ncurses-longname","refentry"],["ncurses_meta","function.ncurses-meta","refentry"],["ncurses_mouse_trafo","function.ncurses-mouse-trafo","refentry"],["ncurses_mouseinterval","function.ncurses-mouseinterval","refentry"],["","function.ncurses-mousemask","example"],["ncurses_mousemask","function.ncurses-mousemask","refentry"],["ncurses_move_panel","function.ncurses-move-panel","refentry"],["ncurses_move","function.ncurses-move","refentry"],["ncurses_mvaddch","function.ncurses-mvaddch","refentry"],["ncurses_mvaddchnstr","function.ncurses-mvaddchnstr","refentry"],["ncurses_mvaddchstr","function.ncurses-mvaddchstr","refentry"],["ncurses_mvaddnstr","function.ncurses-mvaddnstr","refentry"],["ncurses_mvaddstr","function.ncurses-mvaddstr","refentry"],["ncurses_mvcur","function.ncurses-mvcur","refentry"],["ncurses_mvdelch","function.ncurses-mvdelch","refentry"],["ncurses_mvgetch","function.ncurses-mvgetch","refentry"],["ncurses_mvhline","function.ncurses-mvhline","refentry"],["ncurses_mvinch","function.ncurses-mvinch","refentry"],["ncurses_mvvline","function.ncurses-mvvline","refentry"],["ncurses_mvwaddstr","function.ncurses-mvwaddstr","refentry"],["ncurses_napms","function.ncurses-napms","refentry"],["ncurses_new_panel","function.ncurses-new-panel","refentry"],["ncurses_newpad","function.ncurses-newpad","refentry"],["ncurses_newwin","function.ncurses-newwin","refentry"],["ncurses_nl","function.ncurses-nl","refentry"],["ncurses_nocbreak","function.ncurses-nocbreak","refentry"],["ncurses_noecho","function.ncurses-noecho","refentry"],["ncurses_nonl","function.ncurses-nonl","refentry"],["ncurses_noqiflush","function.ncurses-noqiflush","refentry"],["ncurses_noraw","function.ncurses-noraw","refentry"],["ncurses_pair_content","function.ncurses-pair-content","refentry"],["ncurses_panel_above","function.ncurses-panel-above","refentry"],["ncurses_panel_below","function.ncurses-panel-below","refentry"],["ncurses_panel_window","function.ncurses-panel-window","refentry"],["ncurses_pnoutrefresh","function.ncurses-pnoutrefresh","refentry"],["ncurses_prefresh","function.ncurses-prefresh","refentry"],["ncurses_putp","function.ncurses-putp","refentry"],["ncurses_qiflush","function.ncurses-qiflush","refentry"],["ncurses_raw","function.ncurses-raw","refentry"],["ncurses_refresh","function.ncurses-refresh","refentry"],["ncurses_replace_panel","function.ncurses-replace-panel","refentry"],["ncurses_reset_prog_mode","function.ncurses-reset-prog-mode","refentry"],["ncurses_reset_shell_mode","function.ncurses-reset-shell-mode","refentry"],["ncurses_resetty","function.ncurses-resetty","refentry"],["ncurses_savetty","function.ncurses-savetty","refentry"],["ncurses_scr_dump","function.ncurses-scr-dump","refentry"],["ncurses_scr_init","function.ncurses-scr-init","refentry"],["ncurses_scr_restore","function.ncurses-scr-restore","refentry"],["ncurses_scr_set","function.ncurses-scr-set","refentry"],["ncurses_scrl","function.ncurses-scrl","refentry"],["ncurses_show_panel","function.ncurses-show-panel","refentry"],["ncurses_slk_attr","function.ncurses-slk-attr","refentry"],["ncurses_slk_attroff","function.ncurses-slk-attroff","refentry"],["ncurses_slk_attron","function.ncurses-slk-attron","refentry"],["ncurses_slk_attrset","function.ncurses-slk-attrset","refentry"],["ncurses_slk_clear","function.ncurses-slk-clear","refentry"],["ncurses_slk_color","function.ncurses-slk-color","refentry"],["ncurses_slk_init","function.ncurses-slk-init","refentry"],["ncurses_slk_noutrefresh","function.ncurses-slk-noutrefresh","refentry"],["ncurses_slk_refresh","function.ncurses-slk-refresh","refentry"],["ncurses_slk_restore","function.ncurses-slk-restore","refentry"],["ncurses_slk_set","function.ncurses-slk-set","refentry"],["ncurses_slk_touch","function.ncurses-slk-touch","refentry"],["ncurses_standend","function.ncurses-standend","refentry"],["ncurses_standout","function.ncurses-standout","refentry"],["","function.ncurses-start-color","example"],["ncurses_start_color","function.ncurses-start-color","refentry"],["ncurses_termattrs","function.ncurses-termattrs","refentry"],["ncurses_termname","function.ncurses-termname","refentry"],["ncurses_timeout","function.ncurses-timeout","refentry"],["ncurses_top_panel","function.ncurses-top-panel","refentry"],["ncurses_typeahead","function.ncurses-typeahead","refentry"],["ncurses_ungetch","function.ncurses-ungetch","refentry"],["ncurses_ungetmouse","function.ncurses-ungetmouse","refentry"],["ncurses_update_panels","function.ncurses-update-panels","refentry"],["ncurses_use_default_colors","function.ncurses-use-default-colors","refentry"],["ncurses_use_env","function.ncurses-use-env","refentry"],["ncurses_use_extended_names","function.ncurses-use-extended-names","refentry"],["ncurses_vidattr","function.ncurses-vidattr","refentry"],["ncurses_vline","function.ncurses-vline","refentry"],["ncurses_waddch","function.ncurses-waddch","refentry"],["ncurses_waddstr","function.ncurses-waddstr","refentry"],["ncurses_wattroff","function.ncurses-wattroff","refentry"],["ncurses_wattron","function.ncurses-wattron","refentry"],["ncurses_wattrset","function.ncurses-wattrset","refentry"],["ncurses_wborder","function.ncurses-wborder","refentry"],["ncurses_wclear","function.ncurses-wclear","refentry"],["ncurses_wcolor_set","function.ncurses-wcolor-set","refentry"],["ncurses_werase","function.ncurses-werase","refentry"],["ncurses_wgetch","function.ncurses-wgetch","refentry"],["ncurses_whline","function.ncurses-whline","refentry"],["ncurses_wmouse_trafo","function.ncurses-wmouse-trafo","refentry"],["ncurses_wmove","function.ncurses-wmove","refentry"],["ncurses_wnoutrefresh","function.ncurses-wnoutrefresh","refentry"],["ncurses_wrefresh","function.ncurses-wrefresh","refentry"],["ncurses_wstandend","function.ncurses-wstandend","refentry"],["ncurses_wstandout","function.ncurses-wstandout","refentry"],["ncurses_wvline","function.ncurses-wvline","refentry"],["","ref.ncurses","reference"],["Ncurses","book.ncurses","book"],["","intro.newt","preface"],["","newt.requirements","section"],["","newt.installation","section"],["","newt.configuration","section"],["","newt.resources","section"],["","newt.setup","chapter"],["","constants.newt.reasons","section"],["","constants.newt.colorsets","section"],["","constants.newt.args-flags","section"],["","constants.newt.sense-flags","section"],["","constants.newt.components-flags","section"],["","constants.newt.fd-flags","section"],["","constants.newt.cbtree-flags","section"],["","constants.newt.entry-flags","section"],["","constants.newt.listbox-flags","section"],["","constants.newt.textbox-flags","section"],["","constants.newt.form-flags","section"],["","constants.newt.keys","section"],["","constants.newt.anchor","section"],["","constants.newt.grid-flags","section"],["","newt.constants","appendix"],["","newt.examples-usage","example"],["","newt.examples-usage","section"],["","newt.examples","chapter"],["newt_bell","function.newt-bell","refentry"],["newt_button_bar","function.newt-button-bar","refentry"],["","function.newt-button","example"],["newt_button","function.newt-button","refentry"],["newt_centered_window","function.newt-centered-window","refentry"],["newt_checkbox_get_value","function.newt-checkbox-get-value","refentry"],["newt_checkbox_set_flags","function.newt-checkbox-set-flags","refentry"],["newt_checkbox_set_value","function.newt-checkbox-set-value","refentry"],["newt_checkbox_tree_add_item","function.newt-checkbox-tree-add-item","refentry"],["newt_checkbox_tree_find_item","function.newt-checkbox-tree-find-item","refentry"],["newt_checkbox_tree_get_current","function.newt-checkbox-tree-get-current","refentry"],["newt_checkbox_tree_get_entry_value","function.newt-checkbox-tree-get-entry-value","refentry"],["newt_checkbox_tree_get_multi_selection","function.newt-checkbox-tree-get-multi-selection","refentry"],["newt_checkbox_tree_get_selection","function.newt-checkbox-tree-get-selection","refentry"],["newt_checkbox_tree_multi","function.newt-checkbox-tree-multi","refentry"],["newt_checkbox_tree_set_current","function.newt-checkbox-tree-set-current","refentry"],["newt_checkbox_tree_set_entry_value","function.newt-checkbox-tree-set-entry-value","refentry"],["newt_checkbox_tree_set_entry","function.newt-checkbox-tree-set-entry","refentry"],["newt_checkbox_tree_set_width","function.newt-checkbox-tree-set-width","refentry"],["newt_checkbox_tree","function.newt-checkbox-tree","refentry"],["newt_checkbox","function.newt-checkbox","refentry"],["newt_clear_key_buffer","function.newt-clear-key-buffer","refentry"],["newt_cls","function.newt-cls","refentry"],["newt_compact_button","function.newt-compact-button","refentry"],["newt_component_add_callback","function.newt-component-add-callback","refentry"],["newt_component_takes_focus","function.newt-component-takes-focus","refentry"],["newt_create_grid","function.newt-create-grid","refentry"],["newt_cursor_off","function.newt-cursor-off","refentry"],["newt_cursor_on","function.newt-cursor-on","refentry"],["newt_delay","function.newt-delay","refentry"],["newt_draw_form","function.newt-draw-form","refentry"],["","function.newt-draw-root-text","example"],["newt_draw_root_text","function.newt-draw-root-text","refentry"],["newt_entry_get_value","function.newt-entry-get-value","refentry"],["newt_entry_set_filter","function.newt-entry-set-filter","refentry"],["newt_entry_set_flags","function.newt-entry-set-flags","refentry"],["newt_entry_set","function.newt-entry-set","refentry"],["newt_entry","function.newt-entry","refentry"],["newt_finished","function.newt-finished","refentry"],["","function.newt-form-add-component","example"],["newt_form_add_component","function.newt-form-add-component","refentry"],["","function.newt-form-add-components","example"],["newt_form_add_components","function.newt-form-add-components","refentry"],["newt_form_add_hot_key","function.newt-form-add-hot-key","refentry"],["newt_form_destroy","function.newt-form-destroy","refentry"],["newt_form_get_current","function.newt-form-get-current","refentry"],["newt_form_run","function.newt-form-run","refentry"],["newt_form_set_background","function.newt-form-set-background","refentry"],["newt_form_set_height","function.newt-form-set-height","refentry"],["newt_form_set_size","function.newt-form-set-size","refentry"],["newt_form_set_timer","function.newt-form-set-timer","refentry"],["newt_form_set_width","function.newt-form-set-width","refentry"],["newt_form_watch_fd","function.newt-form-watch-fd","refentry"],["","function.newt-form","example"],["newt_form","function.newt-form","refentry"],["","function.newt-get-screen-size","example"],["newt_get_screen_size","function.newt-get-screen-size","refentry"],["newt_grid_add_components_to_form","function.newt-grid-add-components-to-form","refentry"],["newt_grid_basic_window","function.newt-grid-basic-window","refentry"],["newt_grid_free","function.newt-grid-free","refentry"],["newt_grid_get_size","function.newt-grid-get-size","refentry"],["newt_grid_h_close_stacked","function.newt-grid-h-close-stacked","refentry"],["newt_grid_h_stacked","function.newt-grid-h-stacked","refentry"],["newt_grid_place","function.newt-grid-place","refentry"],["newt_grid_set_field","function.newt-grid-set-field","refentry"],["newt_grid_simple_window","function.newt-grid-simple-window","refentry"],["newt_grid_v_close_stacked","function.newt-grid-v-close-stacked","refentry"],["newt_grid_v_stacked","function.newt-grid-v-stacked","refentry"],["newt_grid_wrapped_window_at","function.newt-grid-wrapped-window-at","refentry"],["newt_grid_wrapped_window","function.newt-grid-wrapped-window","refentry"],["newt_init","function.newt-init","refentry"],["newt_label_set_text","function.newt-label-set-text","refentry"],["newt_label","function.newt-label","refentry"],["newt_listbox_append_entry","function.newt-listbox-append-entry","refentry"],["newt_listbox_clear_selection","function.newt-listbox-clear-selection","refentry"],["newt_listbox_clear","function.newt-listbox-clear","refentry"],["newt_listbox_delete_entry","function.newt-listbox-delete-entry","refentry"],["newt_listbox_get_current","function.newt-listbox-get-current","refentry"],["newt_listbox_get_selection","function.newt-listbox-get-selection","refentry"],["newt_listbox_insert_entry","function.newt-listbox-insert-entry","refentry"],["newt_listbox_item_count","function.newt-listbox-item-count","refentry"],["newt_listbox_select_item","function.newt-listbox-select-item","refentry"],["newt_listbox_set_current_by_key","function.newt-listbox-set-current-by-key","refentry"],["newt_listbox_set_current","function.newt-listbox-set-current","refentry"],["newt_listbox_set_data","function.newt-listbox-set-data","refentry"],["newt_listbox_set_entry","function.newt-listbox-set-entry","refentry"],["newt_listbox_set_width","function.newt-listbox-set-width","refentry"],["newt_listbox","function.newt-listbox","refentry"],["newt_listitem_get_data","function.newt-listitem-get-data","refentry"],["newt_listitem_set","function.newt-listitem-set","refentry"],["newt_listitem","function.newt-listitem","refentry"],["newt_open_window","function.newt-open-window","refentry"],["newt_pop_help_line","function.newt-pop-help-line","refentry"],["newt_pop_window","function.newt-pop-window","refentry"],["newt_push_help_line","function.newt-push-help-line","refentry"],["newt_radio_get_current","function.newt-radio-get-current","refentry"],["newt_radiobutton","function.newt-radiobutton","refentry"],["newt_redraw_help_line","function.newt-redraw-help-line","refentry"],["newt_reflow_text","function.newt-reflow-text","refentry"],["newt_refresh","function.newt-refresh","refentry"],["newt_resize_screen","function.newt-resize-screen","refentry"],["newt_resume","function.newt-resume","refentry"],["newt_run_form","function.newt-run-form","refentry"],["newt_scale_set","function.newt-scale-set","refentry"],["newt_scale","function.newt-scale","refentry"],["newt_scrollbar_set","function.newt-scrollbar-set","refentry"],["newt_set_help_callback","function.newt-set-help-callback","refentry"],["newt_set_suspend_callback","function.newt-set-suspend-callback","refentry"],["newt_suspend","function.newt-suspend","refentry"],["newt_textbox_get_num_lines","function.newt-textbox-get-num-lines","refentry"],["newt_textbox_reflowed","function.newt-textbox-reflowed","refentry"],["newt_textbox_set_height","function.newt-textbox-set-height","refentry"],["newt_textbox_set_text","function.newt-textbox-set-text","refentry"],["newt_textbox","function.newt-textbox","refentry"],["newt_vertical_scrollbar","function.newt-vertical-scrollbar","refentry"],["newt_wait_for_key","function.newt-wait-for-key","refentry"],["newt_win_choice","function.newt-win-choice","refentry"],["","function.newt-win-entries","example"],["newt_win_entries","function.newt-win-entries","refentry"],["newt_win_menu","function.newt-win-menu","refentry"],["newt_win_message","function.newt-win-message","refentry"],["newt_win_messagev","function.newt-win-messagev","refentry"],["newt_win_ternary","function.newt-win-ternary","refentry"],["","ref.newt","reference"],["","book.newt","book"],["","intro.readline","preface"],["","readline.requirements","section"],["","readline.installation","section"],["","readline.configuration","varlistentry"],["","readline.configuration","varlistentry"],["","readline.configuration","section"],["","readline.resources","section"],["","readline.setup","chapter"],["","readline.constants","appendix"],["readline_add_history","function.readline-add-history","refentry"],["","function.readline-callback-handler-install","example"],["readline_callback_handler_install","function.readline-callback-handler-install","refentry"],["readline_callback_handler_remove","function.readline-callback-handler-remove","refentry"],["readline_callback_read_char","function.readline-callback-read-char","refentry"],["readline_clear_history","function.readline-clear-history","refentry"],["readline_completion_function","function.readline-completion-function","refentry"],["readline_info","function.readline-info","refentry"],["readline_list_history","function.readline-list-history","refentry"],["readline_on_new_line","function.readline-on-new-line","refentry"],["readline_read_history","function.readline-read-history","refentry"],["readline_redisplay","function.readline-redisplay","refentry"],["readline_write_history","function.readline-write-history","refentry"],["","function.readline","example"],["readline","function.readline","refentry"],["","ref.readline","reference"],["Readline","book.readline","book"],["","refs.utilspec.cmdline","set"],["","intro.bzip2","preface"],["","bzip2.requirements","section"],["","bzip2.installation","section"],["","bzip2.configuration","section"],["","bzip2.resources","section"],["","bzip2.setup","chapter"],["","bzip2.constants","appendix"],["","bzip2.examples","example"],["","bzip2.examples","chapter"],["bzclose","function.bzclose","refentry"],["","function.bzcompress","example"],["bzcompress","function.bzcompress","refentry"],["","function.bzdecompress","example"],["bzdecompress","function.bzdecompress","refentry"],["bzerrno","function.bzerrno","refentry"],["","function.bzerror","example"],["bzerror","function.bzerror","refentry"],["bzerrstr","function.bzerrstr","refentry"],["bzflush","function.bzflush","refentry"],["","function.bzopen","example"],["bzopen","function.bzopen","refentry"],["","function.bzread","example"],["bzread","function.bzread","refentry"],["","function.bzwrite","example"],["bzwrite","function.bzwrite","refentry"],["","ref.bzip2","reference"],["","book.bzip2","book"],["","intro.lzf","preface"],["","lzf.requirements","section"],["","lzf.installation","section"],["","lzf.configuration","section"],["","lzf.resources","section"],["","lzf.setup","chapter"],["","lzf.constants","appendix"],["lzf_compress","function.lzf-compress","refentry"],["lzf_decompress","function.lzf-decompress","refentry"],["lzf_optimized_for","function.lzf-optimized-for","refentry"],["","ref.lzf","reference"],["LZF","book.lzf","book"],["","intro.phar","example"],["","intro.phar","example"],["","intro.phar","example"],["","intro.phar","preface"],["","phar.requirements","section"],["","phar.installation","section"],["","phar.configuration","varlistentry"],["","phar.configuration","varlistentry"],["","phar.configuration","example"],["","phar.configuration","varlistentry"],["","phar.configuration","example"],["","phar.configuration","varlistentry"],["","phar.configuration","section"],["","phar.resources","section"],["","phar.setup","chapter"],["","phar.constants","table"],["","phar.constants","table"],["","phar.constants","table"],["","phar.constants","table"],["","phar.constants","appendix"],["","phar.using.intro","section"],["","phar.using.stream","section"],["","phar.using.object","section"],["","phar.using","chapter"],["","phar.creating.intro","section"],["","phar.creating","chapter"],["","phar.fileformat.ingredients","section"],["","phar.fileformat.stub","section"],["","phar.fileformat.comparison","para"],["","phar.fileformat.comparison","para"],["","phar.fileformat.comparison","para"],["","phar.fileformat.comparison","section"],["","phar.fileformat.tar","section"],["","phar.fileformat.zip","section"],["","phar.fileformat.phar","section"],["","phar.fileformat.flags","section"],["","phar.fileformat.manifestfile","section"],["","phar.fileformat.signature","section"],["","phar.fileformat","chapter"],["","class.phar","section"],["","class.phar","section"],["","phar.addemptydir","example"],["Phar::addEmptyDir","phar.addemptydir","refentry"],["","phar.addfile","example"],["Phar::addFile","phar.addfile","refentry"],["","phar.addfromstring","example"],["Phar::addFromString","phar.addfromstring","refentry"],["","phar.apiversion","example"],["Phar::apiVersion","phar.apiversion","refentry"],["","phar.buildfromdirectory","example"],["Phar::buildFromDirectory","phar.buildfromdirectory","refentry"],["","phar.buildfromiterator","example"],["","phar.buildfromiterator","example"],["Phar::buildFromIterator","phar.buildfromiterator","refentry"],["","phar.cancompress","example"],["Phar::canCompress","phar.cancompress","refentry"],["","phar.canwrite","example"],["Phar::canWrite","phar.canwrite","refentry"],["","phar.compress","example"],["Phar::compress","phar.compress","refentry"],["","phar.compressallfilesbzip2","example"],["Phar::compressAllFilesBZIP2","phar.compressallfilesbzip2","refentry"],["","phar.compressallfilesgz","example"],["Phar::compressAllFilesGZ","phar.compressallfilesgz","refentry"],["","phar.compressfiles","example"],["Phar::compressFiles","phar.compressfiles","refentry"],["","phar.construct","example"],["Phar::__construct","phar.construct","refentry"],["","phar.converttodata","example"],["Phar::convertToData","phar.converttodata","refentry"],["","phar.converttoexecutable","example"],["Phar::convertToExecutable","phar.converttoexecutable","refentry"],["","phar.copy","example"],["Phar::copy","phar.copy","refentry"],["","phar.count","example"],["Phar::count","phar.count","refentry"],["","phar.createdefaultstub","example"],["Phar::createDefaultStub","phar.createdefaultstub","refentry"],["","phar.decompress","example"],["Phar::decompress","phar.decompress","refentry"],["","phar.decompressfiles","example"],["Phar::decompressFiles","phar.decompressfiles","refentry"],["","phar.delmetadata","example"],["Phar::delMetadata","phar.delmetadata","refentry"],["","phar.delete","example"],["Phar::delete","phar.delete","refentry"],["","phar.extractto","example"],["Phar::extractTo","phar.extractto","refentry"],["","phar.getmetadata","example"],["Phar::getMetadata","phar.getmetadata","refentry"],["Phar::getModified","phar.getmodified","refentry"],["Phar::getSignature","phar.getsignature","refentry"],["","phar.getstub","example"],["Phar::getStub","phar.getstub","refentry"],["Phar::getSupportedCompression","phar.getsupportedcompression","refentry"],["Phar::getSupportedSignatures","phar.getsupportedsignatures","refentry"],["Phar::getVersion","phar.getversion","refentry"],["","phar.hasmetadata","example"],["Phar::hasMetadata","phar.hasmetadata","refentry"],["","phar.interceptfilefuncs","example"],["","phar.interceptfilefuncs","example"],["Phar::interceptFileFuncs","phar.interceptfilefuncs","refentry"],["","phar.isbuffering","example"],["Phar::isBuffering","phar.isbuffering","refentry"],["","phar.iscompressed","example"],["Phar::isCompressed","phar.iscompressed","refentry"],["Phar::isFileFormat","phar.isfileformat","refentry"],["Phar::isValidPharFilename","phar.isvalidpharfilename","refentry"],["Phar::isWritable","phar.iswritable","refentry"],["","phar.loadphar","example"],["Phar::loadPhar","phar.loadphar","refentry"],["","phar.mapphar","example"],["Phar::mapPhar","phar.mapphar","refentry"],["","phar.mount","example"],["Phar::mount","phar.mount","refentry"],["","phar.mungserver","example"],["Phar::mungServer","phar.mungserver","refentry"],["","phar.offsetexists","example"],["Phar::offsetExists","phar.offsetexists","refentry"],["","phar.offsetget","example"],["Phar::offsetGet","phar.offsetget","refentry"],["","phar.offsetset","example"],["Phar::offsetSet","phar.offsetset","refentry"],["","phar.offsetunset","example"],["Phar::offsetUnset","phar.offsetunset","refentry"],["","phar.running","example"],["Phar::running","phar.running","refentry"],["","phar.setalias","example"],["Phar::setAlias","phar.setalias","refentry"],["","phar.setdefaultstub","example"],["Phar::setDefaultStub","phar.setdefaultstub","refentry"],["","phar.setmetadata","example"],["Phar::setMetadata","phar.setmetadata","refentry"],["Phar::setSignatureAlgorithm","phar.setsignaturealgorithm","refentry"],["","phar.setstub","example"],["Phar::setStub","phar.setstub","refentry"],["","phar.startbuffering","example"],["Phar::startBuffering","phar.startbuffering","refentry"],["","phar.stopbuffering","example"],["Phar::stopBuffering","phar.stopbuffering","refentry"],["","phar.uncompressallfiles","example"],["Phar::uncompressAllFiles","phar.uncompressallfiles","refentry"],["","phar.unlinkarchive","example"],["Phar::unlinkArchive","phar.unlinkarchive","refentry"],["","phar.webphar","example"],["Phar::webPhar","phar.webphar","refentry"],["Phar","class.phar","phpdoc:classref"],["","class.phardata","section"],["","class.phardata","section"],["","phardata.addemptydir","example"],["PharData::addEmptyDir","phardata.addemptydir","refentry"],["","phardata.addfile","example"],["PharData::addFile","phardata.addfile","refentry"],["","phardata.addfromstring","example"],["PharData::addFromString","phardata.addfromstring","refentry"],["","phardata.buildfromdirectory","example"],["PharData::buildFromDirectory","phardata.buildfromdirectory","refentry"],["","phardata.buildfromiterator","example"],["","phardata.buildfromiterator","example"],["PharData::buildFromIterator","phardata.buildfromiterator","refentry"],["","phardata.compress","example"],["PharData::compress","phardata.compress","refentry"],["","phardata.compressfiles","example"],["PharData::compressFiles","phardata.compressfiles","refentry"],["","phardata.construct","example"],["PharData::__construct","phardata.construct","refentry"],["","phardata.converttodata","example"],["PharData::convertToData","phardata.converttodata","refentry"],["","phardata.converttoexecutable","example"],["PharData::convertToExecutable","phardata.converttoexecutable","refentry"],["","phardata.copy","example"],["PharData::copy","phardata.copy","refentry"],["","phardata.decompress","example"],["PharData::decompress","phardata.decompress","refentry"],["","phardata.decompressfiles","example"],["PharData::decompressFiles","phardata.decompressfiles","refentry"],["","phardata.delmetadata","example"],["PharData::delMetadata","phardata.delmetadata","refentry"],["","phardata.delete","example"],["PharData::delete","phardata.delete","refentry"],["","phardata.extractto","example"],["PharData::extractTo","phardata.extractto","refentry"],["PharData::isWritable","phardata.iswritable","refentry"],["","phardata.offsetset","example"],["PharData::offsetSet","phardata.offsetset","refentry"],["","phardata.offsetunset","example"],["PharData::offsetUnset","phardata.offsetunset","refentry"],["PharData::setAlias","phardata.setalias","refentry"],["PharData::setDefaultStub","phardata.setdefaultstub","refentry"],["","phardata.setmetadata","example"],["Phar::setMetadata","phardata.setmetadata","refentry"],["Phar::setSignatureAlgorithm","phardata.setsignaturealgorithm","refentry"],["PharData::setStub","phardata.setstub","refentry"],["PharData","class.phardata","phpdoc:classref"],["","class.pharfileinfo","section"],["","class.pharfileinfo","section"],["","pharfileinfo.chmod","example"],["PharFileInfo::chmod","pharfileinfo.chmod","refentry"],["","pharfileinfo.compress","example"],["PharFileInfo::compress","pharfileinfo.compress","refentry"],["","pharfileinfo.construct","example"],["PharFileInfo::__construct","pharfileinfo.construct","refentry"],["","pharfileinfo.decompress","example"],["PharFileInfo::decompress","pharfileinfo.decompress","refentry"],["","pharfileinfo.delmetadata","example"],["PharFileInfo::delMetadata","pharfileinfo.delmetadata","refentry"],["","pharfileinfo.getcrc32","example"],["PharFileInfo::getCRC32","pharfileinfo.getcrc32","refentry"],["","pharfileinfo.getcompressedsize","example"],["PharFileInfo::getCompressedSize","pharfileinfo.getcompressedsize","refentry"],["","pharfileinfo.getmetadata","example"],["PharFileInfo::getMetadata","pharfileinfo.getmetadata","refentry"],["","pharfileinfo.getpharflags","example"],["PharFileInfo::getPharFlags","pharfileinfo.getpharflags","refentry"],["PharFileInfo::hasMetadata","pharfileinfo.hasmetadata","refentry"],["","pharfileinfo.iscrcchecked","example"],["PharFileInfo::isCRCChecked","pharfileinfo.iscrcchecked","refentry"],["","pharfileinfo.iscompressed","example"],["PharFileInfo::isCompressed","pharfileinfo.iscompressed","refentry"],["","pharfileinfo.iscompressedbzip2","example"],["PharFileInfo::isCompressedBZIP2","pharfileinfo.iscompressedbzip2","refentry"],["","pharfileinfo.iscompressedgz","example"],["PharFileInfo::isCompressedGZ","pharfileinfo.iscompressedgz","refentry"],["","pharfileinfo.setcompressedbzip2","example"],["PharFileInfo::setCompressedBZIP2","pharfileinfo.setcompressedbzip2","refentry"],["","pharfileinfo.setcompressedgz","example"],["PharFileInfo::setCompressedGZ","pharfileinfo.setcompressedgz","refentry"],["","pharfileinfo.setmetadata","example"],["PharFileInfo::setMetadata","pharfileinfo.setmetadata","refentry"],["","pharfileinfo.setuncompressed","example"],["PharFileInfo::setUncompressed","pharfileinfo.setuncompressed","refentry"],["PharFileInfo","class.pharfileinfo","phpdoc:classref"],["","class.pharexception","section"],["","class.pharexception","section"],["PharException","pharexception.intro.unused","refentry"],["PharException","class.pharexception","phpdoc:exceptionref"],["","book.phar","book"],["","intro.rar","preface"],["","rar.requirements","section"],["","rar.installation","section"],["","rar.configuration","section"],["","rar.resources","section"],["","rar.setup","chapter"],["","rar.constants","varlistentry"],["","rar.constants","varlistentry"],["","rar.constants","varlistentry"],["","rar.constants","varlistentry"],["","rar.constants","varlistentry"],["","rar.constants","appendix"],["","rar.examples","example"],["","rar.examples","example"],["","rar.examples","chapter"],["rar_wrapper_cache_stats","function.rar-wrapper-cache-stats","refentry"],["","ref.rar","reference"],["","class.rararchive","section"],["","class.rararchive","section"],["","rararchive.close","example"],["","rararchive.close","example"],["RarArchive::close","rararchive.close","refentry"],["","rararchive.getcomment","example"],["","rararchive.getcomment","example"],["RarArchive::getComment","rararchive.getcomment","refentry"],["","rararchive.getentries","example"],["","rararchive.getentries","example"],["RarArchive::getEntries","rararchive.getentries","refentry"],["","rararchive.getentry","example"],["","rararchive.getentry","example"],["RarArchive::getEntry","rararchive.getentry","refentry"],["","rararchive.isbroken","example"],["","rararchive.isbroken","example"],["RarArchive::isBroken","rararchive.isbroken","refentry"],["","rararchive.issolid","example"],["","rararchive.issolid","example"],["RarArchive::isSolid","rararchive.issolid","refentry"],["","rararchive.open","example"],["","rararchive.open","example"],["","rararchive.open","example"],["RarArchive::open","rararchive.open","refentry"],["","rararchive.setallowbroken","example"],["","rararchive.setallowbroken","example"],["RarArchive::setAllowBroken","rararchive.setallowbroken","refentry"],["","rararchive.tostring","example"],["RarArchive::__toString","rararchive.tostring","refentry"],["RarArchive","class.rararchive","phpdoc:classref"],["","class.rarentry","section"],["","class.rarentry","section"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","varlistentry"],["","class.rarentry","section"],["","rarentry.extract","example"],["","rarentry.extract","example"],["RarEntry::extract","rarentry.extract","refentry"],["","rarentry.getattr","example"],["RarEntry::getAttr","rarentry.getattr","refentry"],["RarEntry::getCrc","rarentry.getcrc","refentry"],["RarEntry::getFileTime","rarentry.getfiletime","refentry"],["","rarentry.gethostos","example"],["","rarentry.gethostos","example"],["RarEntry::getHostOs","rarentry.gethostos","refentry"],["","rarentry.getmethod","example"],["RarEntry::getMethod","rarentry.getmethod","refentry"],["","rarentry.getname","example"],["RarEntry::getName","rarentry.getname","refentry"],["","rarentry.getpackedsize","example"],["RarEntry::getPackedSize","rarentry.getpackedsize","refentry"],["","rarentry.getstream","example"],["RarEntry::getStream","rarentry.getstream","refentry"],["","rarentry.getunpackedsize","example"],["RarEntry::getUnpackedSize","rarentry.getunpackedsize","refentry"],["","rarentry.getversion","example"],["RarEntry::getVersion","rarentry.getversion","refentry"],["RarEntry::isDirectory","rarentry.isdirectory","refentry"],["RarEntry::isEncrypted","rarentry.isencrypted","refentry"],["RarEntry::__toString","rarentry.tostring","refentry"],["RarEntry","class.rarentry","phpdoc:classref"],["","class.rarexception","section"],["","class.rarexception","section"],["","rarexception.isusingexceptions","example"],["RarException::isUsingExceptions","rarexception.isusingexceptions","refentry"],["","rarexception.setusingexceptions","example"],["RarException::setUsingExceptions","rarexception.setusingexceptions","refentry"],["RarException","class.rarexception","phpdoc:classref"],["Rar","book.rar","book"],["","intro.zip","preface"],["","zip.requirements","section"],["","zip.requirements","section"],["","zip.installation","section"],["","zip.configuration","section"],["","zip.resources","section"],["","zip.setup","chapter"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","varlistentry"],["","zip.constants","appendix"],["","zip.examples","example"],["","zip.examples","example"],["","zip.examples","example"],["","zip.examples","example"],["","zip.examples","chapter"],["","class.ziparchive","section"],["","class.ziparchive","section"],["","class.ziparchive","varlistentry"],["","class.ziparchive","varlistentry"],["","class.ziparchive","varlistentry"],["","class.ziparchive","varlistentry"],["","class.ziparchive","varlistentry"],["","class.ziparchive","section"],["","ziparchive.addemptydir","example"],["ZipArchive::addEmptyDir","ziparchive.addemptydir","refentry"],["","ziparchive.addfile","example"],["ZipArchive::addFile","ziparchive.addfile","refentry"],["","ziparchive.addfromstring","example"],["","ziparchive.addfromstring","example"],["ZipArchive::addFromString","ziparchive.addfromstring","refentry"],["","ziparchive.addglob","example"],["ZipArchive::addGlob","ziparchive.addglob","refentry"],["","ziparchive.addpattern","example"],["ZipArchive::addPattern","ziparchive.addpattern","refentry"],["ZipArchive::close","ziparchive.close","refentry"],["","ziparchive.deleteindex","example"],["ZipArchive::deleteIndex","ziparchive.deleteindex","refentry"],["","ziparchive.deletename","example"],["ZipArchive::deleteName","ziparchive.deletename","refentry"],["","ziparchive.extractto","example"],["","ziparchive.extractto","example"],["ZipArchive::extractTo","ziparchive.extractto","refentry"],["","ziparchive.getarchivecomment","example"],["ZipArchive::getArchiveComment","ziparchive.getarchivecomment","refentry"],["","ziparchive.getcommentindex","example"],["ZipArchive::getCommentIndex","ziparchive.getcommentindex","refentry"],["","ziparchive.getcommentname","example"],["ZipArchive::getCommentName","ziparchive.getcommentname","refentry"],["","ziparchive.getfromindex","example"],["ZipArchive::getFromIndex","ziparchive.getfromindex","refentry"],["","ziparchive.getfromname","example"],["","ziparchive.getfromname","example"],["ZipArchive::getFromName","ziparchive.getfromname","refentry"],["","ziparchive.getnameindex","example"],["ZipArchive::getNameIndex","ziparchive.getnameindex","refentry"],["ZipArchive::getStatusString","ziparchive.getstatusstring","refentry"],["","ziparchive.getstream","example"],["","ziparchive.getstream","example"],["","ziparchive.getstream","example"],["ZipArchive::getStream","ziparchive.getstream","refentry"],["","ziparchive.locatename","example"],["ZipArchive::locateName","ziparchive.locatename","refentry"],["","ziparchive.open","example"],["","ziparchive.open","example"],["ZipArchive::open","ziparchive.open","refentry"],["","ziparchive.renameindex","example"],["ZipArchive::renameIndex","ziparchive.renameindex","refentry"],["","ziparchive.renamename","example"],["ZipArchive::renameName","ziparchive.renamename","refentry"],["","ziparchive.setarchivecomment","example"],["ZipArchive::setArchiveComment","ziparchive.setarchivecomment","refentry"],["","ziparchive.setcommentindex","example"],["ZipArchive::setCommentIndex","ziparchive.setcommentindex","refentry"],["","ziparchive.setcommentname","example"],["ZipArchive::setCommentName","ziparchive.setcommentname","refentry"],["","ziparchive.statindex","example"],["ZipArchive::statIndex","ziparchive.statindex","refentry"],["","ziparchive.statname","example"],["ZipArchive::statName","ziparchive.statname","refentry"],["ZipArchive::unchangeAll","ziparchive.unchangeall","refentry"],["ZipArchive::unchangeArchive","ziparchive.unchangearchive","refentry"],["ZipArchive::unchangeIndex","ziparchive.unchangeindex","refentry"],["ZipArchive::unchangeName","ziparchive.unchangename","refentry"],["ZipArchive","class.ziparchive","phpdoc:classref"],["zip_close","function.zip-close","refentry"],["zip_entry_close","function.zip-entry-close","refentry"],["zip_entry_compressedsize","function.zip-entry-compressedsize","refentry"],["zip_entry_compressionmethod","function.zip-entry-compressionmethod","refentry"],["zip_entry_filesize","function.zip-entry-filesize","refentry"],["zip_entry_name","function.zip-entry-name","refentry"],["zip_entry_open","function.zip-entry-open","refentry"],["zip_entry_read","function.zip-entry-read","refentry"],["zip_open","function.zip-open","refentry"],["zip_read","function.zip-read","refentry"],["","ref.zip","reference"],["","book.zip","book"],["","intro.zlib","preface"],["","zlib.requirements","section"],["","zlib.installation","section"],["","zlib.configuration","varlistentry"],["","zlib.configuration","varlistentry"],["","zlib.configuration","varlistentry"],["","zlib.configuration","section"],["","zlib.resources","section"],["","zlib.setup","chapter"],["","zlib.constants","varlistentry"],["","zlib.constants","varlistentry"],["","zlib.constants","appendix"],["","zlib.examples","example"],["","zlib.examples","chapter"],["","function.gzclose","example"],["gzclose","function.gzclose","refentry"],["","function.gzcompress","example"],["gzcompress","function.gzcompress","refentry"],["gzdecode","function.gzdecode","refentry"],["","function.gzdeflate","example"],["gzdeflate","function.gzdeflate","refentry"],["","function.gzencode","example"],["gzencode","function.gzencode","refentry"],["","function.gzeof","example"],["gzeof","function.gzeof","refentry"],["","function.gzfile","example"],["gzfile","function.gzfile","refentry"],["","function.gzgetc","example"],["gzgetc","function.gzgetc","refentry"],["","function.gzgets","example"],["gzgets","function.gzgets","refentry"],["","function.gzgetss","example"],["gzgetss","function.gzgetss","refentry"],["","function.gzinflate","example"],["gzinflate","function.gzinflate","refentry"],["","function.gzopen","example"],["gzopen","function.gzopen","refentry"],["","function.gzpassthru","example"],["gzpassthru","function.gzpassthru","refentry"],["gzputs","function.gzputs","refentry"],["","function.gzread","example"],["gzread","function.gzread","refentry"],["gzrewind","function.gzrewind","refentry"],["","function.gzseek","example"],["gzseek","function.gzseek","refentry"],["gztell","function.gztell","refentry"],["","function.gzuncompress","example"],["gzuncompress","function.gzuncompress","refentry"],["","function.gzwrite","example"],["gzwrite","function.gzwrite","refentry"],["readgzfile","function.readgzfile","refentry"],["zlib_decode","function.zlib-decode","refentry"],["zlib_encode","function.zlib-encode","refentry"],["zlib_get_coding_type","function.zlib-get-coding-type","refentry"],["","ref.zlib","reference"],["Zlib","book.zlib","book"],["","refs.compression","set"],["","intro.mcve","preface"],["","mcve.requirements","section"],["","mcve.installation","section"],["","mcve.configuration","section"],["","mcve.resources","section"],["","mcve.setup","chapter"],["","mcve.constants","varlistentry"],["","mcve.constants","varlistentry"],["","mcve.constants","varlistentry"],["","mcve.constants","varlistentry"],["","mcve.constants","varlistentry"],["","mcve.constants","appendix"],["m_checkstatus","function.m-checkstatus","refentry"],["m_completeauthorizations","function.m-completeauthorizations","refentry"],["m_connect","function.m-connect","refentry"],["m_connectionerror","function.m-connectionerror","refentry"],["m_deletetrans","function.m-deletetrans","refentry"],["m_destroyconn","function.m-destroyconn","refentry"],["m_destroyengine","function.m-destroyengine","refentry"],["m_getcell","function.m-getcell","refentry"],["m_getcellbynum","function.m-getcellbynum","refentry"],["m_getcommadelimited","function.m-getcommadelimited","refentry"],["m_getheader","function.m-getheader","refentry"],["m_initconn","function.m-initconn","refentry"],["m_initengine","function.m-initengine","refentry"],["m_iscommadelimited","function.m-iscommadelimited","refentry"],["m_maxconntimeout","function.m-maxconntimeout","refentry"],["m_monitor","function.m-monitor","refentry"],["m_numcolumns","function.m-numcolumns","refentry"],["m_numrows","function.m-numrows","refentry"],["m_parsecommadelimited","function.m-parsecommadelimited","refentry"],["m_responsekeys","function.m-responsekeys","refentry"],["m_responseparam","function.m-responseparam","refentry"],["m_returnstatus","function.m-returnstatus","refentry"],["m_setblocking","function.m-setblocking","refentry"],["m_setdropfile","function.m-setdropfile","refentry"],["m_setip","function.m-setip","refentry"],["m_setssl_cafile","function.m-setssl-cafile","refentry"],["m_setssl_files","function.m-setssl-files","refentry"],["m_setssl","function.m-setssl","refentry"],["m_settimeout","function.m-settimeout","refentry"],["m_sslcert_gen_hash","function.m-sslcert-gen-hash","refentry"],["m_transactionssent","function.m-transactionssent","refentry"],["m_transinqueue","function.m-transinqueue","refentry"],["m_transkeyval","function.m-transkeyval","refentry"],["m_transnew","function.m-transnew","refentry"],["m_transsend","function.m-transsend","refentry"],["m_uwait","function.m-uwait","refentry"],["m_validateidentifier","function.m-validateidentifier","refentry"],["m_verifyconnection","function.m-verifyconnection","refentry"],["m_verifysslcert","function.m-verifysslcert","refentry"],["","ref.mcve","reference"],["MCVE","book.mcve","book"],["","intro.spplus","preface"],["","spplus.requirements","section"],["","spplus.installation","section"],["","spplus.configuration","section"],["","spplus.resources","section"],["","spplus.setup","chapter"],["","spplus.constants","appendix"],["calcul_hmac","function.calcul-hmac","refentry"],["calculhmac","function.calculhmac","refentry"],["nthmac","function.nthmac","refentry"],["signeurlpaiement","function.signeurlpaiement","refentry"],["","ref.spplus","reference"],["SPPLUS","book.spplus","book"],["","refs.creditcard","set"],["","intro.crack","preface"],["","crack.requirements","section"],["","crack.installation","section"],["","crack.configuration","section"],["","crack.resources","section"],["","crack.setup","chapter"],["","crack.constants","appendix"],["","crack.examples","example"],["","crack.examples","appendix"],["crack_check","function.crack-check","refentry"],["crack_closedict","function.crack-closedict","refentry"],["crack_getlastmessage","function.crack-getlastmessage","refentry"],["crack_opendict","function.crack-opendict","refentry"],["","ref.crack","reference"],["Crack","book.crack","book"],["","intro.hash","preface"],["","hash.requirements","section"],["","hash.installation","section"],["","hash.configuration","section"],["","hash.resources","section"],["","hash.setup","chapter"],["","hash.constants","varlistentry"],["","hash.constants","appendix"],["","function.hash-algos","example"],["hash_algos","function.hash-algos","refentry"],["","function.hash-copy","example"],["hash_copy","function.hash-copy","refentry"],["","function.hash-file","example"],["hash_file","function.hash-file","refentry"],["","function.hash-final","example"],["hash_final","function.hash-final","refentry"],["","function.hash-hmac-file","example"],["hash_hmac_file","function.hash-hmac-file","refentry"],["","function.hash-hmac","example"],["hash_hmac","function.hash-hmac","refentry"],["","function.hash-init","example"],["hash_init","function.hash-init","refentry"],["","function.hash-pbkdf2","example"],["hash_pbkdf2","function.hash-pbkdf2","refentry"],["hash_update_file","function.hash-update-file","refentry"],["","function.hash-update-stream","example"],["hash_update_stream","function.hash-update-stream","refentry"],["hash_update","function.hash-update","refentry"],["","function.hash","example"],["hash","function.hash","refentry"],["","ref.hash","reference"],["Hash","book.hash","book"],["","intro.mcrypt","preface"],["","mcrypt.requirements","section"],["","mcrypt.installation","section"],["","mcrypt.configuration","varlistentry"],["","mcrypt.configuration","varlistentry"],["","mcrypt.configuration","section"],["","mcrypt.resources","section"],["","mcrypt.setup","chapter"],["","mcrypt.constants","varlistentry"],["","mcrypt.constants","varlistentry"],["","mcrypt.constants","varlistentry"],["","mcrypt.constants","varlistentry"],["","mcrypt.constants","varlistentry"],["","mcrypt.constants","appendix"],["","mcrypt.ciphers","appendix"],["","mcrypt.examples","example"],["","mcrypt.examples","appendix"],["mcrypt_cbc","function.mcrypt-cbc","refentry"],["mcrypt_cfb","function.mcrypt-cfb","refentry"],["","function.mcrypt-create-iv","example"],["mcrypt_create_iv","function.mcrypt-create-iv","refentry"],["mcrypt_decrypt","function.mcrypt-decrypt","refentry"],["mcrypt_ecb","function.mcrypt-ecb","refentry"],["","function.mcrypt-enc-get-algorithms-name","example"],["mcrypt_enc_get_algorithms_name","function.mcrypt-enc-get-algorithms-name","refentry"],["mcrypt_enc_get_block_size","function.mcrypt-enc-get-block-size","refentry"],["mcrypt_enc_get_iv_size","function.mcrypt-enc-get-iv-size","refentry"],["mcrypt_enc_get_key_size","function.mcrypt-enc-get-key-size","refentry"],["","function.mcrypt-enc-get-modes-name","example"],["mcrypt_enc_get_modes_name","function.mcrypt-enc-get-modes-name","refentry"],["","function.mcrypt-enc-get-supported-key-sizes","example"],["mcrypt_enc_get_supported_key_sizes","function.mcrypt-enc-get-supported-key-sizes","refentry"],["mcrypt_enc_is_block_algorithm_mode","function.mcrypt-enc-is-block-algorithm-mode","refentry"],["mcrypt_enc_is_block_algorithm","function.mcrypt-enc-is-block-algorithm","refentry"],["mcrypt_enc_is_block_mode","function.mcrypt-enc-is-block-mode","refentry"],["mcrypt_enc_self_test","function.mcrypt-enc-self-test","refentry"],["","function.mcrypt-encrypt","example"],["mcrypt_encrypt","function.mcrypt-encrypt","refentry"],["mcrypt_generic_deinit","function.mcrypt-generic-deinit","refentry"],["mcrypt_generic_end","function.mcrypt-generic-end","refentry"],["mcrypt_generic_init","function.mcrypt-generic-init","refentry"],["mcrypt_generic","function.mcrypt-generic","refentry"],["","function.mcrypt-get-block-size","example"],["mcrypt_get_block_size","function.mcrypt-get-block-size","refentry"],["","function.mcrypt-get-cipher-name","example"],["mcrypt_get_cipher_name","function.mcrypt-get-cipher-name","refentry"],["","function.mcrypt-get-iv-size","example"],["mcrypt_get_iv_size","function.mcrypt-get-iv-size","refentry"],["","function.mcrypt-get-key-size","example"],["mcrypt_get_key_size","function.mcrypt-get-key-size","refentry"],["","function.mcrypt-list-algorithms","example"],["mcrypt_list_algorithms","function.mcrypt-list-algorithms","refentry"],["","function.mcrypt-list-modes","example"],["mcrypt_list_modes","function.mcrypt-list-modes","refentry"],["mcrypt_module_close","function.mcrypt-module-close","refentry"],["mcrypt_module_get_algo_block_size","function.mcrypt-module-get-algo-block-size","refentry"],["mcrypt_module_get_algo_key_size","function.mcrypt-module-get-algo-key-size","refentry"],["mcrypt_module_get_supported_key_sizes","function.mcrypt-module-get-supported-key-sizes","refentry"],["mcrypt_module_is_block_algorithm_mode","function.mcrypt-module-is-block-algorithm-mode","refentry"],["mcrypt_module_is_block_algorithm","function.mcrypt-module-is-block-algorithm","refentry"],["mcrypt_module_is_block_mode","function.mcrypt-module-is-block-mode","refentry"],["","function.mcrypt-module-open","example"],["","function.mcrypt-module-open","example"],["mcrypt_module_open","function.mcrypt-module-open","refentry"],["","function.mcrypt-module-self-test","example"],["mcrypt_module_self_test","function.mcrypt-module-self-test","refentry"],["mcrypt_ofb","function.mcrypt-ofb","refentry"],["","function.mdecrypt-generic","example"],["mdecrypt_generic","function.mdecrypt-generic","refentry"],["","ref.mcrypt","reference"],["","book.mcrypt","book"],["","intro.mhash","preface"],["","mhash.requirements","section"],["","mhash.installation","section"],["","mhash.configuration","section"],["","mhash.resources","section"],["","mhash.setup","chapter"],["","mhash.constants","appendix"],["","mhash.examples","example"],["","mhash.examples","appendix"],["","function.mhash-count","example"],["mhash_count","function.mhash-count","refentry"],["","function.mhash-get-block-size","example"],["mhash_get_block_size","function.mhash-get-block-size","refentry"],["","function.mhash-get-hash-name","example"],["mhash_get_hash_name","function.mhash-get-hash-name","refentry"],["mhash_keygen_s2k","function.mhash-keygen-s2k","refentry"],["mhash","function.mhash","refentry"],["","ref.mhash","reference"],["","book.mhash","book"],["","intro.openssl","preface"],["","openssl.requirements","section"],["","openssl.installation","section"],["","openssl.configuration","section"],["","openssl.resources","section"],["","openssl.setup","chapter"],["","openssl.purpose-check","varlistentry"],["","openssl.purpose-check","varlistentry"],["","openssl.purpose-check","varlistentry"],["","openssl.purpose-check","varlistentry"],["","openssl.purpose-check","varlistentry"],["","openssl.purpose-check","varlistentry"],["","openssl.purpose-check","varlistentry"],["","openssl.purpose-check","section"],["","openssl.padding","varlistentry"],["","openssl.padding","varlistentry"],["","openssl.padding","varlistentry"],["","openssl.padding","varlistentry"],["","openssl.padding","section"],["","openssl.key-types","varlistentry"],["","openssl.key-types","varlistentry"],["","openssl.key-types","varlistentry"],["","openssl.key-types","varlistentry"],["","openssl.key-types","section"],["","openssl.pkcs7.flags","section"],["","openssl.signature-algos","varlistentry"],["","openssl.signature-algos","varlistentry"],["","openssl.signature-algos","varlistentry"],["","openssl.signature-algos","varlistentry"],["","openssl.signature-algos","varlistentry"],["","openssl.signature-algos","varlistentry"],["","openssl.signature-algos","varlistentry"],["","openssl.signature-algos","varlistentry"],["","openssl.signature-algos","varlistentry"],["","openssl.signature-algos","varlistentry"],["","openssl.signature-algos","section"],["","openssl.ciphers","varlistentry"],["","openssl.ciphers","varlistentry"],["","openssl.ciphers","varlistentry"],["","openssl.ciphers","varlistentry"],["","openssl.ciphers","varlistentry"],["","openssl.ciphers","varlistentry"],["","openssl.ciphers","varlistentry"],["","openssl.ciphers","varlistentry"],["","openssl.ciphers","section"],["","openssl.constversion","varlistentry"],["","openssl.constversion","varlistentry"],["","openssl.constversion","section"],["","openssl.constsni","varlistentry"],["","openssl.constsni","section"],["","openssl.constants","appendix"],["","openssl.certparams","appendix"],["","openssl.cert.verification","appendix"],["","function.openssl-cipher-iv-length","example"],["openssl_cipher_iv_length","function.openssl-cipher-iv-length","refentry"],["openssl_csr_export_to_file","function.openssl-csr-export-to-file","refentry"],["openssl_csr_export","function.openssl-csr-export","refentry"],["openssl_csr_get_public_key","function.openssl-csr-get-public-key","refentry"],["openssl_csr_get_subject","function.openssl-csr-get-subject","refentry"],["","function.openssl-csr-new","example"],["openssl_csr_new","function.openssl-csr-new","refentry"],["","function.openssl-csr-sign","example"],["openssl_csr_sign","function.openssl-csr-sign","refentry"],["openssl_decrypt","function.openssl-decrypt","refentry"],["openssl_dh_compute_key","function.openssl-dh-compute-key","refentry"],["openssl_digest","function.openssl-digest","refentry"],["openssl_encrypt","function.openssl-encrypt","refentry"],["","function.openssl-error-string","example"],["openssl_error_string","function.openssl-error-string","refentry"],["openssl_free_key","function.openssl-free-key","refentry"],["","function.openssl-get-cipher-methods","example"],["openssl_get_cipher_methods","function.openssl-get-cipher-methods","refentry"],["","function.openssl-get-md-methods","example"],["openssl_get_md_methods","function.openssl-get-md-methods","refentry"],["openssl_get_privatekey","function.openssl-get-privatekey","refentry"],["openssl_get_publickey","function.openssl-get-publickey","refentry"],["","function.openssl-open","example"],["openssl_open","function.openssl-open","refentry"],["openssl_pbkdf2","function.openssl-pbkdf2","refentry"],["openssl_pkcs12_export_to_file","function.openssl-pkcs12-export-to-file","refentry"],["openssl_pkcs12_export","function.openssl-pkcs12-export","refentry"],["openssl_pkcs12_read","function.openssl-pkcs12-read","refentry"],["","function.openssl-pkcs7-decrypt","example"],["openssl_pkcs7_decrypt","function.openssl-pkcs7-decrypt","refentry"],["","function.openssl-pkcs7-encrypt","example"],["openssl_pkcs7_encrypt","function.openssl-pkcs7-encrypt","refentry"],["","function.openssl-pkcs7-sign","example"],["openssl_pkcs7_sign","function.openssl-pkcs7-sign","refentry"],["openssl_pkcs7_verify","function.openssl-pkcs7-verify","refentry"],["openssl_pkey_export_to_file","function.openssl-pkey-export-to-file","refentry"],["openssl_pkey_export","function.openssl-pkey-export","refentry"],["openssl_pkey_free","function.openssl-pkey-free","refentry"],["openssl_pkey_get_details","function.openssl-pkey-get-details","refentry"],["openssl_pkey_get_private","function.openssl-pkey-get-private","refentry"],["openssl_pkey_get_public","function.openssl-pkey-get-public","refentry"],["openssl_pkey_new","function.openssl-pkey-new","refentry"],["openssl_private_decrypt","function.openssl-private-decrypt","refentry"],["openssl_private_encrypt","function.openssl-private-encrypt","refentry"],["openssl_public_decrypt","function.openssl-public-decrypt","refentry"],["openssl_public_encrypt","function.openssl-public-encrypt","refentry"],["","function.openssl-random-pseudo-bytes","example"],["openssl_random_pseudo_bytes","function.openssl-random-pseudo-bytes","refentry"],["","function.openssl-seal","example"],["openssl_seal","function.openssl-seal","refentry"],["","function.openssl-sign","example"],["openssl_sign","function.openssl-sign","refentry"],["","function.openssl-verify","example"],["openssl_verify","function.openssl-verify","refentry"],["openssl_x509_check_private_key","function.openssl-x509-check-private-key","refentry"],["openssl_x509_checkpurpose","function.openssl-x509-checkpurpose","refentry"],["openssl_x509_export_to_file","function.openssl-x509-export-to-file","refentry"],["openssl_x509_export","function.openssl-x509-export","refentry"],["openssl_x509_free","function.openssl-x509-free","refentry"],["openssl_x509_parse","function.openssl-x509-parse","refentry"],["openssl_x509_read","function.openssl-x509-read","refentry"],["","ref.openssl","reference"],["","book.openssl","book"],["","intro.password","preface"],["","password.requirements","section"],["","password.installation","section"],["","password.configuration","section"],["","password.resources","section"],["","password.setup","chapter"],["","password.constants","varlistentry"],["","password.constants","varlistentry"],["","password.constants","appendix"],["password_get_info","function.password-get-info","refentry"],["","function.password-hash","example"],["","function.password-hash","example"],["","function.password-hash","example"],["","function.password-hash","example"],["password_hash","function.password-hash","refentry"],["password_needs_rehash","function.password-needs-rehash","refentry"],["","function.password-verify","example"],["password_verify","function.password-verify","refentry"],["","ref.password","reference"],["","book.password","book"],["","refs.crypto","set"],["","intro.dba","preface"],["","dba.requirements","section"],["","dba.installation","section"],["","dba.configuration","varlistentry"],["","dba.configuration","section"],["","dba.resources","section"],["","dba.setup","chapter"],["","dba.constants","appendix"],["","dba.example","example"],["","dba.example","example"],["","dba.example","section"],["","dba.examples","chapter"],["dba_close","function.dba-close","refentry"],["dba_delete","function.dba-delete","refentry"],["dba_exists","function.dba-exists","refentry"],["dba_fetch","function.dba-fetch","refentry"],["dba_firstkey","function.dba-firstkey","refentry"],["","function.dba-handlers","example"],["dba_handlers","function.dba-handlers","refentry"],["dba_insert","function.dba-insert","refentry"],["dba_key_split","function.dba-key-split","refentry"],["dba_list","function.dba-list","refentry"],["dba_nextkey","function.dba-nextkey","refentry"],["dba_open","function.dba-open","refentry"],["dba_optimize","function.dba-optimize","refentry"],["dba_popen","function.dba-popen","refentry"],["dba_replace","function.dba-replace","refentry"],["dba_sync","function.dba-sync","refentry"],["","ref.dba","reference"],["DBA","book.dba","book"],["","intro.dbx","preface"],["","dbx.requirements","section"],["","dbx.installation","section"],["","dbx.configuration","varlistentry"],["","dbx.configuration","section"],["","dbx.resources","section"],["","dbx.setup","chapter"],["","constants.dbx","varlistentry"],["","constants.dbx","varlistentry"],["","constants.dbx","varlistentry"],["","constants.dbx","varlistentry"],["","constants.dbx","varlistentry"],["","constants.dbx","varlistentry"],["","constants.dbx","varlistentry"],["","constants.dbx","varlistentry"],["","constants.dbx","varlistentry"],["","constants.dbx","varlistentry"],["","constants.dbx","varlistentry"],["","constants.dbx","varlistentry"],["","constants.dbx","varlistentry"],["","constants.dbx","varlistentry"],["","constants.dbx","varlistentry"],["","constants.dbx","varlistentry"],["","constants.dbx","varlistentry"],["","constants.dbx","varlistentry"],["","constants.dbx","varlistentry"],["","constants.dbx","varlistentry"],["","constants.dbx","varlistentry"],["","constants.dbx","appendix"],["","function.dbx-close","example"],["dbx_close","function.dbx-close","refentry"],["","function.dbx-compare","example"],["dbx_compare","function.dbx-compare","refentry"],["","function.dbx-connect","example"],["dbx_connect","function.dbx-connect","refentry"],["","function.dbx-error","example"],["dbx_error","function.dbx-error","refentry"],["","function.dbx-escape-string","example"],["dbx_escape_string","function.dbx-escape-string","refentry"],["","function.dbx-fetch-row","example"],["dbx_fetch_row","function.dbx-fetch-row","refentry"],["","function.dbx-query","example"],["","function.dbx-query","example"],["","function.dbx-query","example"],["","function.dbx-query","example"],["dbx_query","function.dbx-query","refentry"],["","function.dbx-sort","example"],["dbx_sort","function.dbx-sort","refentry"],["","ref.dbx","reference"],["","book.dbx","book"],["","intro.uodbc","preface"],["","uodbc.requirements","section"],["","odbc.installation","section"],["","odbc.configuration","varlistentry"],["","odbc.configuration","varlistentry"],["","odbc.configuration","varlistentry"],["","odbc.configuration","varlistentry"],["","odbc.configuration","varlistentry"],["","odbc.configuration","varlistentry"],["","odbc.configuration","varlistentry"],["","odbc.configuration","varlistentry"],["","odbc.configuration","varlistentry"],["","odbc.configuration","varlistentry"],["","odbc.configuration","section"],["","uodbc.resources","section"],["","uodbc.setup","chapter"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","varlistentry"],["","uodbc.constants","appendix"],["odbc_autocommit","function.odbc-autocommit","refentry"],["odbc_binmode","function.odbc-binmode","refentry"],["odbc_close_all","function.odbc-close-all","refentry"],["odbc_close","function.odbc-close","refentry"],["odbc_columnprivileges","function.odbc-columnprivileges","refentry"],["odbc_columns","function.odbc-columns","refentry"],["odbc_commit","function.odbc-commit","refentry"],["","function.odbc-connect","example"],["odbc_connect","function.odbc-connect","refentry"],["odbc_cursor","function.odbc-cursor","refentry"],["odbc_data_source","function.odbc-data-source","refentry"],["odbc_do","function.odbc-do","refentry"],["odbc_error","function.odbc-error","refentry"],["odbc_errormsg","function.odbc-errormsg","refentry"],["odbc_exec","function.odbc-exec","refentry"],["","function.odbc-execute","example"],["odbc_execute","function.odbc-execute","refentry"],["odbc_fetch_array","function.odbc-fetch-array","refentry"],["","function.odbc-fetch-into","example"],["odbc_fetch_into","function.odbc-fetch-into","refentry"],["odbc_fetch_object","function.odbc-fetch-object","refentry"],["odbc_fetch_row","function.odbc-fetch-row","refentry"],["odbc_field_len","function.odbc-field-len","refentry"],["odbc_field_name","function.odbc-field-name","refentry"],["odbc_field_num","function.odbc-field-num","refentry"],["odbc_field_precision","function.odbc-field-precision","refentry"],["odbc_field_scale","function.odbc-field-scale","refentry"],["odbc_field_type","function.odbc-field-type","refentry"],["odbc_foreignkeys","function.odbc-foreignkeys","refentry"],["odbc_free_result","function.odbc-free-result","refentry"],["odbc_gettypeinfo","function.odbc-gettypeinfo","refentry"],["odbc_longreadlen","function.odbc-longreadlen","refentry"],["","function.odbc-next-result","example"],["odbc_next_result","function.odbc-next-result","refentry"],["odbc_num_fields","function.odbc-num-fields","refentry"],["odbc_num_rows","function.odbc-num-rows","refentry"],["odbc_pconnect","function.odbc-pconnect","refentry"],["","function.odbc-prepare","example"],["odbc_prepare","function.odbc-prepare","refentry"],["odbc_primarykeys","function.odbc-primarykeys","refentry"],["odbc_procedurecolumns","function.odbc-procedurecolumns","refentry"],["odbc_procedures","function.odbc-procedures","refentry"],["odbc_result_all","function.odbc-result-all","refentry"],["","function.odbc-result","example"],["odbc_result","function.odbc-result","refentry"],["odbc_rollback","function.odbc-rollback","refentry"],["","function.odbc-setoption","example"],["odbc_setoption","function.odbc-setoption","refentry"],["odbc_specialcolumns","function.odbc-specialcolumns","refentry"],["odbc_statistics","function.odbc-statistics","refentry"],["odbc_tableprivileges","function.odbc-tableprivileges","refentry"],["odbc_tables","function.odbc-tables","refentry"],["","ref.uodbc","reference"],["ODBC","book.uodbc","book"],["","intro.pdo","preface"],["","pdo.requirements","section"],["","pdo.installation","procedure"],["","pdo.installation","procedure"],["","pdo.installation","section"],["","pdo.configuration","varlistentry"],["","pdo.configuration","section"],["","pdo.resources","section"],["","pdo.setup","chapter"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","example"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","varlistentry"],["","pdo.constants","appendix"],["","pdo.connections","example"],["","pdo.connections","example"],["","pdo.connections","example"],["","pdo.connections","example"],["","pdo.connections","chapter"],["","pdo.transactions","example"],["","pdo.transactions","chapter"],["","pdo.prepared-statements","example"],["","pdo.prepared-statements","example"],["","pdo.prepared-statements","example"],["","pdo.prepared-statements","example"],["","pdo.prepared-statements","example"],["","pdo.prepared-statements","example"],["","pdo.prepared-statements","chapter"],["","pdo.error-handling","example"],["","pdo.error-handling","example"],["","pdo.error-handling","chapter"],["","pdo.lobs","example"],["","pdo.lobs","example"],["","pdo.lobs","example"],["","pdo.lobs","chapter"],["","class.pdo","section"],["","class.pdo","section"],["","pdo.begintransaction","example"],["PDO::beginTransaction","pdo.begintransaction","refentry"],["","pdo.commit","example"],["","pdo.commit","example"],["PDO::commit","pdo.commit","refentry"],["","pdo.construct","example"],["","pdo.construct","example"],["","pdo.construct","example"],["PDO::__construct","pdo.construct","refentry"],["","pdo.errorcode","example"],["PDO::errorCode","pdo.errorcode","refentry"],["","pdo.errorinfo","example"],["PDO::errorInfo","pdo.errorinfo","refentry"],["","pdo.exec","example"],["PDO::exec","pdo.exec","refentry"],["","pdo.getattribute","example"],["PDO::getAttribute","pdo.getattribute","refentry"],["","pdo.getavailabledrivers","example"],["PDO::getAvailableDrivers","pdo.getavailabledrivers","refentry"],["PDO::inTransaction","pdo.intransaction","refentry"],["PDO::lastInsertId","pdo.lastinsertid","refentry"],["","pdo.prepare","example"],["","pdo.prepare","example"],["PDO::prepare","pdo.prepare","refentry"],["","pdo.query","example"],["PDO::query","pdo.query","refentry"],["","pdo.quote","example"],["","pdo.quote","example"],["","pdo.quote","example"],["PDO::quote","pdo.quote","refentry"],["","pdo.rollback","example"],["PDO::rollBack","pdo.rollback","refentry"],["PDO::setAttribute","pdo.setattribute","refentry"],["PDO","class.pdo","phpdoc:classref"],["","class.pdostatement","section"],["","class.pdostatement","section"],["","class.pdostatement","varlistentry"],["","class.pdostatement","section"],["","pdostatement.bindcolumn","example"],["PDOStatement::bindColumn","pdostatement.bindcolumn","refentry"],["","pdostatement.bindparam","example"],["","pdostatement.bindparam","example"],["","pdostatement.bindparam","example"],["PDOStatement::bindParam","pdostatement.bindparam","refentry"],["","pdostatement.bindvalue","example"],["","pdostatement.bindvalue","example"],["PDOStatement::bindValue","pdostatement.bindvalue","refentry"],["","pdostatement.closecursor","example"],["PDOStatement::closeCursor","pdostatement.closecursor","refentry"],["","pdostatement.columncount","example"],["PDOStatement::columnCount","pdostatement.columncount","refentry"],["","pdostatement.debugdumpparams","example"],["","pdostatement.debugdumpparams","example"],["PDOStatement::debugDumpParams","pdostatement.debugdumpparams","refentry"],["","pdostatement.errorcode","example"],["PDOStatement::errorCode","pdostatement.errorcode","refentry"],["","pdostatement.errorinfo","example"],["PDOStatement::errorInfo","pdostatement.errorinfo","refentry"],["","pdostatement.execute","example"],["","pdostatement.execute","example"],["","pdostatement.execute","example"],["","pdostatement.execute","example"],["","pdostatement.execute","example"],["PDOStatement::execute","pdostatement.execute","refentry"],["","pdostatement.fetch","example"],["","pdostatement.fetch","example"],["PDOStatement::fetch","pdostatement.fetch","refentry"],["","pdostatement.fetchall","example"],["","pdostatement.fetchall","example"],["","pdostatement.fetchall","example"],["","pdostatement.fetchall","example"],["","pdostatement.fetchall","example"],["PDOStatement::fetchAll","pdostatement.fetchall","refentry"],["","pdostatement.fetchcolumn","example"],["PDOStatement::fetchColumn","pdostatement.fetchcolumn","refentry"],["PDOStatement::fetchObject","pdostatement.fetchobject","refentry"],["PDOStatement::getAttribute","pdostatement.getattribute","refentry"],["","pdostatement.getcolumnmeta","example"],["PDOStatement::getColumnMeta","pdostatement.getcolumnmeta","refentry"],["","pdostatement.nextrowset","example"],["PDOStatement::nextRowset","pdostatement.nextrowset","refentry"],["","pdostatement.rowcount","example"],["","pdostatement.rowcount","example"],["PDOStatement::rowCount","pdostatement.rowcount","refentry"],["PDOStatement::setAttribute","pdostatement.setattribute","refentry"],["","pdostatement.setfetchmode","example"],["PDOStatement::setFetchMode","pdostatement.setfetchmode","refentry"],["PDOStatement","class.pdostatement","phpdoc:classref"],["","class.pdoexception","section"],["","class.pdoexception","section"],["","class.pdoexception","varlistentry"],["","class.pdoexception","varlistentry"],["","class.pdoexception","section"],["PDOException","class.pdoexception","phpdoc:exceptionref"],["","ref.pdo-cubrid","section"],["","ref.pdo-cubrid","section"],["","ref.pdo-cubrid","example"],["","ref.pdo-cubrid","example"],["","ref.pdo-cubrid","example"],["","ref.pdo-cubrid","example"],["","ref.pdo-cubrid","section"],["","ref.pdo-cubrid","section"],["","ref.pdo-cubrid.connection","example"],["PDO_CUBRID DSN","ref.pdo-cubrid.connection","refentry"],["","pdo.cubrid-schema","example"],["PDO::cubrid_schema","pdo.cubrid-schema","refentry"],["CUBRID (PDO)","ref.pdo-cubrid","reference"],["","ref.pdo-dblib","section"],["","ref.pdo-dblib.connection","example"],["PDO_DBLIB DSN","ref.pdo-dblib.connection","refentry"],["MS SQL Server (PDO)","ref.pdo-dblib","reference"],["","ref.pdo-firebird","section"],["","ref.pdo-firebird","section"],["","ref.pdo-firebird","varlistentry"],["","ref.pdo-firebird","varlistentry"],["","ref.pdo-firebird","varlistentry"],["","ref.pdo-firebird","section"],["","ref.pdo-firebird.connection","example"],["","ref.pdo-firebird.connection","example"],["","ref.pdo-firebird.connection","example"],["PDO_FIREBIRD DSN","ref.pdo-firebird.connection","refentry"],["Firebird (PDO)","ref.pdo-firebird","reference"],["","ref.pdo-ibm","section"],["","ref.pdo-ibm","section"],["","ref.pdo-ibm.connection","example"],["","ref.pdo-ibm.connection","example"],["PDO_IBM DSN","ref.pdo-ibm.connection","refentry"],["IBM (PDO)","ref.pdo-ibm","reference"],["","ref.pdo-informix","section"],["","ref.pdo-informix","section"],["","ref.pdo-informix","section"],["","ref.pdo-informix.connection","example"],["","ref.pdo-informix.connection","example"],["PDO_INFORMIX DSN","ref.pdo-informix.connection","refentry"],["Informix (PDO)","ref.pdo-informix","reference"],["","ref.pdo-mysql","section"],["","ref.pdo-mysql","section"],["","ref.pdo-mysql","example"],["","ref.pdo-mysql","varlistentry"],["","ref.pdo-mysql","varlistentry"],["","ref.pdo-mysql","varlistentry"],["","ref.pdo-mysql","varlistentry"],["","ref.pdo-mysql","varlistentry"],["","ref.pdo-mysql","varlistentry"],["","ref.pdo-mysql","varlistentry"],["","ref.pdo-mysql","varlistentry"],["","ref.pdo-mysql","varlistentry"],["","ref.pdo-mysql","varlistentry"],["","ref.pdo-mysql","varlistentry"],["","ref.pdo-mysql","varlistentry"],["","ref.pdo-mysql","varlistentry"],["","ref.pdo-mysql","varlistentry"],["","ref.pdo-mysql","varlistentry"],["","ref.pdo-mysql","section"],["","ref.pdo-mysql","varlistentry"],["","ref.pdo-mysql","varlistentry"],["","ref.pdo-mysql","section"],["","ref.pdo-mysql.connection","example"],["","ref.pdo-mysql.connection","example"],["PDO_MYSQL DSN","ref.pdo-mysql.connection","refentry"],["MySQL (PDO)","ref.pdo-mysql","reference"],["","ref.pdo-sqlsrv","section"],["","ref.pdo-sqlsrv","section"],["","ref.pdo-sqlsrv","varlistentry"],["","ref.pdo-sqlsrv","varlistentry"],["","ref.pdo-sqlsrv","varlistentry"],["","ref.pdo-sqlsrv","varlistentry"],["","ref.pdo-sqlsrv","varlistentry"],["","ref.pdo-sqlsrv","varlistentry"],["","ref.pdo-sqlsrv","varlistentry"],["","ref.pdo-sqlsrv","varlistentry"],["","ref.pdo-sqlsrv","varlistentry"],["","ref.pdo-sqlsrv","varlistentry"],["","ref.pdo-sqlsrv","varlistentry"],["","ref.pdo-sqlsrv","section"],["","ref.pdo-sqlsrv.connection","example"],["PDO_SQLSRV DSN","ref.pdo-sqlsrv.connection","refentry"],["MS SQL Server (PDO)","ref.pdo-sqlsrv","reference"],["","ref.pdo-oci","section"],["","ref.pdo-oci","section"],["","ref.pdo-oci.connection","example"],["PDO_OCI DSN","ref.pdo-oci.connection","refentry"],["Oracle (PDO)","ref.pdo-oci","reference"],["","ref.pdo-odbc","section"],["","ref.pdo-odbc","section"],["","ref.pdo-odbc","varlistentry"],["","ref.pdo-odbc","varlistentry"],["","ref.pdo-odbc","section"],["","ref.pdo-odbc.connection","example"],["","ref.pdo-odbc.connection","example"],["","ref.pdo-odbc.connection","example"],["PDO_ODBC DSN","ref.pdo-odbc.connection","refentry"],["ODBC and DB2 (PDO)","ref.pdo-odbc","reference"],["","ref.pdo-pgsql","section"],["","ref.pdo-pgsql","section"],["","ref.pdo-pgsql","section"],["","ref.pdo-pgsql.connection","example"],["PDO_PGSQL DSN","ref.pdo-pgsql.connection","refentry"],["","pdo.pgsqllobcreate","example"],["PDO::pgsqlLOBCreate","pdo.pgsqllobcreate","refentry"],["","pdo.pgsqllobopen","example"],["PDO::pgsqlLOBOpen","pdo.pgsqllobopen","refentry"],["","pdo.pgsqllobunlink","example"],["PDO::pgsqlLOBUnlink","pdo.pgsqllobunlink","refentry"],["PostgreSQL (PDO)","ref.pdo-pgsql","reference"],["","ref.pdo-sqlite","section"],["","ref.pdo-sqlite","section"],["","ref.pdo-sqlite.connection","example"],["PDO_SQLITE DSN","ref.pdo-sqlite.connection","refentry"],["","pdo.sqlitecreateaggregate","example"],["PDO::sqliteCreateAggregate","pdo.sqlitecreateaggregate","refentry"],["","pdo.sqlitecreatefunction","example"],["PDO::sqliteCreateFunction","pdo.sqlitecreatefunction","refentry"],["SQLite (PDO)","ref.pdo-sqlite","reference"],["","ref.pdo-4d","section"],["","ref.pdo-4d.connection","example"],["PDO_4D DSN","ref.pdo-4d.connection","refentry"],["","pdo-4d.constants","varlistentry"],["","pdo-4d.constants","varlistentry"],["Constants for PDO_4D","pdo-4d.constants","refentry"],["SQL types with PDO_4D and PHP","pdo-4d.sqltypes","refentry"],["SQL acceptable by 4D","ref.pdo-4d.sql4d","refentry"],["","pdo-4d.examples","example"],["","pdo-4d.examples","example"],["","pdo-4d.examples","example"],["Examples with PDO_4D","pdo-4d.examples","refentry"],["4D (PDO)","ref.pdo-4d","reference"],["","pdo.drivers","part"],["PDO","book.pdo","book"],["","refs.database.abstract","set"],["","intro.cubrid","preface"],["","cubrid.requirements","section"],["","cubrid.installation","section"],["","cubrid.configuration","section"],["","cubrid.resources","section"],["","cubrid.resources","section"],["","cubrid.resources","section"],["","cubrid.resources","section"],["","cubrid.resources","section"],["","cubrid.setup","chapter"],["","cubrid.constants","appendix"],["","cubrid.examples","example"],["","cubrid.examples","example"],["","cubrid.examples","chapter"],["","function.cubrid-bind","example"],["","function.cubrid-bind","example"],["","function.cubrid-bind","example"],["cubrid_bind","function.cubrid-bind","refentry"],["","function.cubrid-close-prepare","example"],["cubrid_close_prepare","function.cubrid-close-prepare","refentry"],["","function.cubrid-close-request","example"],["cubrid_close_request","function.cubrid-close-request","refentry"],["","function.cubrid-col-get","example"],["cubrid_col_get","function.cubrid-col-get","refentry"],["","function.cubrid-col-size","example"],["cubrid_col_size","function.cubrid-col-size","refentry"],["","function.cubrid-column-names","example"],["cubrid_column_names","function.cubrid-column-names","refentry"],["","function.cubrid-column-types","example"],["cubrid_column_types","function.cubrid-column-types","refentry"],["","function.cubrid-commit","example"],["cubrid_commit","function.cubrid-commit","refentry"],["","function.cubrid-connect-with-url","example"],["","function.cubrid-connect-with-url","example"],["cubrid_connect_with_url","function.cubrid-connect-with-url","refentry"],["","function.cubrid-connect","example"],["cubrid_connect","function.cubrid-connect","refentry"],["","function.cubrid-current-oid","example"],["cubrid_current_oid","function.cubrid-current-oid","refentry"],["","function.cubrid-disconnect","example"],["cubrid_disconnect","function.cubrid-disconnect","refentry"],["","function.cubrid-drop","example"],["cubrid_drop","function.cubrid-drop","refentry"],["","function.cubrid-error-code-facility","example"],["cubrid_error_code_facility","function.cubrid-error-code-facility","refentry"],["","function.cubrid-error-code","example"],["cubrid_error_code","function.cubrid-error-code","refentry"],["","function.cubrid-error-msg","example"],["cubrid_error_msg","function.cubrid-error-msg","refentry"],["","function.cubrid-execute","example"],["cubrid_execute","function.cubrid-execute","refentry"],["","function.cubrid-fetch","example"],["cubrid_fetch","function.cubrid-fetch","refentry"],["","function.cubrid-free-result","example"],["cubrid_free_result","function.cubrid-free-result","refentry"],["cubrid_get_autocommit","function.cubrid-get-autocommit","refentry"],["","function.cubrid-get-charset","example"],["cubrid_get_charset","function.cubrid-get-charset","refentry"],["","function.cubrid-get-class-name","example"],["cubrid_get_class_name","function.cubrid-get-class-name","refentry"],["","function.cubrid-get-client-info","example"],["cubrid_get_client_info","function.cubrid-get-client-info","refentry"],["","function.cubrid-get-db-parameter","example"],["cubrid_get_db_parameter","function.cubrid-get-db-parameter","refentry"],["","function.cubrid-get-query-timeout","example"],["cubrid_get_query_timeout","function.cubrid-get-query-timeout","refentry"],["","function.cubrid-get-server-info","example"],["cubrid_get_server_info","function.cubrid-get-server-info","refentry"],["","function.cubrid-get","example"],["cubrid_get","function.cubrid-get","refentry"],["","function.cubrid-insert-id","example"],["cubrid_insert_id","function.cubrid-insert-id","refentry"],["","function.cubrid-is-instance","example"],["cubrid_is_instance","function.cubrid-is-instance","refentry"],["","function.cubrid-lob-close","example"],["cubrid_lob_close","function.cubrid-lob-close","refentry"],["","function.cubrid-lob-export","example"],["cubrid_lob_export","function.cubrid-lob-export","refentry"],["","function.cubrid-lob-get","example"],["cubrid_lob_get","function.cubrid-lob-get","refentry"],["","function.cubrid-lob-send","example"],["cubrid_lob_send","function.cubrid-lob-send","refentry"],["","function.cubrid-lob-size","example"],["cubrid_lob_size","function.cubrid-lob-size","refentry"],["","function.cubrid-lob2-bind","example"],["cubrid_lob2_bind","function.cubrid-lob2-bind","refentry"],["cubrid_lob2_close","function.cubrid-lob2-close","refentry"],["","function.cubrid-lob2-export","example"],["cubrid_lob2_export","function.cubrid-lob2-export","refentry"],["","function.cubrid-lob2-import","example"],["cubrid_lob2_import","function.cubrid-lob2-import","refentry"],["cubrid_lob2_new","function.cubrid-lob2-new","refentry"],["","function.cubrid-lob2-read","example"],["","function.cubrid-lob2-read","example"],["cubrid_lob2_read","function.cubrid-lob2-read","refentry"],["","function.cubrid-lob2-seek64","example"],["cubrid_lob2_seek64","function.cubrid-lob2-seek64","refentry"],["","function.cubrid-lob2-seek","example"],["cubrid_lob2_seek","function.cubrid-lob2-seek","refentry"],["cubrid_lob2_size64","function.cubrid-lob2-size64","refentry"],["cubrid_lob2_size","function.cubrid-lob2-size","refentry"],["cubrid_lob2_tell64","function.cubrid-lob2-tell64","refentry"],["cubrid_lob2_tell","function.cubrid-lob2-tell","refentry"],["","function.cubrid-lob2-write","example"],["","function.cubrid-lob2-write","example"],["cubrid_lob2_write","function.cubrid-lob2-write","refentry"],["","function.cubrid-lock-read","example"],["cubrid_lock_read","function.cubrid-lock-read","refentry"],["","function.cubrid-lock-write","example"],["cubrid_lock_write","function.cubrid-lock-write","refentry"],["","function.cubrid-move-cursor","example"],["cubrid_move_cursor","function.cubrid-move-cursor","refentry"],["","function.cubrid-next-result","example"],["cubrid_next_result","function.cubrid-next-result","refentry"],["","function.cubrid-num-cols","example"],["cubrid_num_cols","function.cubrid-num-cols","refentry"],["","function.cubrid-num-rows","example"],["cubrid_num_rows","function.cubrid-num-rows","refentry"],["","function.cubrid-pconnect-with-url","example"],["","function.cubrid-pconnect-with-url","example"],["cubrid_pconnect_with_url","function.cubrid-pconnect-with-url","refentry"],["","function.cubrid-pconnect","example"],["cubrid_pconnect","function.cubrid-pconnect","refentry"],["","function.cubrid-prepare","example"],["cubrid_prepare","function.cubrid-prepare","refentry"],["","function.cubrid-put","example"],["cubrid_put","function.cubrid-put","refentry"],["","function.cubrid-rollback","example"],["cubrid_rollback","function.cubrid-rollback","refentry"],["","function.cubrid-schema","example"],["cubrid_schema","function.cubrid-schema","refentry"],["","function.cubrid-seq-drop","example"],["cubrid_seq_drop","function.cubrid-seq-drop","refentry"],["","function.cubrid-seq-insert","example"],["cubrid_seq_insert","function.cubrid-seq-insert","refentry"],["","function.cubrid-seq-put","example"],["cubrid_seq_put","function.cubrid-seq-put","refentry"],["","function.cubrid-set-add","example"],["cubrid_set_add","function.cubrid-set-add","refentry"],["cubrid_set_autocommit","function.cubrid-set-autocommit","refentry"],["","function.cubrid-set-db-parameter","example"],["cubrid_set_db_parameter","function.cubrid-set-db-parameter","refentry"],["","function.cubrid-set-drop","example"],["cubrid_set_drop","function.cubrid-set-drop","refentry"],["cubrid_set_query_timeout","function.cubrid-set-query-timeout","refentry"],["","function.cubrid-version","example"],["cubrid_version","function.cubrid-version","refentry"],["","ref.cubrid","reference"],["","function.cubrid-affected-rows","example"],["cubrid_affected_rows","function.cubrid-affected-rows","refentry"],["","function.cubrid-client-encoding","example"],["cubrid_client_encoding","function.cubrid-client-encoding","refentry"],["","function.cubrid-close","example"],["cubrid_close","function.cubrid-close","refentry"],["","function.cubrid-data-seek","example"],["cubrid_data_seek","function.cubrid-data-seek","refentry"],["","function.cubrid-db-name","example"],["cubrid_db_name","function.cubrid-db-name","refentry"],["","function.cubrid-errno","example"],["cubrid_errno","function.cubrid-errno","refentry"],["","function.cubrid-error","example"],["cubrid_error","function.cubrid-error","refentry"],["","function.cubrid-fetch-array","example"],["cubrid_fetch_array","function.cubrid-fetch-array","refentry"],["","function.cubrid-fetch-assoc","example"],["cubrid_fetch_assoc","function.cubrid-fetch-assoc","refentry"],["","function.cubrid-fetch-field","example"],["cubrid_fetch_field","function.cubrid-fetch-field","refentry"],["","function.cubrid-fetch-lengths","example"],["cubrid_fetch_lengths","function.cubrid-fetch-lengths","refentry"],["","function.cubrid-fetch-object","example"],["cubrid_fetch_object","function.cubrid-fetch-object","refentry"],["","function.cubrid-fetch-row","example"],["cubrid_fetch_row","function.cubrid-fetch-row","refentry"],["","function.cubrid-field-flags","example"],["cubrid_field_flags","function.cubrid-field-flags","refentry"],["","function.cubrid-field-len","example"],["cubrid_field_len","function.cubrid-field-len","refentry"],["","function.cubrid-field-name","example"],["cubrid_field_name","function.cubrid-field-name","refentry"],["","function.cubrid-field-seek","example"],["cubrid_field_seek","function.cubrid-field-seek","refentry"],["","function.cubrid-field-table","example"],["cubrid_field_table","function.cubrid-field-table","refentry"],["","function.cubrid-field-type","example"],["cubrid_field_type","function.cubrid-field-type","refentry"],["","function.cubrid-list-dbs","example"],["cubrid_list_dbs","function.cubrid-list-dbs","refentry"],["","function.cubrid-num-fields","example"],["cubrid_num_fields","function.cubrid-num-fields","refentry"],["","function.cubrid-ping","example"],["cubrid_ping","function.cubrid-ping","refentry"],["","function.cubrid-query","example"],["","function.cubrid-query","example"],["cubrid_query","function.cubrid-query","refentry"],["","function.cubrid-real-escape-string","example"],["cubrid_real_escape_string","function.cubrid-real-escape-string","refentry"],["","function.cubrid-result","example"],["cubrid_result","function.cubrid-result","refentry"],["","function.cubrid-unbuffered-query","example"],["cubrid_unbuffered_query","function.cubrid-unbuffered-query","refentry"],["","cubridmysql.cubrid","reference"],["","function.cubrid-load-from-glo","example"],["cubrid_load_from_glo","function.cubrid-load-from-glo","refentry"],["","function.cubrid-new-glo","example"],["cubrid_new_glo","function.cubrid-new-glo","refentry"],["","function.cubrid-save-to-glo","example"],["cubrid_save_to_glo","function.cubrid-save-to-glo","refentry"],["","function.cubrid-send-glo","example"],["cubrid_send_glo","function.cubrid-send-glo","refentry"],["","oldaliases.cubrid","reference"],["CUBRID","book.cubrid","book"],["","intro.dbplus","preface"],["","dbplus.requirements","section"],["","dbplus.installation","section"],["","dbplus.configuration","section"],["","dbplus.resources","section"],["","dbplus.resources","section"],["","dbplus.setup","chapter"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","constant"],["","dbplus.errorcodes","section"],["","dbplus.constants","appendix"],["dbplus_add","function.dbplus-add","refentry"],["dbplus_aql","function.dbplus-aql","refentry"],["dbplus_chdir","function.dbplus-chdir","refentry"],["dbplus_close","function.dbplus-close","refentry"],["dbplus_curr","function.dbplus-curr","refentry"],["dbplus_errcode","function.dbplus-errcode","refentry"],["dbplus_errno","function.dbplus-errno","refentry"],["dbplus_find","function.dbplus-find","refentry"],["dbplus_first","function.dbplus-first","refentry"],["dbplus_flush","function.dbplus-flush","refentry"],["dbplus_freealllocks","function.dbplus-freealllocks","refentry"],["dbplus_freelock","function.dbplus-freelock","refentry"],["dbplus_freerlocks","function.dbplus-freerlocks","refentry"],["dbplus_getlock","function.dbplus-getlock","refentry"],["dbplus_getunique","function.dbplus-getunique","refentry"],["dbplus_info","function.dbplus-info","refentry"],["dbplus_last","function.dbplus-last","refentry"],["dbplus_lockrel","function.dbplus-lockrel","refentry"],["dbplus_next","function.dbplus-next","refentry"],["dbplus_open","function.dbplus-open","refentry"],["dbplus_prev","function.dbplus-prev","refentry"],["dbplus_rchperm","function.dbplus-rchperm","refentry"],["dbplus_rcreate","function.dbplus-rcreate","refentry"],["dbplus_rcrtexact","function.dbplus-rcrtexact","refentry"],["dbplus_rcrtlike","function.dbplus-rcrtlike","refentry"],["dbplus_resolve","function.dbplus-resolve","refentry"],["dbplus_restorepos","function.dbplus-restorepos","refentry"],["dbplus_rkeys","function.dbplus-rkeys","refentry"],["dbplus_ropen","function.dbplus-ropen","refentry"],["dbplus_rquery","function.dbplus-rquery","refentry"],["dbplus_rrename","function.dbplus-rrename","refentry"],["dbplus_rsecindex","function.dbplus-rsecindex","refentry"],["dbplus_runlink","function.dbplus-runlink","refentry"],["dbplus_rzap","function.dbplus-rzap","refentry"],["dbplus_savepos","function.dbplus-savepos","refentry"],["dbplus_setindex","function.dbplus-setindex","refentry"],["dbplus_setindexbynumber","function.dbplus-setindexbynumber","refentry"],["dbplus_sql","function.dbplus-sql","refentry"],["dbplus_tcl","function.dbplus-tcl","refentry"],["dbplus_tremove","function.dbplus-tremove","refentry"],["dbplus_undo","function.dbplus-undo","refentry"],["dbplus_undoprepare","function.dbplus-undoprepare","refentry"],["dbplus_unlockrel","function.dbplus-unlockrel","refentry"],["dbplus_unselect","function.dbplus-unselect","refentry"],["dbplus_update","function.dbplus-update","refentry"],["dbplus_xlockrel","function.dbplus-xlockrel","refentry"],["dbplus_xunlockrel","function.dbplus-xunlockrel","refentry"],["","ref.dbplus","reference"],["","book.dbplus","book"],["","intro.dbase","preface"],["","dbase.requirements","section"],["","dbase.installation","section"],["","dbase.configuration","section"],["","dbase.resources","section"],["","dbase.setup","chapter"],["","dbase.constants","appendix"],["","ref.dbase","section"],["","function.dbase-add-record","example"],["dbase_add_record","function.dbase-add-record","refentry"],["","function.dbase-close","example"],["dbase_close","function.dbase-close","refentry"],["","function.dbase-create","example"],["dbase_create","function.dbase-create","refentry"],["dbase_delete_record","function.dbase-delete-record","refentry"],["","function.dbase-get-header-info","example"],["dbase_get_header_info","function.dbase-get-header-info","refentry"],["","function.dbase-get-record-with-names","example"],["dbase_get_record_with_names","function.dbase-get-record-with-names","refentry"],["dbase_get_record","function.dbase-get-record","refentry"],["","function.dbase-numfields","example"],["dbase_numfields","function.dbase-numfields","refentry"],["","function.dbase-numrecords","example"],["dbase_numrecords","function.dbase-numrecords","refentry"],["","function.dbase-open","example"],["dbase_open","function.dbase-open","refentry"],["","function.dbase-pack","example"],["dbase_pack","function.dbase-pack","refentry"],["","function.dbase-replace-record","example"],["dbase_replace_record","function.dbase-replace-record","refentry"],["","ref.dbase","reference"],["","book.dbase","book"],["","intro.filepro","preface"],["","filepro.requirements","section"],["","filepro.installation","section"],["","filepro.configuration","section"],["","filepro.resources","section"],["","filepro.setup","chapter"],["","filepro.constants","appendix"],["filepro_fieldcount","function.filepro-fieldcount","refentry"],["filepro_fieldname","function.filepro-fieldname","refentry"],["filepro_fieldtype","function.filepro-fieldtype","refentry"],["filepro_fieldwidth","function.filepro-fieldwidth","refentry"],["filepro_retrieve","function.filepro-retrieve","refentry"],["filepro_rowcount","function.filepro-rowcount","refentry"],["filepro","function.filepro","refentry"],["","ref.filepro","reference"],["","book.filepro","book"],["","intro.ibase","preface"],["","ibase.requirements","section"],["","ibase.installation","section"],["","ibase.configuration","varlistentry"],["","ibase.configuration","varlistentry"],["","ibase.configuration","varlistentry"],["","ibase.configuration","varlistentry"],["","ibase.configuration","varlistentry"],["","ibase.configuration","varlistentry"],["","ibase.configuration","varlistentry"],["","ibase.configuration","varlistentry"],["","ibase.configuration","varlistentry"],["","ibase.configuration","varlistentry"],["","ibase.configuration","section"],["","ibase.resources","section"],["","ibase.setup","chapter"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","varlistentry"],["","ibase.constants","appendix"],["ibase_add_user","function.ibase-add-user","refentry"],["ibase_affected_rows","function.ibase-affected-rows","refentry"],["ibase_backup","function.ibase-backup","refentry"],["ibase_blob_add","function.ibase-blob-add","refentry"],["ibase_blob_cancel","function.ibase-blob-cancel","refentry"],["ibase_blob_close","function.ibase-blob-close","refentry"],["ibase_blob_create","function.ibase-blob-create","refentry"],["ibase_blob_echo","function.ibase-blob-echo","refentry"],["","function.ibase-blob-get","example"],["ibase_blob_get","function.ibase-blob-get","refentry"],["","function.ibase-blob-import","example"],["ibase_blob_import","function.ibase-blob-import","refentry"],["ibase_blob_info","function.ibase-blob-info","refentry"],["ibase_blob_open","function.ibase-blob-open","refentry"],["ibase_close","function.ibase-close","refentry"],["ibase_commit_ret","function.ibase-commit-ret","refentry"],["ibase_commit","function.ibase-commit","refentry"],["","function.ibase-connect","example"],["ibase_connect","function.ibase-connect","refentry"],["ibase_db_info","function.ibase-db-info","refentry"],["ibase_delete_user","function.ibase-delete-user","refentry"],["ibase_drop_db","function.ibase-drop-db","refentry"],["ibase_errcode","function.ibase-errcode","refentry"],["ibase_errmsg","function.ibase-errmsg","refentry"],["","function.ibase-execute","example"],["ibase_execute","function.ibase-execute","refentry"],["ibase_fetch_assoc","function.ibase-fetch-assoc","refentry"],["","function.ibase-fetch-object","example"],["ibase_fetch_object","function.ibase-fetch-object","refentry"],["ibase_fetch_row","function.ibase-fetch-row","refentry"],["","function.ibase-field-info","example"],["ibase_field_info","function.ibase-field-info","refentry"],["ibase_free_event_handler","function.ibase-free-event-handler","refentry"],["ibase_free_query","function.ibase-free-query","refentry"],["ibase_free_result","function.ibase-free-result","refentry"],["ibase_gen_id","function.ibase-gen-id","refentry"],["ibase_maintain_db","function.ibase-maintain-db","refentry"],["ibase_modify_user","function.ibase-modify-user","refentry"],["","function.ibase-name-result","example"],["ibase_name_result","function.ibase-name-result","refentry"],["","function.ibase-num-fields","example"],["ibase_num_fields","function.ibase-num-fields","refentry"],["ibase_num_params","function.ibase-num-params","refentry"],["ibase_param_info","function.ibase-param-info","refentry"],["ibase_pconnect","function.ibase-pconnect","refentry"],["ibase_prepare","function.ibase-prepare","refentry"],["","function.ibase-query","example"],["ibase_query","function.ibase-query","refentry"],["ibase_restore","function.ibase-restore","refentry"],["ibase_rollback_ret","function.ibase-rollback-ret","refentry"],["ibase_rollback","function.ibase-rollback","refentry"],["ibase_server_info","function.ibase-server-info","refentry"],["ibase_service_attach","function.ibase-service-attach","refentry"],["ibase_service_detach","function.ibase-service-detach","refentry"],["","function.ibase-set-event-handler","example"],["ibase_set_event_handler","function.ibase-set-event-handler","refentry"],["ibase_trans","function.ibase-trans","refentry"],["ibase_wait_event","function.ibase-wait-event","refentry"],["","ref.ibase","reference"],["","book.ibase","book"],["","intro.fbsql","preface"],["","fbsql.requirements","section"],["","fbsql.installation","section"],["","fbsql.configuration","section"],["","fbsql.resources","section"],["","fbsql.setup","chapter"],["","fbsql.constants","varlistentry"],["","fbsql.constants","varlistentry"],["","fbsql.constants","varlistentry"],["","fbsql.constants","varlistentry"],["","fbsql.constants","varlistentry"],["","fbsql.constants","varlistentry"],["","fbsql.constants","varlistentry"],["","fbsql.constants","varlistentry"],["","fbsql.constants","varlistentry"],["","fbsql.constants","varlistentry"],["","fbsql.constants","varlistentry"],["","fbsql.constants","varlistentry"],["","fbsql.constants","varlistentry"],["","fbsql.constants","varlistentry"],["","fbsql.constants","varlistentry"],["","fbsql.constants","varlistentry"],["","fbsql.constants","varlistentry"],["","fbsql.constants","varlistentry"],["","fbsql.constants","varlistentry"],["","fbsql.constants","appendix"],["fbsql_affected_rows","function.fbsql-affected-rows","refentry"],["fbsql_autocommit","function.fbsql-autocommit","refentry"],["fbsql_blob_size","function.fbsql-blob-size","refentry"],["fbsql_change_user","function.fbsql-change-user","refentry"],["fbsql_clob_size","function.fbsql-clob-size","refentry"],["","function.fbsql-close","example"],["fbsql_close","function.fbsql-close","refentry"],["fbsql_commit","function.fbsql-commit","refentry"],["","function.fbsql-connect","example"],["fbsql_connect","function.fbsql-connect","refentry"],["","function.fbsql-create-blob","example"],["fbsql_create_blob","function.fbsql-create-blob","refentry"],["","function.fbsql-create-clob","example"],["fbsql_create_clob","function.fbsql-create-clob","refentry"],["","function.fbsql-create-db","example"],["fbsql_create_db","function.fbsql-create-db","refentry"],["","function.fbsql-data-seek","example"],["fbsql_data_seek","function.fbsql-data-seek","refentry"],["","function.fbsql-database-password","example"],["fbsql_database_password","function.fbsql-database-password","refentry"],["fbsql_database","function.fbsql-database","refentry"],["fbsql_db_query","function.fbsql-db-query","refentry"],["fbsql_db_status","function.fbsql-db-status","refentry"],["fbsql_drop_db","function.fbsql-drop-db","refentry"],["","function.fbsql-errno","example"],["fbsql_errno","function.fbsql-errno","refentry"],["","function.fbsql-error","example"],["fbsql_error","function.fbsql-error","refentry"],["","function.fbsql-fetch-array","example"],["fbsql_fetch_array","function.fbsql-fetch-array","refentry"],["","function.fbsql-fetch-assoc","example"],["fbsql_fetch_assoc","function.fbsql-fetch-assoc","refentry"],["","function.fbsql-fetch-field","example"],["fbsql_fetch_field","function.fbsql-fetch-field","refentry"],["fbsql_fetch_lengths","function.fbsql-fetch-lengths","refentry"],["","function.fbsql-fetch-object","example"],["fbsql_fetch_object","function.fbsql-fetch-object","refentry"],["fbsql_fetch_row","function.fbsql-fetch-row","refentry"],["fbsql_field_flags","function.fbsql-field-flags","refentry"],["fbsql_field_len","function.fbsql-field-len","refentry"],["","function.fbsql-field-name","example"],["fbsql_field_name","function.fbsql-field-name","refentry"],["fbsql_field_seek","function.fbsql-field-seek","refentry"],["fbsql_field_table","function.fbsql-field-table","refentry"],["","function.fbsql-field-type","example"],["fbsql_field_type","function.fbsql-field-type","refentry"],["fbsql_free_result","function.fbsql-free-result","refentry"],["fbsql_get_autostart_info","function.fbsql-get-autostart-info","refentry"],["fbsql_hostname","function.fbsql-hostname","refentry"],["fbsql_insert_id","function.fbsql-insert-id","refentry"],["","function.fbsql-list-dbs","example"],["fbsql_list_dbs","function.fbsql-list-dbs","refentry"],["","function.fbsql-list-fields","example"],["fbsql_list_fields","function.fbsql-list-fields","refentry"],["fbsql_list_tables","function.fbsql-list-tables","refentry"],["","function.fbsql-next-result","example"],["fbsql_next_result","function.fbsql-next-result","refentry"],["fbsql_num_fields","function.fbsql-num-fields","refentry"],["","function.fbsql-num-rows","example"],["fbsql_num_rows","function.fbsql-num-rows","refentry"],["fbsql_password","function.fbsql-password","refentry"],["fbsql_pconnect","function.fbsql-pconnect","refentry"],["","function.fbsql-query","example"],["","function.fbsql-query","example"],["fbsql_query","function.fbsql-query","refentry"],["","function.fbsql-read-blob","example"],["fbsql_read_blob","function.fbsql-read-blob","refentry"],["","function.fbsql-read-clob","example"],["fbsql_read_clob","function.fbsql-read-clob","refentry"],["fbsql_result","function.fbsql-result","refentry"],["fbsql_rollback","function.fbsql-rollback","refentry"],["fbsql_rows_fetched","function.fbsql-rows-fetched","refentry"],["fbsql_select_db","function.fbsql-select-db","refentry"],["fbsql_set_characterset","function.fbsql-set-characterset","refentry"],["fbsql_set_lob_mode","function.fbsql-set-lob-mode","refentry"],["fbsql_set_password","function.fbsql-set-password","refentry"],["fbsql_set_transaction","function.fbsql-set-transaction","refentry"],["fbsql_start_db","function.fbsql-start-db","refentry"],["fbsql_stop_db","function.fbsql-stop-db","refentry"],["","function.fbsql-table-name","example"],["fbsql_table_name","function.fbsql-table-name","refentry"],["fbsql_tablename","function.fbsql-tablename","refentry"],["fbsql_username","function.fbsql-username","refentry"],["fbsql_warnings","function.fbsql-warnings","refentry"],["","ref.fbsql","reference"],["","book.fbsql","book"],["","intro.ibm-db2","preface"],["","ibm-db2.requirements","section"],["","ibm-db2.requirements","section"],["","ibm-db2.installation","section"],["","ibm-db2.configuration","tbody"],["","ibm-db2.configuration","varlistentry"],["","ibm-db2.configuration","varlistentry"],["","ibm-db2.configuration","varlistentry"],["","ibm-db2.configuration","varlistentry"],["","ibm-db2.configuration","varlistentry"],["","ibm-db2.configuration","varlistentry"],["","ibm-db2.configuration","section"],["","ibm-db2.resources","section"],["","ibm-db2.setup","chapter"],["","ibm-db2.constants","varlistentry"],["","ibm-db2.constants","varlistentry"],["","ibm-db2.constants","varlistentry"],["","ibm-db2.constants","varlistentry"],["","ibm-db2.constants","varlistentry"],["","ibm-db2.constants","varlistentry"],["","ibm-db2.constants","varlistentry"],["","ibm-db2.constants","varlistentry"],["","ibm-db2.constants","varlistentry"],["","ibm-db2.constants","varlistentry"],["","ibm-db2.constants","varlistentry"],["","ibm-db2.constants","varlistentry"],["","ibm-db2.constants","varlistentry"],["","ibm-db2.constants","varlistentry"],["","ibm-db2.constants","varlistentry"],["","ibm-db2.constants","varlistentry"],["","ibm-db2.constants","varlistentry"],["","ibm-db2.constants","varlistentry"],["","ibm-db2.constants","varlistentry"],["","ibm-db2.constants","appendix"],["","function.db2-autocommit","example"],["","function.db2-autocommit","example"],["db2_autocommit","function.db2-autocommit","refentry"],["","function.db2-bind-param","example"],["","function.db2-bind-param","example"],["","function.db2-bind-param","example"],["db2_bind_param","function.db2-bind-param","refentry"],["","function.db2-client-info","example"],["db2_client_info","function.db2-client-info","refentry"],["","function.db2-close","example"],["db2_close","function.db2-close","refentry"],["db2_column_privileges","function.db2-column-privileges","refentry"],["db2_columns","function.db2-columns","refentry"],["db2_commit","function.db2-commit","refentry"],["","function.db2-conn-error","example"],["db2_conn_error","function.db2-conn-error","refentry"],["","function.db2-conn-errormsg","example"],["db2_conn_errormsg","function.db2-conn-errormsg","refentry"],["","function.db2-connect","example"],["","function.db2-connect","example"],["","function.db2-connect","example"],["","function.db2-connect","example"],["","function.db2-connect","example"],["db2_connect","function.db2-connect","refentry"],["db2_cursor_type","function.db2-cursor-type","refentry"],["","function.db2-escape-string","example"],["db2_escape_string","function.db2-escape-string","refentry"],["","function.db2-exec","example"],["","function.db2-exec","example"],["","function.db2-exec","example"],["","function.db2-exec","example"],["","function.db2-exec","example"],["db2_exec","function.db2-exec","refentry"],["","function.db2-execute","example"],["","function.db2-execute","example"],["","function.db2-execute","example"],["","function.db2-execute","example"],["","function.db2-execute","example"],["db2_execute","function.db2-execute","refentry"],["","function.db2-fetch-array","example"],["","function.db2-fetch-array","example"],["db2_fetch_array","function.db2-fetch-array","refentry"],["","function.db2-fetch-assoc","example"],["","function.db2-fetch-assoc","example"],["db2_fetch_assoc","function.db2-fetch-assoc","refentry"],["","function.db2-fetch-both","example"],["","function.db2-fetch-both","example"],["db2_fetch_both","function.db2-fetch-both","refentry"],["","function.db2-fetch-object","example"],["db2_fetch_object","function.db2-fetch-object","refentry"],["","function.db2-fetch-row","example"],["","function.db2-fetch-row","example"],["db2_fetch_row","function.db2-fetch-row","refentry"],["db2_field_display_size","function.db2-field-display-size","refentry"],["db2_field_name","function.db2-field-name","refentry"],["db2_field_num","function.db2-field-num","refentry"],["db2_field_precision","function.db2-field-precision","refentry"],["db2_field_scale","function.db2-field-scale","refentry"],["db2_field_type","function.db2-field-type","refentry"],["db2_field_width","function.db2-field-width","refentry"],["db2_foreign_keys","function.db2-foreign-keys","refentry"],["db2_free_result","function.db2-free-result","refentry"],["db2_free_stmt","function.db2-free-stmt","refentry"],["","function.db2-get-option","example"],["db2_get_option","function.db2-get-option","refentry"],["","function.db2-last-insert-id","example"],["db2_last_insert_id","function.db2-last-insert-id","refentry"],["","function.db2-lob-read","example"],["db2_lob_read","function.db2-lob-read","refentry"],["","function.db2-next-result","example"],["db2_next_result","function.db2-next-result","refentry"],["","function.db2-num-fields","example"],["db2_num_fields","function.db2-num-fields","refentry"],["db2_num_rows","function.db2-num-rows","refentry"],["","function.db2-pclose","example"],["db2_pclose","function.db2-pclose","refentry"],["","function.db2-pconnect","example"],["","function.db2-pconnect","example"],["db2_pconnect","function.db2-pconnect","refentry"],["","function.db2-prepare","example"],["db2_prepare","function.db2-prepare","refentry"],["db2_primary_keys","function.db2-primary-keys","refentry"],["db2_procedure_columns","function.db2-procedure-columns","refentry"],["db2_procedures","function.db2-procedures","refentry"],["","function.db2-result","example"],["db2_result","function.db2-result","refentry"],["","function.db2-rollback","example"],["db2_rollback","function.db2-rollback","refentry"],["","function.db2-server-info","example"],["db2_server_info","function.db2-server-info","refentry"],["","function.db2-set-option","example"],["","function.db2-set-option","example"],["","function.db2-set-option","example"],["","function.db2-set-option","example"],["","function.db2-set-option","example"],["","function.db2-set-option","example"],["","function.db2-set-option","example"],["","function.db2-set-option","example"],["db2_set_option","function.db2-set-option","refentry"],["db2_special_columns","function.db2-special-columns","refentry"],["db2_statistics","function.db2-statistics","refentry"],["db2_stmt_error","function.db2-stmt-error","refentry"],["db2_stmt_errormsg","function.db2-stmt-errormsg","refentry"],["db2_table_privileges","function.db2-table-privileges","refentry"],["db2_tables","function.db2-tables","refentry"],["","ref.ibm-db2","reference"],["IBM DB2","book.ibm-db2","book"],["","intro.ifx","preface"],["","ifx.requirements","section"],["","ifx.installation","section"],["","ifx.configuration","varlistentry"],["","ifx.configuration","varlistentry"],["","ifx.configuration","varlistentry"],["","ifx.configuration","varlistentry"],["","ifx.configuration","varlistentry"],["","ifx.configuration","varlistentry"],["","ifx.configuration","varlistentry"],["","ifx.configuration","varlistentry"],["","ifx.configuration","varlistentry"],["","ifx.configuration","varlistentry"],["","ifx.configuration","varlistentry"],["","ifx.configuration","section"],["","ifx.resources","section"],["","ifx.setup","chapter"],["","ifx.constants","varlistentry"],["","ifx.constants","varlistentry"],["","ifx.constants","varlistentry"],["","ifx.constants","varlistentry"],["","ifx.constants","varlistentry"],["","ifx.constants","varlistentry"],["","ifx.constants","varlistentry"],["","ifx.constants","varlistentry"],["","ifx.constants","appendix"],["","function.ifx-affected-rows","example"],["ifx_affected_rows","function.ifx-affected-rows","refentry"],["ifx_blobinfile_mode","function.ifx-blobinfile-mode","refentry"],["ifx_byteasvarchar","function.ifx-byteasvarchar","refentry"],["","function.ifx-close","example"],["ifx_close","function.ifx-close","refentry"],["","function.ifx-connect","example"],["ifx_connect","function.ifx-connect","refentry"],["ifx_copy_blob","function.ifx-copy-blob","refentry"],["ifx_create_blob","function.ifx-create-blob","refentry"],["ifx_create_char","function.ifx-create-char","refentry"],["","function.ifx-do","example"],["ifx_do","function.ifx-do","refentry"],["ifx_error","function.ifx-error","refentry"],["","function.ifx-errormsg","example"],["ifx_errormsg","function.ifx-errormsg","refentry"],["","function.ifx-fetch-row","example"],["ifx_fetch_row","function.ifx-fetch-row","refentry"],["","function.ifx-fieldproperties","example"],["ifx_fieldproperties","function.ifx-fieldproperties","refentry"],["","function.ifx-fieldtypes","example"],["ifx_fieldtypes","function.ifx-fieldtypes","refentry"],["ifx_free_blob","function.ifx-free-blob","refentry"],["ifx_free_char","function.ifx-free-char","refentry"],["ifx_free_result","function.ifx-free-result","refentry"],["ifx_get_blob","function.ifx-get-blob","refentry"],["ifx_get_char","function.ifx-get-char","refentry"],["","function.ifx-getsqlca","example"],["ifx_getsqlca","function.ifx-getsqlca","refentry"],["","function.ifx-htmltbl-result","example"],["ifx_htmltbl_result","function.ifx-htmltbl-result","refentry"],["ifx_nullformat","function.ifx-nullformat","refentry"],["","function.ifx-num-fields","example"],["ifx_num_fields","function.ifx-num-fields","refentry"],["ifx_num_rows","function.ifx-num-rows","refentry"],["ifx_pconnect","function.ifx-pconnect","refentry"],["ifx_prepare","function.ifx-prepare","refentry"],["","function.ifx-query","example"],["","function.ifx-query","example"],["ifx_query","function.ifx-query","refentry"],["ifx_textasvarchar","function.ifx-textasvarchar","refentry"],["ifx_update_blob","function.ifx-update-blob","refentry"],["ifx_update_char","function.ifx-update-char","refentry"],["ifxus_close_slob","function.ifxus-close-slob","refentry"],["ifxus_create_slob","function.ifxus-create-slob","refentry"],["ifxus_free_slob","function.ifxus-free-slob","refentry"],["ifxus_open_slob","function.ifxus-open-slob","refentry"],["ifxus_read_slob","function.ifxus-read-slob","refentry"],["ifxus_seek_slob","function.ifxus-seek-slob","refentry"],["ifxus_tell_slob","function.ifxus-tell-slob","refentry"],["ifxus_write_slob","function.ifxus-write-slob","refentry"],["","ref.ifx","reference"],["","book.ifx","book"],["","intro.ingres","preface"],["","ingres.requirements","section"],["","ingres.installation","example"],["","ingres.installation","section"],["","ingres.configuration","tbody"],["","ingres.configuration","varlistentry"],["","ingres.configuration","varlistentry"],["","ingres.configuration","varlistentry"],["","ingres.configuration","varlistentry"],["","ingres.configuration","varlistentry"],["","ingres.configuration","varlistentry"],["","ingres.configuration","varlistentry"],["","ingres.configuration","varlistentry"],["","ingres.configuration","varlistentry"],["","ingres.configuration","varlistentry"],["","ingres.configuration","varlistentry"],["","ingres.configuration","varlistentry"],["","ingres.configuration","varlistentry"],["","ingres.configuration","varlistentry"],["","ingres.configuration","varlistentry"],["","ingres.configuration","varlistentry"],["","ingres.configuration","varlistentry"],["","ingres.configuration","section"],["","ingres.resources","section"],["","ingres.setup","chapter"],["","ingres.constants","varlistentry"],["","ingres.constants","varlistentry"],["","ingres.constants","varlistentry"],["","ingres.constants","varlistentry"],["","ingres.constants","varlistentry"],["","ingres.constants","varlistentry"],["","ingres.constants","varlistentry"],["","ingres.constants","varlistentry"],["","ingres.constants","varlistentry"],["","ingres.constants","varlistentry"],["","ingres.constants","varlistentry"],["","ingres.constants","varlistentry"],["","ingres.constants","varlistentry"],["","ingres.constants","varlistentry"],["","ingres.constants","varlistentry"],["","ingres.constants","varlistentry"],["","ingres.constants","varlistentry"],["","ingres.constants","varlistentry"],["","ingres.constants","varlistentry"],["","ingres.constants","varlistentry"],["","ingres.constants","varlistentry"],["","ingres.constants","varlistentry"],["","ingres.constants","varlistentry"],["","ingres.constants","varlistentry"],["","ingres.constants","varlistentry"],["","ingres.constants","varlistentry"],["","ingres.constants","appendix"],["","ingres.examples-basic","example"],["","ingres.examples-basic","section"],["","ingres.examples","chapter"],["ingres_autocommit_state","function.ingres-autocommit-state","refentry"],["ingres_autocommit","function.ingres-autocommit","refentry"],["","function.ingres-charset","example"],["ingres_charset","function.ingres-charset","refentry"],["ingres_close","function.ingres-close","refentry"],["ingres_commit","function.ingres-commit","refentry"],["","function.ingres-connect","varlistentry"],["","function.ingres-connect","example"],["ingres_connect","function.ingres-connect","refentry"],["","function.ingres-cursor","example"],["ingres_cursor","function.ingres-cursor","refentry"],["","function.ingres-errno","example"],["ingres_errno","function.ingres-errno","refentry"],["","function.ingres-error","example"],["ingres_error","function.ingres-error","refentry"],["","function.ingres-errsqlstate","example"],["ingres_errsqlstate","function.ingres-errsqlstate","refentry"],["","function.ingres-escape-string","example"],["ingres_escape_string","function.ingres-escape-string","refentry"],["ingres_execute","function.ingres-execute","refentry"],["","function.ingres-fetch-array","example"],["ingres_fetch_array","function.ingres-fetch-array","refentry"],["","function.ingres-fetch-assoc","example"],["ingres_fetch_assoc","function.ingres-fetch-assoc","refentry"],["","function.ingres-fetch-object","example"],["ingres_fetch_object","function.ingres-fetch-object","refentry"],["","function.ingres-fetch-proc-return","example"],["ingres_fetch_proc_return","function.ingres-fetch-proc-return","refentry"],["","function.ingres-fetch-row","example"],["ingres_fetch_row","function.ingres-fetch-row","refentry"],["ingres_field_length","function.ingres-field-length","refentry"],["ingres_field_name","function.ingres-field-name","refentry"],["ingres_field_nullable","function.ingres-field-nullable","refentry"],["ingres_field_precision","function.ingres-field-precision","refentry"],["ingres_field_scale","function.ingres-field-scale","refentry"],["ingres_field_type","function.ingres-field-type","refentry"],["","function.ingres-free-result","example"],["ingres_free_result","function.ingres-free-result","refentry"],["ingres_next_error","function.ingres-next-error","refentry"],["ingres_num_fields","function.ingres-num-fields","refentry"],["ingres_num_rows","function.ingres-num-rows","refentry"],["ingres_pconnect","function.ingres-pconnect","refentry"],["ingres_prepare","function.ingres-prepare","refentry"],["","function.ingres-query","varlistentry"],["","function.ingres-query","varlistentry"],["","function.ingres-query","example"],["","function.ingres-query","example"],["","function.ingres-query","example"],["ingres_query","function.ingres-query","refentry"],["","function.ingres-result-seek","example"],["ingres_result_seek","function.ingres-result-seek","refentry"],["ingres_rollback","function.ingres-rollback","refentry"],["","function.ingres-set-environment","varlistentry"],["","function.ingres-set-environment","example"],["","function.ingres-set-environment","example"],["ingres_set_environment","function.ingres-set-environment","refentry"],["","function.ingres-unbuffered-query","example"],["","function.ingres-unbuffered-query","example"],["","function.ingres-unbuffered-query","example"],["ingres_unbuffered_query","function.ingres-unbuffered-query","refentry"],["","ref.ingres","reference"],["Ingres","book.ingres","book"],["","intro.maxdb","preface"],["","maxdb.requirements","section"],["","maxdb.installation","section"],["","maxdb.configuration","varlistentry"],["","maxdb.configuration","varlistentry"],["","maxdb.configuration","varlistentry"],["","maxdb.configuration","varlistentry"],["","maxdb.configuration","varlistentry"],["","maxdb.configuration","section"],["","maxdb.resources","section"],["","maxdb.setup","chapter"],["","maxdb.constants","appendix"],["","maxdb.examples-basic","example"],["","maxdb.examples-basic","example"],["","maxdb.examples-basic","example"],["","maxdb.examples-basic","section"],["","maxdb.examples","chapter"],["","ref.maxdb","section"],["","ref.maxdb","section"],["","ref.maxdb","section"],["","ref.maxdb","section"],["","ref.maxdb","section"],["","ref.maxdb","section"],["","ref.maxdb","section"],["","ref.maxdb","section"],["","ref.maxdb","section"],["","ref.maxdb","section"],["","ref.maxdb","section"],["","function.maxdb-affected-rows","example"],["","function.maxdb-affected-rows","example"],["maxdb_affected_rows","function.maxdb-affected-rows","refentry"],["","function.maxdb-autocommit","example"],["","function.maxdb-autocommit","example"],["maxdb_autocommit","function.maxdb-autocommit","refentry"],["maxdb_bind_param","function.maxdb-bind-param","refentry"],["maxdb_bind_result","function.maxdb-bind-result","refentry"],["","function.maxdb-change-user","example"],["","function.maxdb-change-user","example"],["maxdb_change_user","function.maxdb-change-user","refentry"],["","function.maxdb-character-set-name","example"],["","function.maxdb-character-set-name","example"],["maxdb_character_set_name","function.maxdb-character-set-name","refentry"],["maxdb_client_encoding","function.maxdb-client-encoding","refentry"],["maxdb_close_long_data","function.maxdb-close-long-data","refentry"],["maxdb_close","function.maxdb-close","refentry"],["","function.maxdb-commit","example"],["","function.maxdb-commit","example"],["maxdb_commit","function.maxdb-commit","refentry"],["","function.maxdb-connect-errno","example"],["maxdb_connect_errno","function.maxdb-connect-errno","refentry"],["","function.maxdb-connect-error","example"],["maxdb_connect_error","function.maxdb-connect-error","refentry"],["","function.maxdb-connect","example"],["","function.maxdb-connect","example"],["maxdb_connect","function.maxdb-connect","refentry"],["","function.maxdb-data-seek","example"],["","function.maxdb-data-seek","example"],["maxdb_data_seek","function.maxdb-data-seek","refentry"],["","function.maxdb-debug","example"],["maxdb_debug","function.maxdb-debug","refentry"],["maxdb_disable_reads_from_master","function.maxdb-disable-reads-from-master","refentry"],["maxdb_disable_rpl_parse","function.maxdb-disable-rpl-parse","refentry"],["maxdb_dump_debug_info","function.maxdb-dump-debug-info","refentry"],["maxdb_embedded_connect","function.maxdb-embedded-connect","refentry"],["maxdb_enable_reads_from_master","function.maxdb-enable-reads-from-master","refentry"],["maxdb_enable_rpl_parse","function.maxdb-enable-rpl-parse","refentry"],["","function.maxdb-errno","example"],["","function.maxdb-errno","example"],["maxdb_errno","function.maxdb-errno","refentry"],["","function.maxdb-error","example"],["","function.maxdb-error","example"],["maxdb_error","function.maxdb-error","refentry"],["maxdb_escape_string","function.maxdb-escape-string","refentry"],["maxdb_execute","function.maxdb-execute","refentry"],["","function.maxdb-fetch-array","example"],["","function.maxdb-fetch-array","example"],["maxdb_fetch_array","function.maxdb-fetch-array","refentry"],["","function.maxdb-fetch-assoc","example"],["","function.maxdb-fetch-assoc","example"],["maxdb_fetch_assoc","function.maxdb-fetch-assoc","refentry"],["","function.maxdb-fetch-field-direct","example"],["","function.maxdb-fetch-field-direct","example"],["maxdb_fetch_field_direct","function.maxdb-fetch-field-direct","refentry"],["","function.maxdb-fetch-field","example"],["","function.maxdb-fetch-field","example"],["maxdb_fetch_field","function.maxdb-fetch-field","refentry"],["","function.maxdb-fetch-fields","example"],["","function.maxdb-fetch-fields","example"],["maxdb_fetch_fields","function.maxdb-fetch-fields","refentry"],["","function.maxdb-fetch-lengths","example"],["","function.maxdb-fetch-lengths","example"],["maxdb_fetch_lengths","function.maxdb-fetch-lengths","refentry"],["","function.maxdb-fetch-object","example"],["","function.maxdb-fetch-object","example"],["maxdb_fetch_object","function.maxdb-fetch-object","refentry"],["","function.maxdb-fetch-row","example"],["","function.maxdb-fetch-row","example"],["maxdb_fetch_row","function.maxdb-fetch-row","refentry"],["maxdb_fetch","function.maxdb-fetch","refentry"],["","function.maxdb-field-count","example"],["","function.maxdb-field-count","example"],["maxdb_field_count","function.maxdb-field-count","refentry"],["","function.maxdb-field-seek","example"],["","function.maxdb-field-seek","example"],["maxdb_field_seek","function.maxdb-field-seek","refentry"],["","function.maxdb-field-tell","example"],["","function.maxdb-field-tell","example"],["maxdb_field_tell","function.maxdb-field-tell","refentry"],["maxdb_free_result","function.maxdb-free-result","refentry"],["","function.maxdb-get-client-info","example"],["maxdb_get_client_info","function.maxdb-get-client-info","refentry"],["","function.maxdb-get-client-version","example"],["maxdb_get_client_version","function.maxdb-get-client-version","refentry"],["","function.maxdb-get-host-info","example"],["","function.maxdb-get-host-info","example"],["maxdb_get_host_info","function.maxdb-get-host-info","refentry"],["maxdb_get_metadata","function.maxdb-get-metadata","refentry"],["","function.maxdb-get-proto-info","example"],["","function.maxdb-get-proto-info","example"],["maxdb_get_proto_info","function.maxdb-get-proto-info","refentry"],["","function.maxdb-get-server-info","example"],["","function.maxdb-get-server-info","example"],["maxdb_get_server_info","function.maxdb-get-server-info","refentry"],["","function.maxdb-get-server-version","example"],["","function.maxdb-get-server-version","example"],["maxdb_get_server_version","function.maxdb-get-server-version","refentry"],["","function.maxdb-info","example"],["","function.maxdb-info","example"],["maxdb_info","function.maxdb-info","refentry"],["maxdb_init","function.maxdb-init","refentry"],["","function.maxdb-insert-id","example"],["","function.maxdb-insert-id","example"],["maxdb_insert_id","function.maxdb-insert-id","refentry"],["","function.maxdb-kill","example"],["","function.maxdb-kill","example"],["maxdb_kill","function.maxdb-kill","refentry"],["maxdb_master_query","function.maxdb-master-query","refentry"],["maxdb_more_results","function.maxdb-more-results","refentry"],["","function.maxdb-multi-query","example"],["","function.maxdb-multi-query","example"],["maxdb_multi_query","function.maxdb-multi-query","refentry"],["maxdb_next_result","function.maxdb-next-result","refentry"],["","function.maxdb-num-fields","example"],["","function.maxdb-num-fields","example"],["maxdb_num_fields","function.maxdb-num-fields","refentry"],["","function.maxdb-num-rows","example"],["","function.maxdb-num-rows","example"],["maxdb_num_rows","function.maxdb-num-rows","refentry"],["maxdb_options","function.maxdb-options","refentry"],["maxdb_param_count","function.maxdb-param-count","refentry"],["","function.maxdb-ping","example"],["","function.maxdb-ping","example"],["maxdb_ping","function.maxdb-ping","refentry"],["","function.maxdb-prepare","example"],["","function.maxdb-prepare","example"],["maxdb_prepare","function.maxdb-prepare","refentry"],["","function.maxdb-query","example"],["","function.maxdb-query","example"],["maxdb_query","function.maxdb-query","refentry"],["","function.maxdb-real-connect","example"],["","function.maxdb-real-connect","example"],["maxdb_real_connect","function.maxdb-real-connect","refentry"],["","function.maxdb-real-escape-string","example"],["","function.maxdb-real-escape-string","example"],["maxdb_real_escape_string","function.maxdb-real-escape-string","refentry"],["maxdb_real_query","function.maxdb-real-query","refentry"],["","function.maxdb-report","example"],["maxdb_report","function.maxdb-report","refentry"],["","function.maxdb-rollback","example"],["","function.maxdb-rollback","example"],["maxdb_rollback","function.maxdb-rollback","refentry"],["maxdb_rpl_parse_enabled","function.maxdb-rpl-parse-enabled","refentry"],["maxdb_rpl_probe","function.maxdb-rpl-probe","refentry"],["maxdb_rpl_query_type","function.maxdb-rpl-query-type","refentry"],["","function.maxdb-select-db","example"],["","function.maxdb-select-db","example"],["maxdb_select_db","function.maxdb-select-db","refentry"],["maxdb_send_long_data","function.maxdb-send-long-data","refentry"],["maxdb_send_query","function.maxdb-send-query","refentry"],["maxdb_server_end","function.maxdb-server-end","refentry"],["maxdb_server_init","function.maxdb-server-init","refentry"],["maxdb_set_opt","function.maxdb-set-opt","refentry"],["","function.maxdb-sqlstate","example"],["","function.maxdb-sqlstate","example"],["maxdb_sqlstate","function.maxdb-sqlstate","refentry"],["maxdb_ssl_set","function.maxdb-ssl-set","refentry"],["","function.maxdb-stat","example"],["","function.maxdb-stat","example"],["maxdb_stat","function.maxdb-stat","refentry"],["","function.maxdb-stmt-affected-rows","example"],["","function.maxdb-stmt-affected-rows","example"],["maxdb_stmt_affected_rows","function.maxdb-stmt-affected-rows","refentry"],["","function.maxdb-stmt-bind-param","example"],["","function.maxdb-stmt-bind-param","example"],["","function.maxdb-stmt-bind-param","example"],["","function.maxdb-stmt-bind-param","example"],["","function.maxdb-stmt-bind-param","example"],["maxdb_stmt_bind_param","function.maxdb-stmt-bind-param","refentry"],["","function.maxdb-stmt-bind-result","example"],["","function.maxdb-stmt-bind-result","example"],["maxdb_stmt_bind_result","function.maxdb-stmt-bind-result","refentry"],["maxdb_stmt_close_long_data","function.maxdb-stmt-close-long-data","refentry"],["maxdb_stmt_close","function.maxdb-stmt-close","refentry"],["","function.maxdb-stmt-data-seek","example"],["","function.maxdb-stmt-data-seek","example"],["maxdb_stmt_data_seek","function.maxdb-stmt-data-seek","refentry"],["","function.maxdb-stmt-errno","example"],["","function.maxdb-stmt-errno","example"],["maxdb_stmt_errno","function.maxdb-stmt-errno","refentry"],["","function.maxdb-stmt-error","example"],["","function.maxdb-stmt-error","example"],["maxdb_stmt_error","function.maxdb-stmt-error","refentry"],["","function.maxdb-stmt-execute","example"],["","function.maxdb-stmt-execute","example"],["maxdb_stmt_execute","function.maxdb-stmt-execute","refentry"],["","function.maxdb-stmt-fetch","example"],["","function.maxdb-stmt-fetch","example"],["maxdb_stmt_fetch","function.maxdb-stmt-fetch","refentry"],["maxdb_stmt_free_result","function.maxdb-stmt-free-result","refentry"],["maxdb_stmt_init","function.maxdb-stmt-init","refentry"],["","function.maxdb-stmt-num-rows","example"],["","function.maxdb-stmt-num-rows","example"],["maxdb_stmt_num_rows","function.maxdb-stmt-num-rows","refentry"],["","function.maxdb-stmt-param-count","example"],["","function.maxdb-stmt-param-count","example"],["maxdb_stmt_param_count","function.maxdb-stmt-param-count","refentry"],["","function.maxdb-stmt-prepare","example"],["","function.maxdb-stmt-prepare","example"],["maxdb_stmt_prepare","function.maxdb-stmt-prepare","refentry"],["maxdb_stmt_reset","function.maxdb-stmt-reset","refentry"],["","function.maxdb-stmt-result-metadata","example"],["","function.maxdb-stmt-result-metadata","example"],["maxdb_stmt_result_metadata","function.maxdb-stmt-result-metadata","refentry"],["maxdb_stmt_send_long_data","function.maxdb-stmt-send-long-data","refentry"],["","function.maxdb-stmt-sqlstate","example"],["","function.maxdb-stmt-sqlstate","example"],["maxdb_stmt_sqlstate","function.maxdb-stmt-sqlstate","refentry"],["","function.maxdb-stmt-store-result","example"],["","function.maxdb-stmt-store-result","example"],["maxdb_stmt_store_result","function.maxdb-stmt-store-result","refentry"],["maxdb_store_result","function.maxdb-store-result","refentry"],["","function.maxdb-thread-id","example"],["","function.maxdb-thread-id","example"],["maxdb_thread_id","function.maxdb-thread-id","refentry"],["maxdb_thread_safe","function.maxdb-thread-safe","refentry"],["","function.maxdb-use-result","example"],["","function.maxdb-use-result","example"],["maxdb_use_result","function.maxdb-use-result","refentry"],["","function.maxdb-warning-count","example"],["","function.maxdb-warning-count","example"],["maxdb_warning_count","function.maxdb-warning-count","refentry"],["","ref.maxdb","reference"],["","book.maxdb","book"],["","mongo.requirements","section"],["","mongo.installation","section"],["","mongo.configuration","tbody"],["","mongo.configuration","varlistentry"],["","mongo.configuration","varlistentry"],["","mongo.configuration","varlistentry"],["","mongo.configuration","varlistentry"],["","mongo.configuration","varlistentry"],["","mongo.configuration","varlistentry"],["","mongo.configuration","varlistentry"],["","mongo.configuration","varlistentry"],["","mongo.configuration","varlistentry"],["","mongo.configuration","varlistentry"],["","mongo.configuration","varlistentry"],["","mongo.configuration","section"],["","mongo.setup","chapter"],["","mongo.manual","partintro"],["","mongo.tutorial","example"],["","mongo.tutorial.connecting","example"],["","mongo.tutorial.connecting","section"],["","mongo.tutorial.connecting","section"],["","mongo.tutorial.selectdb","example"],["","mongo.tutorial.selectdb","example"],["","mongo.tutorial.selectdb","section"],["","mongo.tutorial.selectdb","section"],["","mongo.tutorial.collection","example"],["","mongo.tutorial.collection","section"],["","mongo.tutorial.collection","section"],["","mongo.tutorial.insert","example"],["","mongo.tutorial.insert","example"],["","mongo.tutorial.insert","section"],["","mongo.tutorial.insert","section"],["","mongo.tutorial.findone","example"],["","mongo.tutorial.findone","example"],["","mongo.tutorial.findone","section"],["","mongo.tutorial.findone","section"],["","mongo.tutorial.insert.multiple","example"],["","mongo.tutorial.insert.multiple","section"],["","mongo.tutorial.counting","example"],["","mongo.tutorial.counting","section"],["","mongo.tutorial.cursor","example"],["","mongo.tutorial.cursor","section"],["","mongo.tutorial.cursor","section"],["","mongo.tutorial.criteria","example"],["","mongo.tutorial.criteria","section"],["","mongo.tutorial.multi.query","example"],["","mongo.tutorial.multi.query","section"],["","mongo.tutorial.indexes","example"],["","mongo.tutorial.indexes","section"],["","mongo.tutorial","chapter"],["","mongo.readpreferences","simplesect"],["","mongo.readpreferences","simplesect"],["","mongo.readpreferences","example"],["","mongo.readpreferences","example"],["","mongo.readpreferences","simplesect"],["","mongo.readpreferences","chapter"],["","mongo.writeconcerns","table"],["","mongo.writeconcerns","example"],["","mongo.writeconcerns","example"],["","mongo.writeconcerns","example"],["","mongo.writeconcerns","simplesect"],["","mongo.writeconcerns","example"],["","mongo.writeconcerns","simplesect"],["","mongo.writeconcerns","example"],["","mongo.writeconcerns","simplesect"],["","mongo.writeconcerns","example"],["","mongo.writeconcerns","simplesect"],["","mongo.writeconcerns","example"],["","mongo.writeconcerns","simplesect"],["","mongo.writeconcerns","chapter"],["","mongo.sqltomongo","chapter"],["","mongo.connecting.auth","example"],["","mongo.connecting.auth","example"],["","mongo.connecting.auth","section"],["","mongo.connecting.rs","example"],["","mongo.connecting.rs","example"],["","mongo.connecting.rs","example"],["","mongo.connecting.rs","section"],["","mongo.connecting.mongos","example"],["","mongo.connecting.mongos","section"],["","mongo.connecting.uds","example"],["","mongo.connecting.uds","example"],["","mongo.connecting.uds","section"],["","mongo.connecting.pools","section"],["","mongo.connecting.persistent","example"],["","mongo.connecting.persistent","example"],["","mongo.connecting.persistent","section"],["","mongo.connecting","chapter"],["","mongo.writes","chapter"],["","mongo.queries","example"],["","mongo.queries","simplesect"],["","mongo.queries","example"],["","mongo.queries","simplesect"],["","mongo.queries","simplesect"],["","mongo.queries","example"],["","mongo.queries","example"],["","mongo.queries","simplesect"],["","mongo.queries","example"],["","mongo.queries","example"],["","mongo.queries","example"],["","mongo.queries","example"],["","mongo.queries","simplesect"],["","mongo.queries","chapter"],["","mongo.updates","chapter"],["","mongo.security","chapter"],["","mongo.trouble","chapter"],["","mongo.testing","chapter"],["","mongo.manual","part"],["","class.mongoclient","example"],["","class.mongoclient","section"],["","class.mongoclient","section"],["","class.mongoclient","varlistentry"],["","class.mongoclient","varlistentry"],["","class.mongoclient","varlistentry"],["","class.mongoclient","varlistentry"],["","class.mongoclient","varlistentry"],["","class.mongoclient","varlistentry"],["","class.mongoclient","varlistentry"],["","class.mongoclient","varlistentry"],["","class.mongoclient","section"],["","class.mongoclient","section"],["","class.mongoclient","varlistentry"],["","class.mongoclient","varlistentry"],["","class.mongoclient","section"],["","class.mongoclient","section"],["","mongoclient.close","example"],["MongoClient::close","mongoclient.close","refentry"],["MongoClient::connect","mongoclient.connect","refentry"],["","mongoclient.construct","example"],["","mongoclient.construct","example"],["","mongoclient.construct","example"],["","mongoclient.construct","example"],["","mongoclient.construct","example"],["","mongoclient.construct","example"],["MongoClient::__construct","mongoclient.construct","refentry"],["MongoClient::dropDB","mongoclient.dropdb","refentry"],["MongoClient::__get","mongoclient.get","refentry"],["","mongoclient.getconnections","example"],["MongoClient::getConnections","mongoclient.getconnections","refentry"],["MongoClient::getHosts","mongoclient.gethosts","refentry"],["","mongoclient.getreadpreference","example"],["MongoClient::getReadPreference","mongoclient.getreadpreference","refentry"],["","mongoclient.killcursor","example"],["MongoClient::killCursor","mongoclient.killcursor","refentry"],["","mongoclient.listdbs","example"],["MongoClient::listDBs","mongoclient.listdbs","refentry"],["","mongoclient.selectcollection","example"],["MongoClient::selectCollection","mongoclient.selectcollection","refentry"],["MongoClient::selectDB","mongoclient.selectdb","refentry"],["","mongoclient.setreadpreference","example"],["MongoClient::setReadPreference","mongoclient.setreadpreference","refentry"],["MongoClient::__toString","mongoclient.tostring","refentry"],["MongoClient","class.mongoclient","phpdoc:classref"],["","class.mongodb","example"],["","class.mongodb","section"],["","class.mongodb","section"],["","class.mongodb","varlistentry"],["","class.mongodb","varlistentry"],["","class.mongodb","varlistentry"],["","class.mongodb","section"],["","class.mongodb","varlistentry"],["","class.mongodb","varlistentry"],["MongoDB::authenticate","mongodb.authenticate","refentry"],["","mongodb.command","example"],["","mongodb.command","example"],["","mongodb.command","example"],["","mongodb.command","example"],["","mongodb.command","example"],["MongoDB::command","mongodb.command","refentry"],["MongoDB::__construct","mongodb.construct","refentry"],["","mongodb.createcollection","example"],["MongoDB::createCollection","mongodb.createcollection","refentry"],["","mongodb.createdbref","example"],["","mongodb.createdbref","example"],["MongoDB::createDBRef","mongodb.createdbref","refentry"],["","mongodb.drop","example"],["MongoDB::drop","mongodb.drop","refentry"],["MongoDB::dropCollection","mongodb.dropcollection","refentry"],["","mongodb.execute","example"],["","mongodb.execute","example"],["","mongodb.execute","example"],["MongoDB::execute","mongodb.execute","refentry"],["MongoDB::forceError","mongodb.forceerror","refentry"],["MongoDB::__get","mongodb.get","refentry"],["","mongodb.getcollectionnames","example"],["MongoDB::getCollectionNames","mongodb.getcollectionnames","refentry"],["","mongodb.getdbref","example"],["MongoDB::getDBRef","mongodb.getdbref","refentry"],["","mongodb.getgridfs","example"],["MongoDB::getGridFS","mongodb.getgridfs","refentry"],["MongoDB::getProfilingLevel","mongodb.getprofilinglevel","refentry"],["","mongodb.getreadpreference","example"],["MongoDB::getReadPreference","mongodb.getreadpreference","refentry"],["MongoDB::getSlaveOkay","mongodb.getslaveokay","refentry"],["","mongodb.lasterror","example"],["","mongodb.lasterror","example"],["MongoDB::lastError","mongodb.lasterror","refentry"],["","mongodb.listcollections","example"],["MongoDB::listCollections","mongodb.listcollections","refentry"],["MongoDB::prevError","mongodb.preverror","refentry"],["","mongodb.repair","example"],["MongoDB::repair","mongodb.repair","refentry"],["MongoDB::resetError","mongodb.reseterror","refentry"],["MongoDB::selectCollection","mongodb.selectcollection","refentry"],["MongoDB::setProfilingLevel","mongodb.setprofilinglevel","refentry"],["","mongodb.setreadpreference","example"],["MongoDB::setReadPreference","mongodb.setreadpreference","refentry"],["MongoDB::setSlaveOkay","mongodb.setslaveokay","refentry"],["MongoDB::__toString","mongodb.--tostring","refentry"],["MongoDB","class.mongodb","phpdoc:classref"],["","class.mongocollection","section"],["","class.mongocollection","section"],["","class.mongocollection","varlistentry"],["","class.mongocollection","varlistentry"],["","class.mongocollection","varlistentry"],["","class.mongocollection","varlistentry"],["","class.mongocollection","varlistentry"],["","mongocollection.aggregate","example"],["","mongocollection.aggregate","example"],["","mongocollection.aggregate","example"],["MongoCollection::aggregate","mongocollection.aggregate","refentry"],["","mongocollection.batchinsert","example"],["","mongocollection.batchinsert","example"],["MongoCollection::batchInsert","mongocollection.batchinsert","refentry"],["MongoCollection::__construct","mongocollection.construct","refentry"],["","mongocollection.count","example"],["MongoCollection::count","mongocollection.count","refentry"],["","mongocollection.createdbref","example"],["MongoCollection::createDBRef","mongocollection.createdbref","refentry"],["","mongocollection.deleteindex","example"],["MongoCollection::deleteIndex","mongocollection.deleteindex","refentry"],["","mongocollection.deleteindexes","example"],["MongoCollection::deleteIndexes","mongocollection.deleteindexes","refentry"],["","mongocollection.distinct","example"],["","mongocollection.distinct","example"],["MongoCollection::distinct","mongocollection.distinct","refentry"],["","mongocollection.drop","example"],["MongoCollection::drop","mongocollection.drop","refentry"],["","mongocollection.ensureindex","example"],["","mongocollection.ensureindex","example"],["","mongocollection.ensureindex","example"],["MongoCollection::ensureIndex","mongocollection.ensureindex","refentry"],["","mongocollection.find","example"],["","mongocollection.find","example"],["","mongocollection.find","example"],["","mongocollection.find","example"],["","mongocollection.find","example"],["MongoCollection::find","mongocollection.find","refentry"],["","mongocollection.findandmodify","example"],["","mongocollection.findandmodify","example"],["MongoCollection::findAndModify","mongocollection.findandmodify","refentry"],["","mongocollection.findone","example"],["","mongocollection.findone","example"],["MongoCollection::findOne","mongocollection.findone","refentry"],["MongoCollection::__get","mongocollection.get","refentry"],["","mongocollection.getdbref","example"],["MongoCollection::getDBRef","mongocollection.getdbref","refentry"],["","mongocollection.getindexinfo","example"],["MongoCollection::getIndexInfo","mongocollection.getindexinfo","refentry"],["","mongocollection.getname","example"],["MongoCollection::getName","mongocollection.getname","refentry"],["","mongocollection.getreadpreference","example"],["MongoCollection::getReadPreference","mongocollection.getreadpreference","refentry"],["MongoCollection::getSlaveOkay","mongocollection.getslaveokay","refentry"],["","mongocollection.group","example"],["","mongocollection.group","example"],["","mongocollection.group","example"],["MongoCollection::group","mongocollection.group","refentry"],["","mongocollection.insert","example"],["","mongocollection.insert","example"],["MongoCollection::insert","mongocollection.insert","refentry"],["","mongocollection.remove","example"],["MongoCollection::remove","mongocollection.remove","refentry"],["","mongocollection.save","example"],["MongoCollection::save","mongocollection.save","refentry"],["","mongocollection.setreadpreference","example"],["MongoCollection::setReadPreference","mongocollection.setreadpreference","refentry"],["MongoCollection::setSlaveOkay","mongocollection.setslaveokay","refentry"],["","mongocollection.toindexstring","example"],["MongoCollection::toIndexString","mongocollection.toindexstring","refentry"],["","mongocollection.--tostring","example"],["MongoCollection::__toString","mongocollection.--tostring","refentry"],["","mongocollection.update","example"],["","mongocollection.update","example"],["","mongocollection.update","example"],["MongoCollection::update","mongocollection.update","refentry"],["MongoCollection::validate","mongocollection.validate","refentry"],["MongoCollection","class.mongocollection","phpdoc:classref"],["","class.mongocursor","example"],["","class.mongocursor","example"],["","class.mongocursor","section"],["","class.mongocursor","example"],["","class.mongocursor","section"],["","class.mongocursor","varlistentry"],["","class.mongocursor","varlistentry"],["","mongocursor.addoption","example"],["MongoCursor::addOption","mongocursor.addoption","refentry"],["","mongocursor.awaitdata","example"],["MongoCursor::awaitData","mongocursor.awaitdata","refentry"],["","mongocursor.batchsize","example"],["MongoCursor::batchSize","mongocursor.batchsize","refentry"],["MongoCursor::__construct","mongocursor.construct","refentry"],["","mongocursor.count","example"],["MongoCursor::count","mongocursor.count","refentry"],["MongoCursor::current","mongocursor.current","refentry"],["MongoCursor::dead","mongocursor.dead","refentry"],["","mongocursor.doquery","example"],["MongoCursor::doQuery","mongocursor.doquery","refentry"],["","mongocursor.explain","example"],["MongoCursor::explain","mongocursor.explain","refentry"],["MongoCursor::fields","mongocursor.fields","refentry"],["MongoCursor::getNext","mongocursor.getnext","refentry"],["","mongocursor.getreadpreference","example"],["MongoCursor::getReadPreference","mongocursor.getreadpreference","refentry"],["MongoCursor::hasNext","mongocursor.hasnext","refentry"],["MongoCursor::hint","mongocursor.hint","refentry"],["MongoCursor::immortal","mongocursor.immortal","refentry"],["","mongocursor.info","example"],["MongoCursor::info","mongocursor.info","refentry"],["MongoCursor::key","mongocursor.key","refentry"],["MongoCursor::limit","mongocursor.limit","refentry"],["MongoCursor::next","mongocursor.next","refentry"],["MongoCursor::partial","mongocursor.partial","refentry"],["MongoCursor::reset","mongocursor.reset","refentry"],["MongoCursor::rewind","mongocursor.rewind","refentry"],["","mongocursor.setflag","example"],["MongoCursor::setFlag","mongocursor.setflag","refentry"],["","mongocursor.setreadpreference","example"],["MongoCursor::setReadPreference","mongocursor.setreadpreference","refentry"],["MongoCursor::skip","mongocursor.skip","refentry"],["","mongocursor.slaveokay","example"],["MongoCursor::slaveOkay","mongocursor.slaveokay","refentry"],["MongoCursor::snapshot","mongocursor.snapshot","refentry"],["","mongocursor.sort","example"],["MongoCursor::sort","mongocursor.sort","refentry"],["","mongocursor.tailable","example"],["MongoCursor::tailable","mongocursor.tailable","refentry"],["","mongocursor.timeout","example"],["MongoCursor::timeout","mongocursor.timeout","refentry"],["MongoCursor::valid","mongocursor.valid","refentry"],["MongoCursor","class.mongocursor","phpdoc:classref"],["","mongo.core","part"],["","class.mongoid","section"],["","class.mongoid","section"],["","class.mongoid","varlistentry"],["","mongoid.construct","example"],["","mongoid.construct","example"],["MongoId::__construct","mongoid.construct","refentry"],["MongoId::getHostname","mongoid.gethostname","refentry"],["MongoId::getInc","mongoid.getinc","refentry"],["MongoId::getPID","mongoid.getpid","refentry"],["MongoId::getTimestamp","mongoid.gettimestamp","refentry"],["MongoId::__set_state","mongoid.set-state","refentry"],["","mongoid.tostring","example"],["MongoId::__toString","mongoid.tostring","refentry"],["MongoId","class.mongoid","phpdoc:classref"],["","class.mongocode","section"],["","class.mongocode","section"],["","mongocode.construct","example"],["","mongocode.construct","example"],["MongoCode::__construct","mongocode.construct","refentry"],["","mongocode.tostring","example"],["MongoCode::__toString","mongocode.tostring","refentry"],["MongoCode","class.mongocode","phpdoc:classref"],["","class.mongodate","example"],["","class.mongodate","section"],["","class.mongodate","section"],["","mongodate.construct","example"],["MongoDate::__construct","mongodate.construct","refentry"],["MongoDate::__toString","mongodate.tostring","refentry"],["MongoDate","class.mongodate","phpdoc:classref"],["","class.mongoregex","example"],["","class.mongoregex","section"],["","class.mongoregex","section"],["","mongoregex.construct","example"],["MongoRegex::__construct","mongoregex.construct","refentry"],["","mongoregex.tostring","example"],["MongoRegex::__toString","mongoregex.tostring","refentry"],["MongoRegex","class.mongoregex","phpdoc:classref"],["","class.mongobindata","example"],["","class.mongobindata","section"],["","class.mongobindata","section"],["","class.mongobindata","varlistentry"],["","class.mongobindata","varlistentry"],["","class.mongobindata","varlistentry"],["","class.mongobindata","varlistentry"],["","class.mongobindata","varlistentry"],["","class.mongobindata","section"],["MongoBinData::__construct","mongobindata.construct","refentry"],["MongoBinData::__toString","mongobindata.tostring","refentry"],["MongoBinData","class.mongobindata","phpdoc:classref"],["","class.mongoint32","section"],["","class.mongoint32","section"],["","class.mongoint32","varlistentry"],["MongoInt32::__construct","mongoint32.construct","refentry"],["MongoInt32::__toString","mongoint32.tostring","refentry"],["MongoInt32","class.mongoint32","phpdoc:classref"],["","class.mongoint64","section"],["","class.mongoint64","section"],["","class.mongoint64","varlistentry"],["MongoInt64::__construct","mongoint64.construct","refentry"],["MongoInt64::__toString","mongoint64.tostring","refentry"],["MongoInt64","class.mongoint64","phpdoc:classref"],["","class.mongodbref","example"],["","class.mongodbref","example"],["","class.mongodbref","section"],["","class.mongodbref","section"],["","mongodbref.create","example"],["MongoDBRef::create","mongodbref.create","refentry"],["","mongodbref.get","example"],["MongoDBRef::get","mongodbref.get","refentry"],["MongoDBRef::isRef","mongodbref.isref","refentry"],["MongoDBRef","class.mongodbref","phpdoc:classref"],["","class.mongominkey","section"],["","class.mongominkey","section"],["","class.mongominkey","section"],["MongoMinKey","class.mongominkey","phpdoc:classref"],["","class.mongomaxkey","section"],["","class.mongomaxkey","section"],["","class.mongomaxkey","section"],["MongoMaxKey","class.mongomaxkey","phpdoc:classref"],["","class.mongotimestamp","section"],["","class.mongotimestamp","section"],["MongoTimestamp::__construct","mongotimestamp.construct","refentry"],["MongoTimestamp::__toString","mongotimestamp.tostring","refentry"],["MongoTimestamp","class.mongotimestamp","phpdoc:classref"],["","mongo.types","part"],["","class.mongogridfs","section"],["","class.mongogridfs","section"],["MongoGridFS::__construct","mongogridfs.construct","refentry"],["MongoGridFS::delete","mongogridfs.delete","refentry"],["MongoGridFS::drop","mongogridfs.drop","refentry"],["MongoGridFS::find","mongogridfs.find","refentry"],["","mongogridfs.findone","example"],["MongoGridFS::findOne","mongogridfs.findone","refentry"],["MongoGridFS::get","mongogridfs.get","refentry"],["MongoGridFS::put","mongogridfs.put","refentry"],["MongoGridFS::remove","mongogridfs.remove","refentry"],["","mongogridfs.storebytes","example"],["MongoGridFS::storeBytes","mongogridfs.storebytes","refentry"],["","mongogridfs.storefile","example"],["MongoGridFS::storeFile","mongogridfs.storefile","refentry"],["","mongogridfs.storeupload","example"],["MongoGridFS::storeUpload","mongogridfs.storeupload","refentry"],["MongoGridFS","class.mongogridfs","phpdoc:classref"],["","class.mongogridfsfile","section"],["","class.mongogridfsfile","section"],["MongoGridfsFile::__construct","mongogridfsfile.construct","refentry"],["","mongogridfsfile.getbytes","example"],["MongoGridFSFile::getBytes","mongogridfsfile.getbytes","refentry"],["MongoGridFSFile::getFilename","mongogridfsfile.getfilename","refentry"],["","mongogridfsfile.getresource","example"],["MongoGridFSFile::getResource","mongogridfsfile.getresource","refentry"],["MongoGridFSFile::getSize","mongogridfsfile.getsize","refentry"],["","mongogridfsfile.write","example"],["MongoGridFSFile::write","mongogridfsfile.write","refentry"],["MongoGridFSFile","class.mongogridfsfile","phpdoc:classref"],["","class.mongogridfscursor","section"],["","class.mongogridfscursor","section"],["MongoGridFSCursor::__construct","mongogridfscursor.construct","refentry"],["MongoGridFSCursor::current","mongogridfscursor.current","refentry"],["MongoGridFSCursor::getNext","mongogridfscursor.getnext","refentry"],["MongoGridFSCursor::key","mongogridfscursor.key","refentry"],["MongoGridFSCursor","class.mongogridfscursor","phpdoc:classref"],["","mongo.gridfs","part"],["","class.mongolog","section"],["","class.mongolog","section"],["","class.mongolog","varlistentry"],["","class.mongolog","varlistentry"],["","class.mongolog","section"],["","class.mongolog","varlistentry"],["","class.mongolog","varlistentry"],["","class.mongolog","varlistentry"],["","class.mongolog","section"],["","class.mongolog","varlistentry"],["","class.mongolog","varlistentry"],["","class.mongolog","varlistentry"],["","class.mongolog","varlistentry"],["","class.mongolog","varlistentry"],["","class.mongolog","section"],["MongoLog::getCallback","mongolog.getcallback","refentry"],["MongoLog::getLevel","mongolog.getlevel","refentry"],["MongoLog::getModule","mongolog.getmodule","refentry"],["","mongolog.setcallback","example"],["MongoLog::setCallback","mongolog.setcallback","refentry"],["MongoLog::setLevel","mongolog.setlevel","refentry"],["MongoLog::setModule","mongolog.setmodule","refentry"],["MongoLog","class.mongolog","phpdoc:classref"],["","class.mongopool","section"],["","class.mongopool","section"],["","mongopool.getsize","example"],["MongoPool::getSize","mongopool.getsize","refentry"],["MongoPool::info","mongopool.info","refentry"],["","mongopool.setsize","example"],["MongoPool::setSize","mongopool.setsize","refentry"],["MongoPool","class.mongopool","phpdoc:classref"],["","class.mongo","section"],["","class.mongo","section"],["Mongo::connectUtil","mongo.connectutil","refentry"],["Mongo::__construct","mongo.construct","refentry"],["","mongo.getpoolsize","example"],["Mongo::getPoolSize","mongo.getpoolsize","refentry"],["Mongo::getSlave","mongo.getslave","refentry"],["Mongo::getSlaveOkay","mongo.getslaveokay","refentry"],["Mongo::poolDebug","mongo.pooldebug","refentry"],["","mongo.setpoolsize","example"],["Mongo::setPoolSize","mongo.setpoolsize","refentry"],["Mongo::setSlaveOkay","mongo.setslaveokay","refentry"],["Mongo::switchSlave","mongo.switchslave","refentry"],["Mongo","class.mongo","phpdoc:classref"],["","mongo.miscellaneous","part"],["bson_decode","function.bson-decode","refentry"],["bson_encode","function.bson-encode","refentry"],["","ref.mongo","reference"],["","class.mongoexception","section"],["","class.mongoexception","section"],["MongoException","class.mongoexception","phpdoc:classref"],["","class.mongoresultexception","section"],["","class.mongoresultexception","section"],["","class.mongoresultexception","varlistentry"],["","class.mongoresultexception","section"],["MongoResultException::getDocument","mongoresultexception.getdocument","refentry"],["MongoResultException","class.mongoresultexception","phpdoc:classref"],["","class.mongocursorexception","section"],["","class.mongocursorexception","section"],["MongoCursorException::getHost","mongocursorexception.gethost","refentry"],["MongoCursorException","class.mongocursorexception","phpdoc:classref"],["","class.mongocursortimeoutexception","section"],["","class.mongocursortimeoutexception","section"],["MongoCursorTimeoutException","class.mongocursortimeoutexception","phpdoc:classref"],["","class.mongoconnectionexception","section"],["","class.mongoconnectionexception","section"],["MongoConnectionException","class.mongoconnectionexception","phpdoc:classref"],["","class.mongogridfsexception","section"],["","class.mongogridfsexception","section"],["","class.mongogridfsexception","section"],["MongoGridFSException","class.mongogridfsexception","phpdoc:classref"],["","mongo.exceptions","part"],["","changelog.mongo","simplesect"],["","changelog.mongo","appendix"],["Mongo","book.mongo","book"],["","intro.msql","preface"],["","msql.requirements","section"],["","msql.installation","section"],["","msql.configuration","varlistentry"],["","msql.configuration","varlistentry"],["","msql.configuration","varlistentry"],["","msql.configuration","section"],["","msql.resources","section"],["","msql.setup","chapter"],["","msql.constants","varlistentry"],["","msql.constants","varlistentry"],["","msql.constants","varlistentry"],["","msql.constants","appendix"],["","msql.examples-basic","example"],["","msql.examples-basic","section"],["","msql.examples","chapter"],["msql_affected_rows","function.msql-affected-rows","refentry"],["msql_close","function.msql-close","refentry"],["msql_connect","function.msql-connect","refentry"],["msql_create_db","function.msql-create-db","refentry"],["msql_createdb","function.msql-createdb","refentry"],["msql_data_seek","function.msql-data-seek","refentry"],["msql_db_query","function.msql-db-query","refentry"],["msql_dbname","function.msql-dbname","refentry"],["msql_drop_db","function.msql-drop-db","refentry"],["msql_error","function.msql-error","refentry"],["","function.msql-fetch-array","example"],["msql_fetch_array","function.msql-fetch-array","refentry"],["msql_fetch_field","function.msql-fetch-field","refentry"],["","function.msql-fetch-object","example"],["msql_fetch_object","function.msql-fetch-object","refentry"],["","function.msql-fetch-row","example"],["msql_fetch_row","function.msql-fetch-row","refentry"],["msql_field_flags","function.msql-field-flags","refentry"],["msql_field_len","function.msql-field-len","refentry"],["msql_field_name","function.msql-field-name","refentry"],["msql_field_seek","function.msql-field-seek","refentry"],["msql_field_table","function.msql-field-table","refentry"],["msql_field_type","function.msql-field-type","refentry"],["msql_fieldflags","function.msql-fieldflags","refentry"],["msql_fieldlen","function.msql-fieldlen","refentry"],["msql_fieldname","function.msql-fieldname","refentry"],["msql_fieldtable","function.msql-fieldtable","refentry"],["msql_fieldtype","function.msql-fieldtype","refentry"],["msql_free_result","function.msql-free-result","refentry"],["msql_list_dbs","function.msql-list-dbs","refentry"],["msql_list_fields","function.msql-list-fields","refentry"],["msql_list_tables","function.msql-list-tables","refentry"],["msql_num_fields","function.msql-num-fields","refentry"],["msql_num_rows","function.msql-num-rows","refentry"],["msql_numfields","function.msql-numfields","refentry"],["msql_numrows","function.msql-numrows","refentry"],["msql_pconnect","function.msql-pconnect","refentry"],["","function.msql-query","example"],["msql_query","function.msql-query","refentry"],["msql_regcase","function.msql-regcase","refentry"],["msql_result","function.msql-result","refentry"],["msql_select_db","function.msql-select-db","refentry"],["msql_tablename","function.msql-tablename","refentry"],["msql","function.msql","refentry"],["","ref.msql","reference"],["","book.msql","book"],["","intro.mssql","preface"],["","mssql.requirements","section"],["","mssql.installation","section"],["","mssql.configuration","section"],["","mssql.resources","section"],["","mssql.resources","section"],["","mssql.resources","section"],["","mssql.resources","section"],["","mssql.setup","chapter"],["","mssql.constants","varlistentry"],["","mssql.constants","varlistentry"],["","mssql.constants","varlistentry"],["","mssql.constants","varlistentry"],["","mssql.constants","varlistentry"],["","mssql.constants","varlistentry"],["","mssql.constants","varlistentry"],["","mssql.constants","varlistentry"],["","mssql.constants","varlistentry"],["","mssql.constants","varlistentry"],["","mssql.constants","varlistentry"],["","mssql.constants","varlistentry"],["","mssql.constants","appendix"],["","function.mssql-bind","example"],["mssql_bind","function.mssql-bind","refentry"],["","function.mssql-close","example"],["mssql_close","function.mssql-close","refentry"],["","function.mssql-connect","example"],["mssql_connect","function.mssql-connect","refentry"],["","function.mssql-data-seek","example"],["mssql_data_seek","function.mssql-data-seek","refentry"],["","function.mssql-execute","example"],["mssql_execute","function.mssql-execute","refentry"],["","function.mssql-fetch-array","example"],["mssql_fetch_array","function.mssql-fetch-array","refentry"],["","function.mssql-fetch-assoc","example"],["mssql_fetch_assoc","function.mssql-fetch-assoc","refentry"],["","function.mssql-fetch-batch","example"],["mssql_fetch_batch","function.mssql-fetch-batch","refentry"],["","function.mssql-fetch-field","example"],["mssql_fetch_field","function.mssql-fetch-field","refentry"],["","function.mssql-fetch-object","example"],["mssql_fetch_object","function.mssql-fetch-object","refentry"],["","function.mssql-fetch-row","example"],["mssql_fetch_row","function.mssql-fetch-row","refentry"],["","function.mssql-field-length","example"],["mssql_field_length","function.mssql-field-length","refentry"],["","function.mssql-field-name","example"],["mssql_field_name","function.mssql-field-name","refentry"],["","function.mssql-field-seek","example"],["mssql_field_seek","function.mssql-field-seek","refentry"],["","function.mssql-field-type","example"],["mssql_field_type","function.mssql-field-type","refentry"],["","function.mssql-free-result","example"],["mssql_free_result","function.mssql-free-result","refentry"],["","function.mssql-free-statement","example"],["mssql_free_statement","function.mssql-free-statement","refentry"],["","function.mssql-get-last-message","example"],["mssql_get_last_message","function.mssql-get-last-message","refentry"],["","function.mssql-guid-string","example"],["mssql_guid_string","function.mssql-guid-string","refentry"],["","function.mssql-init","example"],["mssql_init","function.mssql-init","refentry"],["","function.mssql-min-error-severity","example"],["mssql_min_error_severity","function.mssql-min-error-severity","refentry"],["","function.mssql-min-message-severity","example"],["mssql_min_message_severity","function.mssql-min-message-severity","refentry"],["","function.mssql-next-result","example"],["mssql_next_result","function.mssql-next-result","refentry"],["","function.mssql-num-fields","example"],["mssql_num_fields","function.mssql-num-fields","refentry"],["","function.mssql-num-rows","example"],["mssql_num_rows","function.mssql-num-rows","refentry"],["","function.mssql-pconnect","example"],["mssql_pconnect","function.mssql-pconnect","refentry"],["","function.mssql-query","example"],["mssql_query","function.mssql-query","refentry"],["","function.mssql-result","example"],["","function.mssql-result","example"],["mssql_result","function.mssql-result","refentry"],["","function.mssql-rows-affected","example"],["mssql_rows_affected","function.mssql-rows-affected","refentry"],["","function.mssql-select-db","example"],["","function.mssql-select-db","example"],["mssql_select_db","function.mssql-select-db","refentry"],["","ref.mssql","reference"],["Mssql","book.mssql","book"],["","set.mysqlinfo","info"],["","mysql","info"],["","mysqlinfo.terminology","chapter"],["","mysqlinfo.api.choosing","example"],["","mysqlinfo.api.choosing","chapter"],["","mysqlinfo.library.choosing","example"],["","mysqlinfo.library.choosing","chapter"],["","mysqlinfo.concepts.buffering","example"],["","mysqlinfo.concepts.buffering","example"],["","mysqlinfo.concepts.buffering","example"],["","mysqlinfo.concepts.buffering","section"],["","mysqlinfo.concepts.charset","example"],["","mysqlinfo.concepts.charset","example"],["","mysqlinfo.concepts.charset","example"],["","mysqlinfo.concepts.charset","example"],["","mysqlinfo.concepts.charset","section"],["","mysqlinfo.concepts","chapter"],["","mysql","book"],["","intro.mysql","preface"],["","mysql.requirements","section"],["","mysql.installation","section"],["","mysql.configuration","tbody"],["","mysql.configuration","varlistentry"],["","mysql.configuration","varlistentry"],["","mysql.configuration","varlistentry"],["","mysql.configuration","varlistentry"],["","mysql.configuration","varlistentry"],["","mysql.configuration","varlistentry"],["","mysql.configuration","varlistentry"],["","mysql.configuration","varlistentry"],["","mysql.configuration","varlistentry"],["","mysql.configuration","varlistentry"],["","mysql.configuration","varlistentry"],["","mysql.configuration","section"],["","mysql.resources","section"],["","mysql.setup","chapter"],["","changelog.mysql","simplesect"],["","changelog.mysql","simplesect"],["","changelog.mysql","appendix"],["","mysql.constants","table"],["","mysql.constants","appendix"],["","mysql.examples-basic","example"],["","mysql.examples-basic","section"],["","mysql.examples","chapter"],["","ref.mysql","section"],["","function.mysql-affected-rows","example"],["","function.mysql-affected-rows","example"],["mysql_affected_rows","function.mysql-affected-rows","refentry"],["","function.mysql-client-encoding","example"],["mysql_client_encoding","function.mysql-client-encoding","refentry"],["","function.mysql-close","example"],["mysql_close","function.mysql-close","refentry"],["","function.mysql-connect","example"],["","function.mysql-connect","example"],["","function.mysql-connect","example"],["mysql_connect","function.mysql-connect","refentry"],["","function.mysql-create-db","example"],["mysql_create_db","function.mysql-create-db","refentry"],["","function.mysql-data-seek","example"],["mysql_data_seek","function.mysql-data-seek","refentry"],["","function.mysql-db-name","example"],["mysql_db_name","function.mysql-db-name","refentry"],["","function.mysql-db-query","example"],["mysql_db_query","function.mysql-db-query","refentry"],["","function.mysql-drop-db","example"],["mysql_drop_db","function.mysql-drop-db","refentry"],["","function.mysql-errno","example"],["mysql_errno","function.mysql-errno","refentry"],["","function.mysql-error","example"],["mysql_error","function.mysql-error","refentry"],["","function.mysql-escape-string","example"],["mysql_escape_string","function.mysql-escape-string","refentry"],["","function.mysql-fetch-array","example"],["","function.mysql-fetch-array","example"],["","function.mysql-fetch-array","example"],["","function.mysql-fetch-array","example"],["mysql_fetch_array","function.mysql-fetch-array","refentry"],["","function.mysql-fetch-assoc","example"],["mysql_fetch_assoc","function.mysql-fetch-assoc","refentry"],["","function.mysql-fetch-field","example"],["mysql_fetch_field","function.mysql-fetch-field","refentry"],["","function.mysql-fetch-lengths","example"],["mysql_fetch_lengths","function.mysql-fetch-lengths","refentry"],["","function.mysql-fetch-object","example"],["","function.mysql-fetch-object","example"],["mysql_fetch_object","function.mysql-fetch-object","refentry"],["","function.mysql-fetch-row","example"],["mysql_fetch_row","function.mysql-fetch-row","refentry"],["","function.mysql-field-flags","example"],["mysql_field_flags","function.mysql-field-flags","refentry"],["","function.mysql-field-len","example"],["mysql_field_len","function.mysql-field-len","refentry"],["","function.mysql-field-name","example"],["mysql_field_name","function.mysql-field-name","refentry"],["mysql_field_seek","function.mysql-field-seek","refentry"],["","function.mysql-field-table","example"],["mysql_field_table","function.mysql-field-table","refentry"],["","function.mysql-field-type","example"],["mysql_field_type","function.mysql-field-type","refentry"],["","function.mysql-free-result","example"],["mysql_free_result","function.mysql-free-result","refentry"],["","function.mysql-get-client-info","example"],["mysql_get_client_info","function.mysql-get-client-info","refentry"],["","function.mysql-get-host-info","example"],["mysql_get_host_info","function.mysql-get-host-info","refentry"],["","function.mysql-get-proto-info","example"],["mysql_get_proto_info","function.mysql-get-proto-info","refentry"],["","function.mysql-get-server-info","example"],["mysql_get_server_info","function.mysql-get-server-info","refentry"],["","function.mysql-info","example"],["mysql_info","function.mysql-info","refentry"],["","function.mysql-insert-id","example"],["mysql_insert_id","function.mysql-insert-id","refentry"],["","function.mysql-list-dbs","example"],["mysql_list_dbs","function.mysql-list-dbs","refentry"],["","function.mysql-list-fields","example"],["mysql_list_fields","function.mysql-list-fields","refentry"],["","function.mysql-list-processes","example"],["mysql_list_processes","function.mysql-list-processes","refentry"],["","function.mysql-list-tables","example"],["mysql_list_tables","function.mysql-list-tables","refentry"],["","function.mysql-num-fields","example"],["mysql_num_fields","function.mysql-num-fields","refentry"],["","function.mysql-num-rows","example"],["mysql_num_rows","function.mysql-num-rows","refentry"],["mysql_pconnect","function.mysql-pconnect","refentry"],["","function.mysql-ping","example"],["mysql_ping","function.mysql-ping","refentry"],["","function.mysql-query","example"],["","function.mysql-query","example"],["mysql_query","function.mysql-query","refentry"],["","function.mysql-real-escape-string","example"],["","function.mysql-real-escape-string","example"],["mysql_real_escape_string","function.mysql-real-escape-string","refentry"],["","function.mysql-result","example"],["mysql_result","function.mysql-result","refentry"],["","function.mysql-select-db","example"],["mysql_select_db","function.mysql-select-db","refentry"],["mysql_set_charset","function.mysql-set-charset","refentry"],["","function.mysql-stat","example"],["","function.mysql-stat","example"],["mysql_stat","function.mysql-stat","refentry"],["","function.mysql-tablename","example"],["mysql_tablename","function.mysql-tablename","refentry"],["","function.mysql-thread-id","example"],["mysql_thread_id","function.mysql-thread-id","refentry"],["mysql_unbuffered_query","function.mysql-unbuffered-query","refentry"],["","ref.mysql","reference"],["Mysql","book.mysql","book"],["","intro.mysqli","section"],["","intro.mysqli","preface"],["","mysqli.overview","para"],["","mysqli.overview","para"],["","mysqli.overview","chapter"],["","mysqli.quickstart.dual-interface","example"],["","mysqli.quickstart.dual-interface","example"],["","mysqli.quickstart.dual-interface","example"],["","mysqli.quickstart.dual-interface","section"],["","mysqli.quickstart.connections","example"],["","mysqli.quickstart.connections","example"],["","mysqli.quickstart.connections","section"],["","mysqli.quickstart.statements","example"],["","mysqli.quickstart.statements","example"],["","mysqli.quickstart.statements","example"],["","mysqli.quickstart.statements","example"],["","mysqli.quickstart.statements","example"],["","mysqli.quickstart.statements","section"],["","mysqli.quickstart.prepared-statements","example"],["","mysqli.quickstart.prepared-statements","example"],["","mysqli.quickstart.prepared-statements","example"],["","mysqli.quickstart.prepared-statements","example"],["","mysqli.quickstart.prepared-statements","example"],["","mysqli.quickstart.prepared-statements","example"],["","mysqli.quickstart.prepared-statements","example"],["","mysqli.quickstart.prepared-statements","example"],["","mysqli.quickstart.prepared-statements","section"],["","mysqli.quickstart.stored-procedures","example"],["","mysqli.quickstart.stored-procedures","example"],["","mysqli.quickstart.stored-procedures","example"],["","mysqli.quickstart.stored-procedures","example"],["","mysqli.quickstart.stored-procedures","example"],["","mysqli.quickstart.stored-procedures","section"],["","mysqli.quickstart.multiple-statement","example"],["","mysqli.quickstart.multiple-statement","example"],["","mysqli.quickstart.multiple-statement","section"],["","mysqli.quickstart.transactions","example"],["","mysqli.quickstart.transactions","example"],["","mysqli.quickstart.transactions","section"],["","mysqli.quickstart.metadata","example"],["","mysqli.quickstart.metadata","example"],["","mysqli.quickstart.metadata","section"],["","mysqli.quickstart","chapter"],["","mysqli.requirements","section"],["","mysqli.installation","section"],["","mysqli.configuration","tbody"],["","mysqli.configuration","varlistentry"],["","mysqli.configuration","varlistentry"],["","mysqli.configuration","varlistentry"],["","mysqli.configuration","varlistentry"],["","mysqli.configuration","varlistentry"],["","mysqli.configuration","varlistentry"],["","mysqli.configuration","varlistentry"],["","mysqli.configuration","varlistentry"],["","mysqli.configuration","varlistentry"],["","mysqli.configuration","varlistentry"],["","mysqli.configuration","varlistentry"],["","mysqli.configuration","section"],["","mysqli.resources","section"],["","mysqli.setup","chapter"],["","mysqli.persistconns","chapter"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","varlistentry"],["","mysqli.constants","appendix"],["","mysqli.notes","chapter"],["","mysqli.summary","chapter"],["","class.mysqli","section"],["","class.mysqli","section"],["","mysqli.affected-rows","example"],["mysqli::$affected_rows","mysqli.affected-rows","refentry"],["","mysqli.autocommit","example"],["mysqli::autocommit","mysqli.autocommit","refentry"],["mysqli::begin_transaction","mysqli.begin-transaction","refentry"],["","mysqli.change-user","example"],["mysqli::change_user","mysqli.change-user","refentry"],["","mysqli.character-set-name","example"],["mysqli::character_set_name","mysqli.character-set-name","refentry"],["","mysqli.client-info","example"],["mysqli::$client_info","mysqli.client-info","refentry"],["","mysqli.client-version","example"],["mysqli::$client_version","mysqli.client-version","refentry"],["mysqli::close","mysqli.close","refentry"],["","mysqli.commit","example"],["mysqli::commit","mysqli.commit","refentry"],["","mysqli.connect-errno","example"],["mysqli::$connect_errno","mysqli.connect-errno","refentry"],["","mysqli.connect-error","example"],["mysqli::$connect_error","mysqli.connect-error","refentry"],["","mysqli.construct","example"],["mysqli::__construct","mysqli.construct","refentry"],["","mysqli.debug","example"],["mysqli::debug","mysqli.debug","refentry"],["mysqli::dump_debug_info","mysqli.dump-debug-info","refentry"],["","mysqli.errno","example"],["mysqli::$errno","mysqli.errno","refentry"],["","mysqli.error-list","example"],["mysqli::$error_list","mysqli.error-list","refentry"],["","mysqli.error","example"],["mysqli::$error","mysqli.error","refentry"],["","mysqli.field-count","example"],["mysqli::$field_count","mysqli.field-count","refentry"],["","mysqli.get-charset","example"],["mysqli::get_charset","mysqli.get-charset","refentry"],["","mysqli.get-client-info","example"],["mysqli::get_client_info","mysqli.get-client-info","refentry"],["","mysqli.get-client-stats","example"],["mysqli_get_client_stats","mysqli.get-client-stats","refentry"],["","mysqli.get-client-version","example"],["mysqli_get_client_version","mysqli.get-client-version","refentry"],["","mysqli.get-connection-stats","example"],["mysqli::get_connection_stats","mysqli.get-connection-stats","refentry"],["","mysqli.get-host-info","example"],["mysqli::$host_info","mysqli.get-host-info","refentry"],["","mysqli.get-proto-info","example"],["mysqli::$protocol_version","mysqli.get-proto-info","refentry"],["","mysqli.get-server-info","example"],["mysqli::$server_info","mysqli.get-server-info","refentry"],["","mysqli.get-server-version","example"],["mysqli::$server_version","mysqli.get-server-version","refentry"],["mysqli::get_warnings","mysqli.get-warnings","refentry"],["","mysqli.info","example"],["mysqli::$info","mysqli.info","refentry"],["mysqli::init","mysqli.init","refentry"],["","mysqli.insert-id","example"],["mysqli::$insert_id","mysqli.insert-id","refentry"],["","mysqli.kill","example"],["mysqli::kill","mysqli.kill","refentry"],["mysqli::more_results","mysqli.more-results","refentry"],["","mysqli.multi-query","example"],["mysqli::multi_query","mysqli.multi-query","refentry"],["mysqli::next_result","mysqli.next-result","refentry"],["mysqli::options","mysqli.options","refentry"],["","mysqli.ping","example"],["mysqli::ping","mysqli.ping","refentry"],["","mysqli.poll","example"],["mysqli::poll","mysqli.poll","refentry"],["","mysqli.prepare","example"],["mysqli::prepare","mysqli.prepare","refentry"],["","mysqli.query","example"],["mysqli::query","mysqli.query","refentry"],["","mysqli.real-connect","example"],["mysqli::real_connect","mysqli.real-connect","refentry"],["","mysqli.real-escape-string","example"],["mysqli::real_escape_string","mysqli.real-escape-string","refentry"],["mysqli::real_query","mysqli.real-query","refentry"],["mysqli::reap_async_query","mysqli.reap-async-query","refentry"],["mysqli::refresh","mysqli.refresh","refentry"],["mysqli::release_savepoint","mysqli.release-savepoint","refentry"],["","mysqli.rollback","example"],["mysqli::rollback","mysqli.rollback","refentry"],["mysqli::rpl_query_type","mysqli.rpl-query-type","refentry"],["mysqli::savepoint","mysqli.savepoint","refentry"],["","mysqli.select-db","example"],["mysqli::select_db","mysqli.select-db","refentry"],["mysqli::send_query","mysqli.send-query","refentry"],["","mysqli.set-charset","example"],["mysqli::set_charset","mysqli.set-charset","refentry"],["mysqli::set_local_infile_default","mysqli.set-local-infile-default","refentry"],["","mysqli.set-local-infile-handler","example"],["mysqli::set_local_infile_handler","mysqli.set-local-infile-handler","refentry"],["","mysqli.sqlstate","example"],["mysqli::$sqlstate","mysqli.sqlstate","refentry"],["mysqli::ssl_set","mysqli.ssl-set","refentry"],["","mysqli.stat","example"],["mysqli::stat","mysqli.stat","refentry"],["mysqli::stmt_init","mysqli.stmt-init","refentry"],["mysqli::store_result","mysqli.store-result","refentry"],["","mysqli.thread-id","example"],["mysqli::$thread_id","mysqli.thread-id","refentry"],["mysqli::thread_safe","mysqli.thread-safe","refentry"],["","mysqli.use-result","example"],["mysqli::use_result","mysqli.use-result","refentry"],["","mysqli.warning-count","example"],["mysqli::$warning_count","mysqli.warning-count","refentry"],["mysqli","class.mysqli","phpdoc:classref"],["","class.mysqli-stmt","section"],["","class.mysqli-stmt","section"],["","mysqli-stmt.affected-rows","example"],["","mysqli-stmt.affected-rows","example"],["mysqli_stmt::$affected_rows","mysqli-stmt.affected-rows","refentry"],["mysqli_stmt::attr_get","mysqli-stmt.attr-get","refentry"],["mysqli_stmt::attr_set","mysqli-stmt.attr-set","refentry"],["","mysqli-stmt.bind-param","example"],["","mysqli-stmt.bind-param","example"],["mysqli_stmt::bind_param","mysqli-stmt.bind-param","refentry"],["","mysqli-stmt.bind-result","example"],["","mysqli-stmt.bind-result","example"],["mysqli_stmt::bind_result","mysqli-stmt.bind-result","refentry"],["mysqli_stmt::close","mysqli-stmt.close","refentry"],["","mysqli-stmt.data-seek","example"],["","mysqli-stmt.data-seek","example"],["mysqli_stmt::data_seek","mysqli-stmt.data-seek","refentry"],["","mysqli-stmt.errno","example"],["","mysqli-stmt.errno","example"],["mysqli_stmt::$errno","mysqli-stmt.errno","refentry"],["","mysqli-stmt.error-list","example"],["","mysqli-stmt.error-list","example"],["mysqli_stmt::$error_list","mysqli-stmt.error-list","refentry"],["","mysqli-stmt.error","example"],["","mysqli-stmt.error","example"],["mysqli_stmt::$error","mysqli-stmt.error","refentry"],["","mysqli-stmt.execute","example"],["","mysqli-stmt.execute","example"],["mysqli_stmt::execute","mysqli-stmt.execute","refentry"],["","mysqli-stmt.fetch","example"],["","mysqli-stmt.fetch","example"],["mysqli_stmt::fetch","mysqli-stmt.fetch","refentry"],["mysqli_stmt::$field_count","mysqli-stmt.field-count","refentry"],["mysqli_stmt::free_result","mysqli-stmt.free-result","refentry"],["","mysqli-stmt.get-result","example"],["","mysqli-stmt.get-result","example"],["mysqli_stmt::get_result","mysqli-stmt.get-result","refentry"],["mysqli_stmt::get_warnings","mysqli-stmt.get-warnings","refentry"],["mysqli_stmt::$insert_id","mysqli-stmt.insert-id","refentry"],["mysqli_stmt::more_results","mysqli-stmt.more-results","refentry"],["mysqli_stmt::next_result","mysqli-stmt.next-result","refentry"],["","mysqli-stmt.num-rows","example"],["","mysqli-stmt.num-rows","example"],["mysqli_stmt::$num_rows","mysqli-stmt.num-rows","refentry"],["","mysqli-stmt.param-count","example"],["","mysqli-stmt.param-count","example"],["mysqli_stmt::$param_count","mysqli-stmt.param-count","refentry"],["","mysqli-stmt.prepare","example"],["","mysqli-stmt.prepare","example"],["mysqli_stmt::prepare","mysqli-stmt.prepare","refentry"],["mysqli_stmt::reset","mysqli-stmt.reset","refentry"],["","mysqli-stmt.result-metadata","example"],["","mysqli-stmt.result-metadata","example"],["mysqli_stmt::result_metadata","mysqli-stmt.result-metadata","refentry"],["","mysqli-stmt.send-long-data","example"],["mysqli_stmt::send_long_data","mysqli-stmt.send-long-data","refentry"],["","mysqli-stmt.sqlstate","example"],["","mysqli-stmt.sqlstate","example"],["mysqli_stmt::$sqlstate","mysqli-stmt.sqlstate","refentry"],["","mysqli-stmt.store-result","example"],["","mysqli-stmt.store-result","example"],["mysqli_stmt::store_result","mysqli-stmt.store-result","refentry"],["mysqli_stmt","class.mysqli-stmt","phpdoc:classref"],["","class.mysqli-result","section"],["","class.mysqli-result","section"],["","mysqli-result.current-field","example"],["","mysqli-result.current-field","example"],["mysqli_result::$current_field","mysqli-result.current-field","refentry"],["","mysqli-result.data-seek","example"],["","mysqli-result.data-seek","example"],["mysqli_result::data_seek","mysqli-result.data-seek","refentry"],["mysqli_result::fetch_all","mysqli-result.fetch-all","refentry"],["","mysqli-result.fetch-array","example"],["","mysqli-result.fetch-array","example"],["mysqli_result::fetch_array","mysqli-result.fetch-array","refentry"],["","mysqli-result.fetch-assoc","example"],["","mysqli-result.fetch-assoc","example"],["","mysqli-result.fetch-assoc","example"],["mysqli_result::fetch_assoc","mysqli-result.fetch-assoc","refentry"],["","mysqli-result.fetch-field-direct","example"],["","mysqli-result.fetch-field-direct","example"],["mysqli_result::fetch_field_direct","mysqli-result.fetch-field-direct","refentry"],["","mysqli-result.fetch-field","example"],["","mysqli-result.fetch-field","example"],["mysqli_result::fetch_field","mysqli-result.fetch-field","refentry"],["","mysqli-result.fetch-fields","example"],["","mysqli-result.fetch-fields","example"],["mysqli_result::fetch_fields","mysqli-result.fetch-fields","refentry"],["","mysqli-result.fetch-object","example"],["","mysqli-result.fetch-object","example"],["mysqli_result::fetch_object","mysqli-result.fetch-object","refentry"],["","mysqli-result.fetch-row","example"],["","mysqli-result.fetch-row","example"],["mysqli_result::fetch_row","mysqli-result.fetch-row","refentry"],["","mysqli-result.field-count","example"],["","mysqli-result.field-count","example"],["mysqli_result::$field_count","mysqli-result.field-count","refentry"],["","mysqli-result.field-seek","example"],["","mysqli-result.field-seek","example"],["mysqli_result::field_seek","mysqli-result.field-seek","refentry"],["mysqli_result::free","mysqli-result.free","refentry"],["","mysqli-result.lengths","example"],["","mysqli-result.lengths","example"],["mysqli_result::$lengths","mysqli-result.lengths","refentry"],["","mysqli-result.num-rows","example"],["","mysqli-result.num-rows","example"],["mysqli_result::$num_rows","mysqli-result.num-rows","refentry"],["mysqli_result","class.mysqli-result","phpdoc:classref"],["","class.mysqli-driver","section"],["","class.mysqli-driver","section"],["","class.mysqli-driver","varlistentry"],["","class.mysqli-driver","varlistentry"],["","class.mysqli-driver","varlistentry"],["","class.mysqli-driver","varlistentry"],["","class.mysqli-driver","varlistentry"],["","class.mysqli-driver","varlistentry"],["","class.mysqli-driver","section"],["mysqli_driver::embedded_server_end","mysqli-driver.embedded-server-end","refentry"],["mysqli_driver::embedded_server_start","mysqli-driver.embedded-server-start","refentry"],["","mysqli-driver.report-mode","example"],["","mysqli-driver.report-mode","example"],["mysqli_driver::$report_mode","mysqli-driver.report-mode","refentry"],["mysqli_driver","class.mysqli-driver","phpdoc:classref"],["","class.mysqli-warning","section"],["","class.mysqli-warning","section"],["","class.mysqli-warning","varlistentry"],["","class.mysqli-warning","varlistentry"],["","class.mysqli-warning","varlistentry"],["","class.mysqli-warning","section"],["mysqli_warning::__construct","mysqli-warning.construct","refentry"],["mysqli_warning::next","mysqli-warning.next","refentry"],["mysqli_warning","class.mysqli-warning","phpdoc:classref"],["","class.mysqli-sql-exception","section"],["","class.mysqli-sql-exception","section"],["","class.mysqli-sql-exception","varlistentry"],["","class.mysqli-sql-exception","section"],["mysqli_sql_exception","class.mysqli-sql-exception","phpdoc:classref"],["mysqli_bind_param","function.mysqli-bind-param","refentry"],["mysqli_bind_result","function.mysqli-bind-result","refentry"],["mysqli_client_encoding","function.mysqli-client-encoding","refentry"],["mysqli_connect","function.mysqli-connect","refentry"],["mysqli::disable_reads_from_master","function.mysqli-disable-reads-from-master","refentry"],["mysqli_disable_rpl_parse","function.mysqli-disable-rpl-parse","refentry"],["mysqli_enable_reads_from_master","function.mysqli-enable-reads-from-master","refentry"],["mysqli_enable_rpl_parse","function.mysqli-enable-rpl-parse","refentry"],["mysqli_escape_string","function.mysqli-escape-string","refentry"],["mysqli_execute","function.mysqli-execute","refentry"],["mysqli_fetch","function.mysqli-fetch","refentry"],["","function.mysqli-get-cache-stats","example"],["mysqli_get_cache_stats","function.mysqli-get-cache-stats","refentry"],["mysqli_get_metadata","function.mysqli-get-metadata","refentry"],["mysqli_master_query","function.mysqli-master-query","refentry"],["mysqli_param_count","function.mysqli-param-count","refentry"],["mysqli_report","function.mysqli-report","refentry"],["mysqli_rpl_parse_enabled","function.mysqli-rpl-parse-enabled","refentry"],["mysqli_rpl_probe","function.mysqli-rpl-probe","refentry"],["mysqli_send_long_data","function.mysqli-send-long-data","refentry"],["mysqli::set_opt","function.mysqli-set-opt","refentry"],["mysqli_slave_query","function.mysqli-slave-query","refentry"],["","ref.mysqli","reference"],["","changelog.mysqli","appendix"],["Mysqli","book.mysqli","book"],["","intro.mysqlnd","preface"],["","mysqlnd.overview","chapter"],["","mysqlnd.install","chapter"],["","mysqlnd.config","varlistentry"],["","mysqlnd.config","varlistentry"],["","mysqlnd.config","varlistentry"],["","mysqlnd.config","varlistentry"],["","mysqlnd.config","varlistentry"],["","mysqlnd.config","varlistentry"],["","mysqlnd.config","varlistentry"],["","mysqlnd.config","varlistentry"],["","mysqlnd.config","varlistentry"],["","mysqlnd.config","chapter"],["","mysqlnd.incompatibilities","chapter"],["","mysqlnd.persist","chapter"],["","mysqlnd.stats","chapter"],["","mysqlnd.notes","chapter"],["","mysqlnd.plugin.mysql-proxy","section"],["","mysqlnd.plugin.obtaining","section"],["","mysqlnd.plugin.architecture","section"],["","mysqlnd.plugin.api","section"],["","mysqlnd.plugin.developing","section"],["","mysqlnd.plugin","chapter"],["Mysqlnd","book.mysqlnd","book"],["","intro.mysqlnd-ms","section"],["","intro.mysqlnd-ms","section"],["","intro.mysqlnd-ms","section"],["","intro.mysqlnd-ms","preface"],["","mysqlnd-ms.quickstart.configuration","example"],["","mysqlnd-ms.quickstart.configuration","example"],["","mysqlnd-ms.quickstart.configuration","example"],["","mysqlnd-ms.quickstart.configuration","example"],["","mysqlnd-ms.quickstart.configuration","section"],["","mysqlnd-ms.quickstart.usage","example"],["","mysqlnd-ms.quickstart.usage","example"],["","mysqlnd-ms.quickstart.usage","example"],["","mysqlnd-ms.quickstart.usage","section"],["","mysqlnd-ms.quickstart.connectionpooling","example"],["","mysqlnd-ms.quickstart.connectionpooling","example"],["","mysqlnd-ms.quickstart.connectionpooling","section"],["","mysqlnd-ms.quickstart.sqlhints","example"],["","mysqlnd-ms.quickstart.sqlhints","example"],["","mysqlnd-ms.quickstart.sqlhints","example"],["","mysqlnd-ms.quickstart.sqlhints","example"],["","mysqlnd-ms.quickstart.sqlhints","section"],["","mysqlnd-ms.quickstart.transactions","example"],["","mysqlnd-ms.quickstart.transactions","example"],["","mysqlnd-ms.quickstart.transactions","example"],["","mysqlnd-ms.quickstart.transactions","example"],["","mysqlnd-ms.quickstart.transactions","section"],["","mysqlnd-ms.quickstart.qos-consistency","example"],["","mysqlnd-ms.quickstart.qos-consistency","example"],["","mysqlnd-ms.quickstart.qos-consistency","example"],["","mysqlnd-ms.quickstart.qos-consistency","example"],["","mysqlnd-ms.quickstart.qos-consistency","example"],["","mysqlnd-ms.quickstart.qos-consistency","example"],["","mysqlnd-ms.quickstart.qos-consistency","section"],["","mysqlnd-ms.quickstart.gtid","example"],["","mysqlnd-ms.quickstart.gtid","example"],["","mysqlnd-ms.quickstart.gtid","example"],["","mysqlnd-ms.quickstart.gtid","example"],["","mysqlnd-ms.quickstart.gtid","example"],["","mysqlnd-ms.quickstart.gtid","example"],["","mysqlnd-ms.quickstart.gtid","example"],["","mysqlnd-ms.quickstart.gtid","example"],["","mysqlnd-ms.quickstart.gtid","section"],["","mysqlnd-ms.quickstart.cache","example"],["","mysqlnd-ms.quickstart.cache","example"],["","mysqlnd-ms.quickstart.cache","example"],["","mysqlnd-ms.quickstart.cache","example"],["","mysqlnd-ms.quickstart.cache","section"],["","mysqlnd-ms.quickstart.failover","example"],["","mysqlnd-ms.quickstart.failover","example"],["","mysqlnd-ms.quickstart.failover","section"],["","mysqlnd-ms.quickstart.partitioning","example"],["","mysqlnd-ms.quickstart.partitioning","example"],["","mysqlnd-ms.quickstart.partitioning","section"],["","mysqlnd-ms.quickstart","chapter"],["","mysqlnd-ms.architecture","section"],["","mysqlnd-ms.pooling","section"],["","mysqlnd-ms.transaction","section"],["","mysqlnd-ms.errorhandling","example"],["","mysqlnd-ms.errorhandling","example"],["","mysqlnd-ms.errorhandling","example"],["","mysqlnd-ms.errorhandling","example"],["","mysqlnd-ms.errorhandling","section"],["","mysqlnd-ms.transient_errors","example"],["","mysqlnd-ms.transient_errors","example"],["","mysqlnd-ms.transient_errors","section"],["","mysqlnd-ms.failover","section"],["","mysqlnd-ms.loadbalancing","section"],["","mysqlnd-ms.rwsplit","section"],["","mysqlnd-ms.filter","section"],["","mysqlnd-ms.qos-consistency","section"],["","mysqlnd-ms.gtid","section"],["","mysqlnd-ms.concept_cache","section"],["","mysqlnd-ms.supportedclusters","example"],["","mysqlnd-ms.supportedclusters","example"],["","mysqlnd-ms.supportedclusters","example"],["","mysqlnd-ms.supportedclusters","example"],["","mysqlnd-ms.supportedclusters","example"],["","mysqlnd-ms.supportedclusters","example"],["","mysqlnd-ms.supportedclusters","section"],["","mysqlnd-ms.concepts","chapter"],["","mysqlnd-ms.requirements","section"],["","mysqlnd-ms.installation","section"],["","mysqlnd-ms.configuration","tbody"],["","mysqlnd-ms.configuration","varlistentry"],["","mysqlnd-ms.configuration","varlistentry"],["","mysqlnd-ms.configuration","varlistentry"],["","mysqlnd-ms.configuration","varlistentry"],["","mysqlnd-ms.configuration","varlistentry"],["","mysqlnd-ms.configuration","varlistentry"],["","mysqlnd-ms.configuration","varlistentry"],["","mysqlnd-ms.configuration","section"],["","mysqlnd-ms.plugin-ini-json","example"],["","mysqlnd-ms.plugin-ini-json","example"],["","mysqlnd-ms.plugin-ini-json","para"],["","mysqlnd-ms.plugin-ini-json","para"],["","mysqlnd-ms.plugin-ini-json","example"],["","mysqlnd-ms.plugin-ini-json","example"],["","mysqlnd-ms.plugin-ini-json","example"],["","mysqlnd-ms.plugin-ini-json","example"],["","mysqlnd-ms.plugin-ini-json","example"],["","mysqlnd-ms.plugin-ini-json","para"],["","mysqlnd-ms.plugin-ini-json","example"],["","mysqlnd-ms.plugin-ini-json","example"],["","mysqlnd-ms.plugin-ini-json","example"],["","mysqlnd-ms.plugin-ini-json","para"],["","mysqlnd-ms.plugin-ini-json","varlistentry"],["","mysqlnd-ms.plugin-ini-json","varlistentry"],["","mysqlnd-ms.plugin-ini-json","varlistentry"],["","mysqlnd-ms.plugin-ini-json","example"],["","mysqlnd-ms.plugin-ini-json","varlistentry"],["","mysqlnd-ms.plugin-ini-json","example"],["","mysqlnd-ms.plugin-ini-json","example"],["","mysqlnd-ms.plugin-ini-json","example"],["","mysqlnd-ms.plugin-ini-json","example"],["","mysqlnd-ms.plugin-ini-json","varlistentry"],["","mysqlnd-ms.plugin-ini-json","example"],["","mysqlnd-ms.plugin-ini-json","varlistentry"],["","mysqlnd-ms.plugin-ini-json","example"],["","mysqlnd-ms.plugin-ini-json","example"],["","mysqlnd-ms.plugin-ini-json","varlistentry"],["","mysqlnd-ms.plugin-ini-json","example"],["","mysqlnd-ms.plugin-ini-json","varlistentry"],["","mysqlnd-ms.plugin-ini-json","example"],["","mysqlnd-ms.plugin-ini-json","varlistentry"],["","mysqlnd-ms.plugin-ini-json","example"],["","mysqlnd-ms.plugin-ini-json","varlistentry"],["","mysqlnd-ms.plugin-ini-json","example"],["","mysqlnd-ms.plugin-ini-json","example"],["","mysqlnd-ms.plugin-ini-json","varlistentry"],["","mysqlnd-ms.plugin-ini-json","example"],["","mysqlnd-ms.plugin-ini-json","varlistentry"],["","mysqlnd-ms.plugin-ini-json","example"],["","mysqlnd-ms.plugin-ini-json","varlistentry"],["","mysqlnd-ms.plugin-ini-json","example"],["","mysqlnd-ms.plugin-ini-json","varlistentry"],["","mysqlnd-ms.plugin-ini-json","example"],["","mysqlnd-ms.plugin-ini-json","example"],["","mysqlnd-ms.plugin-ini-json","varlistentry"],["","mysqlnd-ms.plugin-ini-json","example"],["","mysqlnd-ms.plugin-ini-json","varlistentry"],["","mysqlnd-ms.plugin-ini-json","section"],["","mysqlnd-ms.plugin-ini-v1","example"],["","mysqlnd-ms.plugin-ini-v1","example"],["","mysqlnd-ms.plugin-ini-v1","varlistentry"],["","mysqlnd-ms.plugin-ini-v1","varlistentry"],["","mysqlnd-ms.plugin-ini-v1","varlistentry"],["","mysqlnd-ms.plugin-ini-v1","varlistentry"],["","mysqlnd-ms.plugin-ini-v1","varlistentry"],["","mysqlnd-ms.plugin-ini-v1","varlistentry"],["","mysqlnd-ms.plugin-ini-v1","varlistentry"],["","mysqlnd-ms.plugin-ini-v1","section"],["","mysqlnd-ms.testing","section"],["","mysqlnd-ms.debugging","section"],["","mysqlnd-ms.monitoring","example"],["","mysqlnd-ms.monitoring","example"],["","mysqlnd-ms.monitoring","section"],["","mysqlnd-ms.setup","chapter"],["","mysqlnd-ms.constants","example"],["","mysqlnd-ms.constants","varlistentry"],["","mysqlnd-ms.constants","varlistentry"],["","mysqlnd-ms.constants","varlistentry"],["","mysqlnd-ms.constants","varlistentry"],["","mysqlnd-ms.constants","varlistentry"],["","mysqlnd-ms.constants","varlistentry"],["","mysqlnd-ms.constants","varlistentry"],["","mysqlnd-ms.constants","varlistentry"],["","mysqlnd-ms.constants","varlistentry"],["","mysqlnd-ms.constants","varlistentry"],["","mysqlnd-ms.constants","varlistentry"],["","mysqlnd-ms.constants","varlistentry"],["","mysqlnd-ms.constants","varlistentry"],["","mysqlnd-ms.constants","appendix"],["","function.mysqlnd-ms-get-last-gtid","example"],["mysqlnd_ms_get_last_gtid","function.mysqlnd-ms-get-last-gtid","refentry"],["","function.mysqlnd-ms-get-last-used-connection","example"],["mysqlnd_ms_get_last_used_connection","function.mysqlnd-ms-get-last-used-connection","refentry"],["","function.mysqlnd-ms-get-stats","example"],["mysqlnd_ms_get_stats","function.mysqlnd-ms-get-stats","refentry"],["","function.mysqlnd-ms-match-wild","example"],["mysqlnd_ms_match_wild","function.mysqlnd-ms-match-wild","refentry"],["","function.mysqlnd-ms-query-is-select","example"],["mysqlnd_ms_query_is_select","function.mysqlnd-ms-query-is-select","refentry"],["","function.mysqlnd-ms-set-qos","example"],["mysqlnd_ms_set_qos","function.mysqlnd-ms-set-qos","refentry"],["","function.mysqlnd-ms-set-user-pick-server","example"],["mysqlnd_ms_set_user_pick_server","function.mysqlnd-ms-set-user-pick-server","refentry"],["","ref.mysqlnd-ms","reference"],["","mysqlnd-ms.changes-one-six","section"],["","mysqlnd-ms.changes-one-five","section"],["","mysqlnd-ms.changes-one-four","section"],["","mysqlnd-ms.changes-one-three","section"],["","mysqlnd-ms.changes-one-two","section"],["","mysqlnd-ms.changes-one-one","section"],["","mysqlnd-ms.changes-one-o","section"],["","mysqlnd-ms.changes","chapter"],["mysqlnd_ms","book.mysqlnd-ms","book"],["","intro.mysqlnd-qc","section"],["","intro.mysqlnd-qc","section"],["","intro.mysqlnd-qc","section"],["","intro.mysqlnd-qc","preface"],["","mysqlnd-qc.quickstart.concepts","section"],["","mysqlnd-qc.quickstart.configuration","example"],["","mysqlnd-qc.quickstart.configuration","section"],["","mysqlnd-qc.quickstart.caching","example"],["","mysqlnd-qc.quickstart.caching","example"],["","mysqlnd-qc.quickstart.caching","example"],["","mysqlnd-qc.quickstart.caching","example"],["","mysqlnd-qc.quickstart.caching","section"],["","mysqlnd-qc.per-query-ttl","example"],["","mysqlnd-qc.per-query-ttl","example"],["","mysqlnd-qc.per-query-ttl","section"],["","mysqlnd-qc.pattern-based-caching","example"],["","mysqlnd-qc.pattern-based-caching","section"],["","mysqlnd-qc.slam-defense","example"],["","mysqlnd-qc.slam-defense","section"],["","mysqlnd-qc.cache-candidates","example"],["","mysqlnd-qc.cache-candidates","example"],["","mysqlnd-qc.cache-candidates","section"],["","mysqlnd-qc.cache-efficiency","example"],["","mysqlnd-qc.cache-efficiency","example"],["","mysqlnd-qc.cache-efficiency","example"],["","mysqlnd-qc.cache-efficiency","section"],["","mysqlnd-qc.set-user-handlers","example"],["","mysqlnd-qc.set-user-handlers","section"],["","mysqlnd-qc.quickstart","chapter"],["","mysqlnd-qc.requirements","section"],["","mysqlnd-qc.installation","section"],["","mysqlnd-qc.configuration","tbody"],["","mysqlnd-qc.configuration","varlistentry"],["","mysqlnd-qc.configuration","varlistentry"],["","mysqlnd-qc.configuration","varlistentry"],["","mysqlnd-qc.configuration","varlistentry"],["","mysqlnd-qc.configuration","varlistentry"],["","mysqlnd-qc.configuration","varlistentry"],["","mysqlnd-qc.configuration","varlistentry"],["","mysqlnd-qc.configuration","varlistentry"],["","mysqlnd-qc.configuration","varlistentry"],["","mysqlnd-qc.configuration","varlistentry"],["","mysqlnd-qc.configuration","varlistentry"],["","mysqlnd-qc.configuration","varlistentry"],["","mysqlnd-qc.configuration","varlistentry"],["","mysqlnd-qc.configuration","varlistentry"],["","mysqlnd-qc.configuration","varlistentry"],["","mysqlnd-qc.configuration","varlistentry"],["","mysqlnd-qc.configuration","varlistentry"],["","mysqlnd-qc.configuration","varlistentry"],["","mysqlnd-qc.configuration","varlistentry"],["","mysqlnd-qc.configuration","section"],["","mysqlnd-qc.setup","chapter"],["","mysqlnd-qc.constants","example"],["","mysqlnd-qc.constants","varlistentry"],["","mysqlnd-qc.constants","varlistentry"],["","mysqlnd-qc.constants","varlistentry"],["","mysqlnd-qc.constants","varlistentry"],["","mysqlnd-qc.constants","example"],["","mysqlnd-qc.constants","varlistentry"],["","mysqlnd-qc.constants","varlistentry"],["","mysqlnd-qc.constants","varlistentry"],["","mysqlnd-qc.constants","appendix"],["mysqlnd_qc_clear_cache","function.mysqlnd-qc-clear-cache","refentry"],["","function.mysqlnd-qc-get-available-handlers","example"],["mysqlnd_qc_get_available_handlers","function.mysqlnd-qc-get-available-handlers","refentry"],["","function.mysqlnd-qc-get-cache-info","example"],["mysqlnd_qc_get_cache_info","function.mysqlnd-qc-get-cache-info","refentry"],["","function.mysqlnd-qc-get-core-stats","example"],["mysqlnd_qc_get_core_stats","function.mysqlnd-qc-get-core-stats","refentry"],["","function.mysqlnd-qc-get-normalized-query-trace-log","example"],["mysqlnd_qc_get_normalized_query_trace_log","function.mysqlnd-qc-get-normalized-query-trace-log","refentry"],["","function.mysqlnd-qc-get-query-trace-log","example"],["mysqlnd_qc_get_query_trace_log","function.mysqlnd-qc-get-query-trace-log","refentry"],["","function.mysqlnd-qc-set-cache-condition","example"],["mysqlnd_qc_set_cache_condition","function.mysqlnd-qc-set-cache-condition","refentry"],["","function.mysqlnd-qc-set-is-select","example"],["mysqlnd_qc_set_is_select","function.mysqlnd-qc-set-is-select","refentry"],["","function.mysqlnd-qc-set-storage-handler","example"],["mysqlnd_qc_set_storage_handler","function.mysqlnd-qc-set-storage-handler","refentry"],["mysqlnd_qc_set_user_handlers","function.mysqlnd-qc-set-user-handlers","refentry"],["","ref.mysqlnd-qc","reference"],["","mysqlnd-qc.changes-one-two","section"],["","mysqlnd-qc.changes-one-one","section"],["","mysqlnd-qc.changes-one-o","section"],["","mysqlnd-qc.changes","chapter"],["mysqlnd_qc","book.mysqlnd-qc","book"],["","intro.mysqlnd-uh","section"],["","intro.mysqlnd-uh","section"],["","intro.mysqlnd-uh","section"],["","intro.mysqlnd-uh","preface"],["","mysqlnd-uh.quickstart.configuration","example"],["","mysqlnd-uh.quickstart.configuration","section"],["","mysqlnd-uh.quickstart.how-it-works","example"],["","mysqlnd-uh.quickstart.how-it-works","example"],["","mysqlnd-uh.quickstart.how-it-works","section"],["","mysqlnd-uh.quickstart.proxy-installation","example"],["","mysqlnd-uh.quickstart.proxy-installation","example"],["","mysqlnd-uh.quickstart.proxy-installation","example"],["","mysqlnd-uh.quickstart.proxy-installation","example"],["","mysqlnd-uh.quickstart.proxy-installation","section"],["","mysqlnd-uh.quickstart.query-monitoring","example"],["","mysqlnd-uh.quickstart.query-monitoring","section"],["","mysqlnd-uh.quickstart","chapter"],["","mysqlnd-uh.requirements","section"],["","mysqlnd-uh.installation","section"],["","mysqlnd-uh.configuration","tbody"],["","mysqlnd-uh.configuration","varlistentry"],["","mysqlnd-uh.configuration","varlistentry"],["","mysqlnd-uh.configuration","section"],["","mysqlnd-uh.resources","section"],["","mysqlnd-uh.setup","chapter"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","varlistentry"],["","mysqlnd-uh.constants","appendix"],["","class.mysqlnduhconnection","section"],["","class.mysqlnduhconnection","section"],["","mysqlnduhconnection.changeuser","example"],["MysqlndUhConnection::changeUser","mysqlnduhconnection.changeuser","refentry"],["","mysqlnduhconnection.charsetname","example"],["MysqlndUhConnection::charsetName","mysqlnduhconnection.charsetname","refentry"],["","mysqlnduhconnection.close","example"],["MysqlndUhConnection::close","mysqlnduhconnection.close","refentry"],["","mysqlnduhconnection.connect","example"],["MysqlndUhConnection::connect","mysqlnduhconnection.connect","refentry"],["MysqlndUhConnection::__construct","mysqlnduhconnection.construct","refentry"],["","mysqlnduhconnection.endpsession","example"],["MysqlndUhConnection::endPSession","mysqlnduhconnection.endpsession","refentry"],["","mysqlnduhconnection.escapestring","example"],["MysqlndUhConnection::escapeString","mysqlnduhconnection.escapestring","refentry"],["","mysqlnduhconnection.getaffectedrows","example"],["MysqlndUhConnection::getAffectedRows","mysqlnduhconnection.getaffectedrows","refentry"],["","mysqlnduhconnection.geterrornumber","example"],["MysqlndUhConnection::getErrorNumber","mysqlnduhconnection.geterrornumber","refentry"],["","mysqlnduhconnection.geterrorstring","example"],["MysqlndUhConnection::getErrorString","mysqlnduhconnection.geterrorstring","refentry"],["","mysqlnduhconnection.getfieldcount","example"],["MysqlndUhConnection::getFieldCount","mysqlnduhconnection.getfieldcount","refentry"],["","mysqlnduhconnection.gethostinformation","example"],["MysqlndUhConnection::getHostInformation","mysqlnduhconnection.gethostinformation","refentry"],["","mysqlnduhconnection.getlastinsertid","example"],["MysqlndUhConnection::getLastInsertId","mysqlnduhconnection.getlastinsertid","refentry"],["","mysqlnduhconnection.getlastmessage","example"],["MysqlndUhConnection::getLastMessage","mysqlnduhconnection.getlastmessage","refentry"],["","mysqlnduhconnection.getprotocolinformation","example"],["MysqlndUhConnection::getProtocolInformation","mysqlnduhconnection.getprotocolinformation","refentry"],["","mysqlnduhconnection.getserverinformation","example"],["MysqlndUhConnection::getServerInformation","mysqlnduhconnection.getserverinformation","refentry"],["","mysqlnduhconnection.getserverstatistics","example"],["MysqlndUhConnection::getServerStatistics","mysqlnduhconnection.getserverstatistics","refentry"],["","mysqlnduhconnection.getserverversion","example"],["MysqlndUhConnection::getServerVersion","mysqlnduhconnection.getserverversion","refentry"],["","mysqlnduhconnection.getsqlstate","example"],["MysqlndUhConnection::getSqlstate","mysqlnduhconnection.getsqlstate","refentry"],["","mysqlnduhconnection.getstatistics","example"],["MysqlndUhConnection::getStatistics","mysqlnduhconnection.getstatistics","refentry"],["","mysqlnduhconnection.getthreadid","example"],["MysqlndUhConnection::getThreadId","mysqlnduhconnection.getthreadid","refentry"],["","mysqlnduhconnection.getwarningcount","example"],["MysqlndUhConnection::getWarningCount","mysqlnduhconnection.getwarningcount","refentry"],["","mysqlnduhconnection.init","example"],["MysqlndUhConnection::init","mysqlnduhconnection.init","refentry"],["","mysqlnduhconnection.killconnection","example"],["MysqlndUhConnection::killConnection","mysqlnduhconnection.killconnection","refentry"],["","mysqlnduhconnection.listfields","example"],["MysqlndUhConnection::listFields","mysqlnduhconnection.listfields","refentry"],["","mysqlnduhconnection.listmethod","example"],["MysqlndUhConnection::listMethod","mysqlnduhconnection.listmethod","refentry"],["","mysqlnduhconnection.moreresults","example"],["MysqlndUhConnection::moreResults","mysqlnduhconnection.moreresults","refentry"],["","mysqlnduhconnection.nextresult","example"],["MysqlndUhConnection::nextResult","mysqlnduhconnection.nextresult","refentry"],["","mysqlnduhconnection.ping","example"],["MysqlndUhConnection::ping","mysqlnduhconnection.ping","refentry"],["","mysqlnduhconnection.query","example"],["MysqlndUhConnection::query","mysqlnduhconnection.query","refentry"],["","mysqlnduhconnection.queryreadresultsetheader","example"],["MysqlndUhConnection::queryReadResultsetHeader","mysqlnduhconnection.queryreadresultsetheader","refentry"],["","mysqlnduhconnection.reapquery","example"],["MysqlndUhConnection::reapQuery","mysqlnduhconnection.reapquery","refentry"],["","mysqlnduhconnection.refreshserver","example"],["MysqlndUhConnection::refreshServer","mysqlnduhconnection.refreshserver","refentry"],["","mysqlnduhconnection.restartpsession","example"],["MysqlndUhConnection::restartPSession","mysqlnduhconnection.restartpsession","refentry"],["","mysqlnduhconnection.selectdb","example"],["MysqlndUhConnection::selectDb","mysqlnduhconnection.selectdb","refentry"],["","mysqlnduhconnection.sendclose","example"],["MysqlndUhConnection::sendClose","mysqlnduhconnection.sendclose","refentry"],["","mysqlnduhconnection.sendquery","example"],["MysqlndUhConnection::sendQuery","mysqlnduhconnection.sendquery","refentry"],["","mysqlnduhconnection.serverdumpdebuginformation","example"],["MysqlndUhConnection::serverDumpDebugInformation","mysqlnduhconnection.serverdumpdebuginformation","refentry"],["","mysqlnduhconnection.setautocommit","example"],["MysqlndUhConnection::setAutocommit","mysqlnduhconnection.setautocommit","refentry"],["","mysqlnduhconnection.setcharset","example"],["MysqlndUhConnection::setCharset","mysqlnduhconnection.setcharset","refentry"],["","mysqlnduhconnection.setclientoption","example"],["MysqlndUhConnection::setClientOption","mysqlnduhconnection.setclientoption","refentry"],["","mysqlnduhconnection.setserveroption","example"],["MysqlndUhConnection::setServerOption","mysqlnduhconnection.setserveroption","refentry"],["MysqlndUhConnection::shutdownServer","mysqlnduhconnection.shutdownserver","refentry"],["","mysqlnduhconnection.simplecommand","example"],["MysqlndUhConnection::simpleCommand","mysqlnduhconnection.simplecommand","refentry"],["","mysqlnduhconnection.simplecommandhandleresponse","example"],["MysqlndUhConnection::simpleCommandHandleResponse","mysqlnduhconnection.simplecommandhandleresponse","refentry"],["","mysqlnduhconnection.sslset","example"],["MysqlndUhConnection::sslSet","mysqlnduhconnection.sslset","refentry"],["","mysqlnduhconnection.stmtinit","example"],["MysqlndUhConnection::stmtInit","mysqlnduhconnection.stmtinit","refentry"],["","mysqlnduhconnection.storeresult","example"],["MysqlndUhConnection::storeResult","mysqlnduhconnection.storeresult","refentry"],["","mysqlnduhconnection.txcommit","example"],["MysqlndUhConnection::txCommit","mysqlnduhconnection.txcommit","refentry"],["","mysqlnduhconnection.txrollback","example"],["MysqlndUhConnection::txRollback","mysqlnduhconnection.txrollback","refentry"],["","mysqlnduhconnection.useresult","example"],["MysqlndUhConnection::useResult","mysqlnduhconnection.useresult","refentry"],["MysqlndUhConnection","class.mysqlnduhconnection","phpdoc:classref"],["","class.mysqlnduhpreparedstatement","section"],["","class.mysqlnduhpreparedstatement","section"],["MysqlndUhPreparedStatement::__construct","mysqlnduhpreparedstatement.construct","refentry"],["","mysqlnduhpreparedstatement.execute","example"],["MysqlndUhPreparedStatement::execute","mysqlnduhpreparedstatement.execute","refentry"],["","mysqlnduhpreparedstatement.prepare","example"],["MysqlndUhPreparedStatement::prepare","mysqlnduhpreparedstatement.prepare","refentry"],["MysqlndUhPreparedStatement","class.mysqlnduhpreparedstatement","phpdoc:classref"],["","function.mysqlnd-uh-convert-to-mysqlnd","example"],["mysqlnd_uh_convert_to_mysqlnd","function.mysqlnd-uh-convert-to-mysqlnd","refentry"],["","function.mysqlnd-uh-set-connection-proxy","example"],["mysqlnd_uh_set_connection_proxy","function.mysqlnd-uh-set-connection-proxy","refentry"],["mysqlnd_uh_set_statement_proxy","function.mysqlnd-uh-set-statement-proxy","refentry"],["","ref.mysqlnd-uh","reference"],["","mysqlnd-uh.changes-one-o","section"],["","mysqlnd-uh.changes","chapter"],["mysqlnd_uh","book.mysqlnd-uh","book"],["","intro.mysqlnd-mux","section"],["","intro.mysqlnd-mux","section"],["","intro.mysqlnd-mux","section"],["","intro.mysqlnd-mux","preface"],["","mysqlnd-mux.architecture","section"],["","mysqlnd-mux.connection_pool","section"],["","mysqlnd-mux.sharing_connections","section"],["","mysqlnd-mux.concepts","chapter"],["","mysqlnd-mux.requirements","section"],["","mysqlnd-mux.installation","section"],["","mysqlnd-mux.configuration","tbody"],["","mysqlnd-mux.configuration","varlistentry"],["","mysqlnd-mux.configuration","section"],["","mysqlnd-mux.setup","chapter"],["","mysqlnd-mux.constants","varlistentry"],["","mysqlnd-mux.constants","varlistentry"],["","mysqlnd-mux.constants","appendix"],["","mysqlnd-mux.changes-one-o","section"],["","mysqlnd-mux.changes","chapter"],["mysqlnd_mux","book.mysqlnd-mux","book"],["","intro.mysqlnd-memcache","section"],["","intro.mysqlnd-memcache","section"],["","intro.mysqlnd-memcache","section"],["","intro.mysqlnd-memcache","preface"],["","mysqlnd-memcache.quickstart.configuration","example"],["","mysqlnd-memcache.quickstart.configuration","example"],["","mysqlnd-memcache.quickstart.configuration","section"],["","mysqlnd-memcache.quickstart.usage","example"],["","mysqlnd-memcache.quickstart.usage","section"],["","mysqlnd-memcache.quickstart","chapter"],["","mysqlnd-memcache.requirements","section"],["","mysqlnd-memcache.installation","section"],["","mysqlnd-memcache.configuration","tbody"],["","mysqlnd-memcache.configuration","varlistentry"],["","mysqlnd-memcache.configuration","section"],["","mysqlnd-memcache.setup","chapter"],["","mysqlnd-memcache.constants","varlistentry"],["","mysqlnd-memcache.constants","varlistentry"],["","mysqlnd-memcache.constants","varlistentry"],["","mysqlnd-memcache.constants","appendix"],["","function.mysqlnd-memcache-get-config","example"],["mysqlnd_memcache_get_config","function.mysqlnd-memcache-get-config","refentry"],["","function.mysqlnd-memcache-set","example"],["mysqlnd_memcache_set","function.mysqlnd-memcache-set","refentry"],["","ref.mysqlnd-memcache","reference"],["","mysqlnd-memcache.changes-one-o","section"],["","mysqlnd-memcache.changes","chapter"],["mysqlnd_memcache","book.mysqlnd-memcache","book"],["MySQL","set.mysqlinfo","set"],["","intro.oci8","preface"],["","oci8.requirements","section"],["","oci8.installation","section"],["","oci8.test","section"],["","oci8.test","section"],["","oci8.configuration","varlistentry"],["","oci8.configuration","varlistentry"],["","oci8.configuration","varlistentry"],["","oci8.configuration","varlistentry"],["","oci8.configuration","varlistentry"],["","oci8.configuration","varlistentry"],["","oci8.configuration","varlistentry"],["","oci8.configuration","varlistentry"],["","oci8.configuration","varlistentry"],["","oci8.configuration","section"],["","oci8.setup","chapter"],["","oci8.constants","appendix"],["","oci8.examples","example"],["","oci8.examples","example"],["","oci8.examples","example"],["","oci8.examples","example"],["","oci8.examples","example"],["","oci8.examples","example"],["","oci8.examples","chapter"],["","oci8.connection","chapter"],["","oci8.fan","chapter"],["","oci8.dtrace","example"],["","oci8.dtrace","chapter"],["","oci8.datatypes","chapter"],["","function.oci-bind-array-by-name","example"],["oci_bind_array_by_name","function.oci-bind-array-by-name","refentry"],["","function.oci-bind-by-name","example"],["","function.oci-bind-by-name","example"],["","function.oci-bind-by-name","example"],["","function.oci-bind-by-name","example"],["","function.oci-bind-by-name","example"],["","function.oci-bind-by-name","example"],["","function.oci-bind-by-name","example"],["","function.oci-bind-by-name","example"],["","function.oci-bind-by-name","example"],["","function.oci-bind-by-name","example"],["","function.oci-bind-by-name","example"],["","function.oci-bind-by-name","example"],["oci_bind_by_name","function.oci-bind-by-name","refentry"],["oci_cancel","function.oci-cancel","refentry"],["","function.oci-client-version","example"],["oci_client_version","function.oci-client-version","refentry"],["","function.oci-close","example"],["","function.oci-close","example"],["","function.oci-close","example"],["","function.oci-close","example"],["oci_close","function.oci-close","refentry"],["","function.oci-commit","example"],["oci_commit","function.oci-commit","refentry"],["","function.oci-connect","example"],["","function.oci-connect","example"],["","function.oci-connect","example"],["","function.oci-connect","example"],["oci_connect","function.oci-connect","refentry"],["","function.oci-define-by-name","example"],["","function.oci-define-by-name","example"],["","function.oci-define-by-name","example"],["","function.oci-define-by-name","example"],["oci_define_by_name","function.oci-define-by-name","refentry"],["","function.oci-error","example"],["","function.oci-error","example"],["","function.oci-error","example"],["oci_error","function.oci-error","refentry"],["","function.oci-execute","example"],["","function.oci-execute","example"],["","function.oci-execute","example"],["","function.oci-execute","example"],["","function.oci-execute","example"],["oci_execute","function.oci-execute","refentry"],["","function.oci-fetch-all","example"],["","function.oci-fetch-all","example"],["","function.oci-fetch-all","example"],["oci_fetch_all","function.oci-fetch-all","refentry"],["","function.oci-fetch-array","example"],["","function.oci-fetch-array","example"],["","function.oci-fetch-array","example"],["","function.oci-fetch-array","example"],["","function.oci-fetch-array","example"],["","function.oci-fetch-array","example"],["","function.oci-fetch-array","example"],["","function.oci-fetch-array","example"],["","function.oci-fetch-array","example"],["","function.oci-fetch-array","example"],["","function.oci-fetch-array","example"],["oci_fetch_array","function.oci-fetch-array","refentry"],["","function.oci-fetch-assoc","example"],["oci_fetch_assoc","function.oci-fetch-assoc","refentry"],["","function.oci-fetch-object","example"],["","function.oci-fetch-object","example"],["","function.oci-fetch-object","example"],["oci_fetch_object","function.oci-fetch-object","refentry"],["","function.oci-fetch-row","example"],["oci_fetch_row","function.oci-fetch-row","refentry"],["","function.oci-fetch","example"],["","function.oci-fetch","example"],["oci_fetch","function.oci-fetch","refentry"],["oci_field_is_null","function.oci-field-is-null","refentry"],["","function.oci-field-name","example"],["oci_field_name","function.oci-field-name","refentry"],["oci_field_precision","function.oci-field-precision","refentry"],["oci_field_scale","function.oci-field-scale","refentry"],["","function.oci-field-size","example"],["oci_field_size","function.oci-field-size","refentry"],["oci_field_type_raw","function.oci-field-type-raw","refentry"],["","function.oci-field-type","example"],["oci_field_type","function.oci-field-type","refentry"],["oci_free_descriptor","function.oci-free-descriptor","refentry"],["oci_free_statement","function.oci-free-statement","refentry"],["","function.oci-get-implicit-resultset","example"],["","function.oci-get-implicit-resultset","example"],["","function.oci-get-implicit-resultset","example"],["","function.oci-get-implicit-resultset","example"],["oci_get_implicit_resultset","function.oci-get-implicit-resultset","refentry"],["oci_internal_debug","function.oci-internal-debug","refentry"],["oci_lob_copy","function.oci-lob-copy","refentry"],["oci_lob_is_equal","function.oci-lob-is-equal","refentry"],["oci_new_collection","function.oci-new-collection","refentry"],["","function.oci-new-connect","example"],["oci_new_connect","function.oci-new-connect","refentry"],["","function.oci-new-cursor","example"],["","function.oci-new-cursor","example"],["oci_new_cursor","function.oci-new-cursor","refentry"],["","function.oci-new-descriptor","example"],["","function.oci-new-descriptor","example"],["oci_new_descriptor","function.oci-new-descriptor","refentry"],["","function.oci-num-fields","example"],["oci_num_fields","function.oci-num-fields","refentry"],["","function.oci-num-rows","example"],["oci_num_rows","function.oci-num-rows","refentry"],["","function.oci-parse","example"],["","function.oci-parse","example"],["oci_parse","function.oci-parse","refentry"],["","function.oci-password-change","example"],["","function.oci-password-change","example"],["oci_password_change","function.oci-password-change","refentry"],["","function.oci-pconnect","example"],["oci_pconnect","function.oci-pconnect","refentry"],["","function.oci-result","example"],["oci_result","function.oci-result","refentry"],["","function.oci-rollback","example"],["","function.oci-rollback","example"],["oci_rollback","function.oci-rollback","refentry"],["","function.oci-server-version","example"],["oci_server_version","function.oci-server-version","refentry"],["","function.oci-set-action","example"],["oci_set_action","function.oci-set-action","refentry"],["","function.oci-set-client-identifier","example"],["oci_set_client_identifier","function.oci-set-client-identifier","refentry"],["","function.oci-set-client-info","example"],["oci_set_client_info","function.oci-set-client-info","refentry"],["","function.oci-set-edition","example"],["oci_set_edition","function.oci-set-edition","refentry"],["","function.oci-set-module-name","example"],["oci_set_module_name","function.oci-set-module-name","refentry"],["","function.oci-set-prefetch","example"],["","function.oci-set-prefetch","example"],["","function.oci-set-prefetch","example"],["oci_set_prefetch","function.oci-set-prefetch","refentry"],["","function.oci-statement-type","example"],["oci_statement_type","function.oci-statement-type","refentry"],["","ref.oci8","reference"],["","class.OCI-Collection","section"],["","class.OCI-Collection","section"],["OCI-Collection::append","oci-collection.append","refentry"],["OCI-Collection::assign","oci-collection.assign","refentry"],["OCI-Collection::assignElem","oci-collection.assignelem","refentry"],["OCI-Collection::free","oci-collection.free","refentry"],["OCI-Collection::getElem","oci-collection.getelem","refentry"],["OCI-Collection::max","oci-collection.max","refentry"],["OCI-Collection::size","oci-collection.size","refentry"],["OCI-Collection::trim","oci-collection.trim","refentry"],["OCI-Collection","class.OCI-Collection","phpdoc:classref"],["","class.OCI-Lob","section"],["","class.OCI-Lob","section"],["OCI-Lob::append","oci-lob.append","refentry"],["OCI-Lob::close","oci-lob.close","refentry"],["OCI-Lob::eof","oci-lob.eof","refentry"],["OCI-Lob::erase","oci-lob.erase","refentry"],["OCI-Lob::export","oci-lob.export","refentry"],["OCI-Lob::flush","oci-lob.flush","refentry"],["OCI-Lob::free","oci-lob.free","refentry"],["OCI-Lob::getBuffering","oci-lob.getbuffering","refentry"],["OCI-Lob::import","oci-lob.import","refentry"],["OCI-Lob::load","oci-lob.load","refentry"],["OCI-Lob::read","oci-lob.read","refentry"],["OCI-Lob::rewind","oci-lob.rewind","refentry"],["OCI-Lob::save","oci-lob.save","refentry"],["OCI-Lob::saveFile","oci-lob.savefile","refentry"],["OCI-Lob::seek","oci-lob.seek","refentry"],["OCI-Lob::setBuffering","oci-lob.setbuffering","refentry"],["OCI-Lob::size","oci-lob.size","refentry"],["OCI-Lob::tell","oci-lob.tell","refentry"],["OCI-Lob::truncate","oci-lob.truncate","refentry"],["OCI-Lob::write","oci-lob.write","refentry"],["OCI-Lob::writeTemporary","oci-lob.writetemporary","refentry"],["OCI-Lob::writeToFile","oci-lob.writetofile","refentry"],["OCI-Lob","class.OCI-Lob","phpdoc:classref"],["ocibindbyname","function.ocibindbyname","refentry"],["ocicancel","function.ocicancel","refentry"],["ocicloselob","function.ocicloselob","refentry"],["ocicollappend","function.ocicollappend","refentry"],["ocicollassign","function.ocicollassign","refentry"],["ocicollassignelem","function.ocicollassignelem","refentry"],["ocicollgetelem","function.ocicollgetelem","refentry"],["ocicollmax","function.ocicollmax","refentry"],["ocicollsize","function.ocicollsize","refentry"],["ocicolltrim","function.ocicolltrim","refentry"],["ocicolumnisnull","function.ocicolumnisnull","refentry"],["ocicolumnname","function.ocicolumnname","refentry"],["ocicolumnprecision","function.ocicolumnprecision","refentry"],["ocicolumnscale","function.ocicolumnscale","refentry"],["ocicolumnsize","function.ocicolumnsize","refentry"],["ocicolumntype","function.ocicolumntype","refentry"],["ocicolumntyperaw","function.ocicolumntyperaw","refentry"],["ocicommit","function.ocicommit","refentry"],["ocidefinebyname","function.ocidefinebyname","refentry"],["ocierror","function.ocierror","refentry"],["ociexecute","function.ociexecute","refentry"],["ocifetch","function.ocifetch","refentry"],["ocifetchinto","function.ocifetchinto","refentry"],["ocifetchstatement","function.ocifetchstatement","refentry"],["ocifreecollection","function.ocifreecollection","refentry"],["ocifreecursor","function.ocifreecursor","refentry"],["ocifreedesc","function.ocifreedesc","refentry"],["ocifreestatement","function.ocifreestatement","refentry"],["ociinternaldebug","function.ociinternaldebug","refentry"],["ociloadlob","function.ociloadlob","refentry"],["ocilogoff","function.ocilogoff","refentry"],["ocilogon","function.ocilogon","refentry"],["ocinewcollection","function.ocinewcollection","refentry"],["ocinewcursor","function.ocinewcursor","refentry"],["ocinewdescriptor","function.ocinewdescriptor","refentry"],["ocinlogon","function.ocinlogon","refentry"],["ocinumcols","function.ocinumcols","refentry"],["ociparse","function.ociparse","refentry"],["ociplogon","function.ociplogon","refentry"],["ociresult","function.ociresult","refentry"],["ocirollback","function.ocirollback","refentry"],["ocirowcount","function.ocirowcount","refentry"],["ocisavelob","function.ocisavelob","refentry"],["ocisavelobfile","function.ocisavelobfile","refentry"],["ociserverversion","function.ociserverversion","refentry"],["ocisetprefetch","function.ocisetprefetch","refentry"],["ocistatementtype","function.ocistatementtype","refentry"],["ociwritelobtofile","function.ociwritelobtofile","refentry"],["ociwritetemporarylob","function.ociwritetemporarylob","refentry"],["","oldaliases.oci8","reference"],["OCI8","book.oci8","book"],["","intro.ovrimos","preface"],["","ovrimos.requirements","section"],["","ovrimos.installation","section"],["","ovrimos.configuration","section"],["","ovrimos.resources","section"],["","ovrimos.setup","chapter"],["","ovrimos.constants","appendix"],["","ovrimos.examples-basic","example"],["","ovrimos.examples-basic","section"],["","ovrimos.examples","chapter"],["ovrimos_close","function.ovrimos-close","refentry"],["ovrimos_commit","function.ovrimos-commit","refentry"],["","function.ovrimos-connect","example"],["ovrimos_connect","function.ovrimos-connect","refentry"],["ovrimos_cursor","function.ovrimos-cursor","refentry"],["ovrimos_exec","function.ovrimos-exec","refentry"],["ovrimos_execute","function.ovrimos-execute","refentry"],["","function.ovrimos-fetch-into","example"],["ovrimos_fetch_into","function.ovrimos-fetch-into","refentry"],["","function.ovrimos-fetch-row","example"],["ovrimos_fetch_row","function.ovrimos-fetch-row","refentry"],["ovrimos_field_len","function.ovrimos-field-len","refentry"],["ovrimos_field_name","function.ovrimos-field-name","refentry"],["ovrimos_field_num","function.ovrimos-field-num","refentry"],["ovrimos_field_type","function.ovrimos-field-type","refentry"],["ovrimos_free_result","function.ovrimos-free-result","refentry"],["ovrimos_longreadlen","function.ovrimos-longreadlen","refentry"],["ovrimos_num_fields","function.ovrimos-num-fields","refentry"],["ovrimos_num_rows","function.ovrimos-num-rows","refentry"],["","function.ovrimos-prepare","example"],["ovrimos_prepare","function.ovrimos-prepare","refentry"],["","function.ovrimos-result-all","example"],["","function.ovrimos-result-all","example"],["ovrimos_result_all","function.ovrimos-result-all","refentry"],["ovrimos_result","function.ovrimos-result","refentry"],["ovrimos_rollback","function.ovrimos-rollback","refentry"],["","ref.ovrimos","reference"],["","book.ovrimos","book"],["","intro.paradox","preface"],["","paradox.requirements","section"],["","paradox.installation","section"],["","paradox.configuration","section"],["","paradox.resources","section"],["","paradox.setup","chapter"],["","paradox.constants","table"],["","paradox.constants","table"],["","paradox.constants","appendix"],["","ref.paradox","table"],["","ref.paradox","section"],["px_close","function.px-close","refentry"],["","function.px-create-fp","example"],["px_create_fp","function.px-create-fp","refentry"],["","function.px-date2string","example"],["px_date2string","function.px-date2string","refentry"],["px_delete_record","function.px-delete-record","refentry"],["px_delete","function.px-delete","refentry"],["px_get_field","function.px-get-field","refentry"],["px_get_info","function.px-get-info","refentry"],["px_get_parameter","function.px-get-parameter","refentry"],["px_get_record","function.px-get-record","refentry"],["px_get_schema","function.px-get-schema","refentry"],["px_get_value","function.px-get-value","refentry"],["","function.px-insert-record","example"],["px_insert_record","function.px-insert-record","refentry"],["","function.px-new","example"],["","function.px-new","example"],["px_new","function.px-new","refentry"],["px_numfields","function.px-numfields","refentry"],["px_numrecords","function.px-numrecords","refentry"],["px_open_fp","function.px-open-fp","refentry"],["px_put_record","function.px-put-record","refentry"],["px_retrieve_record","function.px-retrieve-record","refentry"],["px_set_blob_file","function.px-set-blob-file","refentry"],["px_set_parameter","function.px-set-parameter","refentry"],["px_set_tablename","function.px-set-tablename","refentry"],["px_set_targetencoding","function.px-set-targetencoding","refentry"],["px_set_value","function.px-set-value","refentry"],["","function.px-timestamp2string","example"],["px_timestamp2string","function.px-timestamp2string","refentry"],["px_update_record","function.px-update-record","refentry"],["","ref.paradox","reference"],["Paradox","book.paradox","book"],["","intro.pgsql","preface"],["","pgsql.requirements","section"],["","pgsql.installation","section"],["","pgsql.configuration","varlistentry"],["","pgsql.configuration","varlistentry"],["","pgsql.configuration","varlistentry"],["","pgsql.configuration","varlistentry"],["","pgsql.configuration","varlistentry"],["","pgsql.configuration","varlistentry"],["","pgsql.configuration","section"],["","pgsql.resources","section"],["","pgsql.setup","chapter"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","varlistentry"],["","pgsql.constants","appendix"],["","pgsql.examples-basic","example"],["","pgsql.examples-basic","section"],["","pgsql.examples","chapter"],["","ref.pgsql","section"],["","function.pg-affected-rows","example"],["pg_affected_rows","function.pg-affected-rows","refentry"],["","function.pg-cancel-query","example"],["pg_cancel_query","function.pg-cancel-query","refentry"],["","function.pg-client-encoding","example"],["pg_client_encoding","function.pg-client-encoding","refentry"],["","function.pg-close","example"],["pg_close","function.pg-close","refentry"],["","function.pg-connect","example"],["pg_connect","function.pg-connect","refentry"],["","function.pg-connection-busy","example"],["pg_connection_busy","function.pg-connection-busy","refentry"],["","function.pg-connection-reset","example"],["pg_connection_reset","function.pg-connection-reset","refentry"],["","function.pg-connection-status","example"],["pg_connection_status","function.pg-connection-status","refentry"],["","function.pg-convert","example"],["pg_convert","function.pg-convert","refentry"],["","function.pg-copy-from","example"],["pg_copy_from","function.pg-copy-from","refentry"],["","function.pg-copy-to","example"],["pg_copy_to","function.pg-copy-to","refentry"],["","function.pg-dbname","example"],["pg_dbname","function.pg-dbname","refentry"],["","function.pg-delete","example"],["pg_delete","function.pg-delete","refentry"],["","function.pg-end-copy","example"],["pg_end_copy","function.pg-end-copy","refentry"],["","function.pg-escape-bytea","example"],["pg_escape_bytea","function.pg-escape-bytea","refentry"],["","function.pg-escape-identifier","example"],["pg_escape_identifier","function.pg-escape-identifier","refentry"],["","function.pg-escape-literal","example"],["pg_escape_literal","function.pg-escape-literal","refentry"],["","function.pg-escape-string","example"],["pg_escape_string","function.pg-escape-string","refentry"],["","function.pg-execute","example"],["pg_execute","function.pg-execute","refentry"],["","function.pg-fetch-all-columns","example"],["pg_fetch_all_columns","function.pg-fetch-all-columns","refentry"],["","function.pg-fetch-all","example"],["pg_fetch_all","function.pg-fetch-all","refentry"],["","function.pg-fetch-array","example"],["pg_fetch_array","function.pg-fetch-array","refentry"],["","function.pg-fetch-assoc","example"],["pg_fetch_assoc","function.pg-fetch-assoc","refentry"],["","function.pg-fetch-object","example"],["pg_fetch_object","function.pg-fetch-object","refentry"],["","function.pg-fetch-result","example"],["pg_fetch_result","function.pg-fetch-result","refentry"],["","function.pg-fetch-row","example"],["pg_fetch_row","function.pg-fetch-row","refentry"],["","function.pg-field-is-null","example"],["pg_field_is_null","function.pg-field-is-null","refentry"],["","function.pg-field-name","example"],["pg_field_name","function.pg-field-name","refentry"],["","function.pg-field-num","example"],["pg_field_num","function.pg-field-num","refentry"],["","function.pg-field-prtlen","example"],["pg_field_prtlen","function.pg-field-prtlen","refentry"],["","function.pg-field-size","example"],["pg_field_size","function.pg-field-size","refentry"],["","function.pg-field-table","example"],["pg_field_table","function.pg-field-table","refentry"],["","function.pg-field-type-oid","example"],["pg_field_type_oid","function.pg-field-type-oid","refentry"],["","function.pg-field-type","example"],["pg_field_type","function.pg-field-type","refentry"],["","function.pg-free-result","example"],["pg_free_result","function.pg-free-result","refentry"],["","function.pg-get-notify","example"],["pg_get_notify","function.pg-get-notify","refentry"],["","function.pg-get-pid","example"],["pg_get_pid","function.pg-get-pid","refentry"],["","function.pg-get-result","example"],["pg_get_result","function.pg-get-result","refentry"],["","function.pg-host","example"],["pg_host","function.pg-host","refentry"],["","function.pg-insert","example"],["pg_insert","function.pg-insert","refentry"],["","function.pg-last-error","example"],["pg_last_error","function.pg-last-error","refentry"],["","function.pg-last-notice","example"],["pg_last_notice","function.pg-last-notice","refentry"],["","function.pg-last-oid","example"],["pg_last_oid","function.pg-last-oid","refentry"],["","function.pg-lo-close","example"],["pg_lo_close","function.pg-lo-close","refentry"],["","function.pg-lo-create","example"],["pg_lo_create","function.pg-lo-create","refentry"],["","function.pg-lo-export","example"],["pg_lo_export","function.pg-lo-export","refentry"],["","function.pg-lo-import","example"],["pg_lo_import","function.pg-lo-import","refentry"],["","function.pg-lo-open","example"],["pg_lo_open","function.pg-lo-open","refentry"],["","function.pg-lo-read-all","example"],["pg_lo_read_all","function.pg-lo-read-all","refentry"],["","function.pg-lo-read","example"],["pg_lo_read","function.pg-lo-read","refentry"],["","function.pg-lo-seek","example"],["pg_lo_seek","function.pg-lo-seek","refentry"],["","function.pg-lo-tell","example"],["pg_lo_tell","function.pg-lo-tell","refentry"],["","function.pg-lo-unlink","example"],["pg_lo_unlink","function.pg-lo-unlink","refentry"],["","function.pg-lo-write","example"],["pg_lo_write","function.pg-lo-write","refentry"],["","function.pg-meta-data","example"],["pg_meta_data","function.pg-meta-data","refentry"],["","function.pg-num-fields","example"],["pg_num_fields","function.pg-num-fields","refentry"],["","function.pg-num-rows","example"],["pg_num_rows","function.pg-num-rows","refentry"],["","function.pg-options","example"],["pg_options","function.pg-options","refentry"],["","function.pg-parameter-status","example"],["pg_parameter_status","function.pg-parameter-status","refentry"],["","function.pg-pconnect","example"],["pg_pconnect","function.pg-pconnect","refentry"],["","function.pg-ping","example"],["pg_ping","function.pg-ping","refentry"],["","function.pg-port","example"],["pg_port","function.pg-port","refentry"],["","function.pg-prepare","example"],["pg_prepare","function.pg-prepare","refentry"],["","function.pg-put-line","example"],["pg_put_line","function.pg-put-line","refentry"],["","function.pg-query-params","example"],["pg_query_params","function.pg-query-params","refentry"],["","function.pg-query","example"],["","function.pg-query","example"],["pg_query","function.pg-query","refentry"],["","function.pg-result-error-field","example"],["pg_result_error_field","function.pg-result-error-field","refentry"],["","function.pg-result-error","example"],["pg_result_error","function.pg-result-error","refentry"],["","function.pg-result-seek","example"],["pg_result_seek","function.pg-result-seek","refentry"],["","function.pg-result-status","example"],["pg_result_status","function.pg-result-status","refentry"],["","function.pg-select","example"],["pg_select","function.pg-select","refentry"],["","function.pg-send-execute","example"],["pg_send_execute","function.pg-send-execute","refentry"],["","function.pg-send-prepare","example"],["pg_send_prepare","function.pg-send-prepare","refentry"],["","function.pg-send-query-params","example"],["pg_send_query_params","function.pg-send-query-params","refentry"],["","function.pg-send-query","example"],["pg_send_query","function.pg-send-query","refentry"],["","function.pg-set-client-encoding","example"],["pg_set_client_encoding","function.pg-set-client-encoding","refentry"],["","function.pg-set-error-verbosity","example"],["pg_set_error_verbosity","function.pg-set-error-verbosity","refentry"],["","function.pg-trace","example"],["pg_trace","function.pg-trace","refentry"],["","function.pg-transaction-status","example"],["pg_transaction_status","function.pg-transaction-status","refentry"],["","function.pg-tty","example"],["pg_tty","function.pg-tty","refentry"],["","function.pg-unescape-bytea","example"],["pg_unescape_bytea","function.pg-unescape-bytea","refentry"],["","function.pg-untrace","example"],["pg_untrace","function.pg-untrace","refentry"],["","function.pg-update","example"],["pg_update","function.pg-update","refentry"],["","function.pg-version","example"],["pg_version","function.pg-version","refentry"],["","ref.pgsql","reference"],["","book.pgsql","book"],["","intro.sqlite","preface"],["","sqlite.requirements","section"],["","sqlite.installation","section"],["","sqlite.configuration","varlistentry"],["","sqlite.configuration","section"],["","sqlite.resources","section"],["","sqlite.setup","chapter"],["","sqlite.constants","varlistentry"],["","sqlite.constants","varlistentry"],["","sqlite.constants","varlistentry"],["","sqlite.constants","varlistentry"],["","sqlite.constants","varlistentry"],["","sqlite.constants","varlistentry"],["","sqlite.constants","varlistentry"],["","sqlite.constants","varlistentry"],["","sqlite.constants","varlistentry"],["","sqlite.constants","varlistentry"],["","sqlite.constants","varlistentry"],["","sqlite.constants","varlistentry"],["","sqlite.constants","varlistentry"],["","sqlite.constants","varlistentry"],["","sqlite.constants","varlistentry"],["","sqlite.constants","varlistentry"],["","sqlite.constants","varlistentry"],["","sqlite.constants","varlistentry"],["","sqlite.constants","varlistentry"],["","sqlite.constants","varlistentry"],["","sqlite.constants","varlistentry"],["","sqlite.constants","varlistentry"],["","sqlite.constants","varlistentry"],["","sqlite.constants","varlistentry"],["","sqlite.constants","varlistentry"],["","sqlite.constants","varlistentry"],["","sqlite.constants","varlistentry"],["","sqlite.constants","varlistentry"],["","sqlite.constants","varlistentry"],["","sqlite.constants","varlistentry"],["","sqlite.constants","varlistentry"],["","sqlite.constants","appendix"],["","ref.sqlite","section"],["","ref.sqlite","section"],["","ref.sqlite","section"],["","ref.sqlite","section"],["","ref.sqlite","section"],["","ref.sqlite","section"],["","ref.sqlite","section"],["","ref.sqlite","section"],["","function.sqlite-array-query","example"],["","function.sqlite-array-query","example"],["sqlite_array_query","function.sqlite-array-query","refentry"],["","function.sqlite-busy-timeout","example"],["","function.sqlite-busy-timeout","example"],["sqlite_busy_timeout","function.sqlite-busy-timeout","refentry"],["","function.sqlite-changes","example"],["","function.sqlite-changes","example"],["sqlite_changes","function.sqlite-changes","refentry"],["","function.sqlite-close","example"],["sqlite_close","function.sqlite-close","refentry"],["sqlite_column","function.sqlite-column","refentry"],["","function.sqlite-create-aggregate","example"],["sqlite_create_aggregate","function.sqlite-create-aggregate","refentry"],["","function.sqlite-create-function","example"],["","function.sqlite-create-function","example"],["sqlite_create_function","function.sqlite-create-function","refentry"],["sqlite_current","function.sqlite-current","refentry"],["sqlite_error_string","function.sqlite-error-string","refentry"],["sqlite_escape_string","function.sqlite-escape-string","refentry"],["","function.sqlite-exec","example"],["","function.sqlite-exec","example"],["sqlite_exec","function.sqlite-exec","refentry"],["","function.sqlite-factory","example"],["sqlite_factory","function.sqlite-factory","refentry"],["","function.sqlite-fetch-all","example"],["","function.sqlite-fetch-all","example"],["sqlite_fetch_all","function.sqlite-fetch-all","refentry"],["","function.sqlite-fetch-array","example"],["","function.sqlite-fetch-array","example"],["sqlite_fetch_array","function.sqlite-fetch-array","refentry"],["","function.sqlite-fetch-column-types","example"],["","function.sqlite-fetch-column-types","example"],["sqlite_fetch_column_types","function.sqlite-fetch-column-types","refentry"],["sqlite_fetch_object","function.sqlite-fetch-object","refentry"],["","function.sqlite-fetch-single","example"],["sqlite_fetch_single","function.sqlite-fetch-single","refentry"],["sqlite_fetch_string","function.sqlite-fetch-string","refentry"],["sqlite_field_name","function.sqlite-field-name","refentry"],["sqlite_has_more","function.sqlite-has-more","refentry"],["sqlite_has_prev","function.sqlite-has-prev","refentry"],["sqlite_key","function.sqlite-key","refentry"],["sqlite_last_error","function.sqlite-last-error","refentry"],["sqlite_last_insert_rowid","function.sqlite-last-insert-rowid","refentry"],["sqlite_libencoding","function.sqlite-libencoding","refentry"],["sqlite_libversion","function.sqlite-libversion","refentry"],["sqlite_next","function.sqlite-next","refentry"],["sqlite_num_fields","function.sqlite-num-fields","refentry"],["","function.sqlite-num-rows","example"],["","function.sqlite-num-rows","example"],["sqlite_num_rows","function.sqlite-num-rows","refentry"],["","function.sqlite-open","example"],["sqlite_open","function.sqlite-open","refentry"],["sqlite_popen","function.sqlite-popen","refentry"],["sqlite_prev","function.sqlite-prev","refentry"],["sqlite_query","function.sqlite-query","refentry"],["sqlite_rewind","function.sqlite-rewind","refentry"],["sqlite_seek","function.sqlite-seek","refentry"],["sqlite_single_query","function.sqlite-single-query","refentry"],["","function.sqlite-udf-decode-binary","example"],["sqlite_udf_decode_binary","function.sqlite-udf-decode-binary","refentry"],["sqlite_udf_encode_binary","function.sqlite-udf-encode-binary","refentry"],["sqlite_unbuffered_query","function.sqlite-unbuffered-query","refentry"],["sqlite_valid","function.sqlite-valid","refentry"],["","ref.sqlite","reference"],["","book.sqlite","book"],["","intro.sqlite3","preface"],["","sqlite3.requirements","section"],["","sqlite3.installation","section"],["","sqlite3.configuration","varlistentry"],["","sqlite3.configuration","section"],["","sqlite3.resources","section"],["","sqlite3.setup","chapter"],["","sqlite3.constants","varlistentry"],["","sqlite3.constants","varlistentry"],["","sqlite3.constants","varlistentry"],["","sqlite3.constants","varlistentry"],["","sqlite3.constants","varlistentry"],["","sqlite3.constants","varlistentry"],["","sqlite3.constants","varlistentry"],["","sqlite3.constants","varlistentry"],["","sqlite3.constants","varlistentry"],["","sqlite3.constants","varlistentry"],["","sqlite3.constants","varlistentry"],["","sqlite3.constants","appendix"],["","class.sqlite3","section"],["","class.sqlite3","section"],["SQLite3::busyTimeout","sqlite3.busytimeout","refentry"],["","sqlite3.changes","example"],["SQLite3::changes","sqlite3.changes","refentry"],["","sqlite3.close","example"],["SQLite3::close","sqlite3.close","refentry"],["","sqlite3.construct","example"],["SQLite3::__construct","sqlite3.construct","refentry"],["SQLite3::createAggregate","sqlite3.createaggregate","refentry"],["","sqlite3.createcollation","example"],["SQLite3::createCollation","sqlite3.createcollation","refentry"],["","sqlite3.createfunction","example"],["SQLite3::createFunction","sqlite3.createfunction","refentry"],["SQLite3::escapeString","sqlite3.escapestring","refentry"],["","sqlite3.exec","example"],["SQLite3::exec","sqlite3.exec","refentry"],["SQLite3::lastErrorCode","sqlite3.lasterrorcode","refentry"],["SQLite3::lastErrorMsg","sqlite3.lasterrormsg","refentry"],["SQLite3::lastInsertRowID","sqlite3.lastinsertrowid","refentry"],["","sqlite3.loadextension","example"],["SQLite3::loadExtension","sqlite3.loadextension","refentry"],["","sqlite3.open","example"],["SQLite3::open","sqlite3.open","refentry"],["","sqlite3.prepare","example"],["SQLite3::prepare","sqlite3.prepare","refentry"],["","sqlite3.query","example"],["SQLite3::query","sqlite3.query","refentry"],["","sqlite3.querysingle","example"],["SQLite3::querySingle","sqlite3.querysingle","refentry"],["","sqlite3.version","example"],["SQLite3::version","sqlite3.version","refentry"],["SQLite3","class.sqlite3","phpdoc:classref"],["","class.sqlite3stmt","section"],["","class.sqlite3stmt","section"],["SQLite3Stmt::bindParam","sqlite3stmt.bindparam","refentry"],["","sqlite3stmt.bindvalue","example"],["SQLite3Stmt::bindValue","sqlite3stmt.bindvalue","refentry"],["SQLite3Stmt::clear","sqlite3stmt.clear","refentry"],["SQLite3Stmt::close","sqlite3stmt.close","refentry"],["SQLite3Stmt::execute","sqlite3stmt.execute","refentry"],["SQLite3Stmt::paramCount","sqlite3stmt.paramcount","refentry"],["SQLite3Stmt::reset","sqlite3stmt.reset","refentry"],["SQLite3Stmt","class.sqlite3stmt","phpdoc:classref"],["","class.sqlite3result","section"],["","class.sqlite3result","section"],["SQLite3Result::columnName","sqlite3result.columnname","refentry"],["SQLite3Result::columnType","sqlite3result.columntype","refentry"],["SQLite3Result::fetchArray","sqlite3result.fetcharray","refentry"],["SQLite3Result::finalize","sqlite3result.finalize","refentry"],["SQLite3Result::numColumns","sqlite3result.numcolumns","refentry"],["SQLite3Result::reset","sqlite3result.reset","refentry"],["SQLite3Result","class.sqlite3result","phpdoc:classref"],["SQLite3","book.sqlite3","book"],["","intro.sqlsrv","preface"],["","sqlsrv.requirements","section"],["","sqlsrv.installation","section"],["","sqlsrv.configuration","section"],["","sqlsrv.resources","section"],["","sqlsrv.resources","section"],["","sqlsrv.resources","section"],["","sqlsrv.setup","chapter"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","varlistentry"],["","sqlsrv.constants","appendix"],["","function.sqlsrv-begin-transaction","example"],["sqlsrv_begin_transaction","function.sqlsrv-begin-transaction","refentry"],["","function.sqlsrv-cancel","example"],["sqlsrv_cancel","function.sqlsrv-cancel","refentry"],["","function.sqlsrv-client-info","example"],["sqlsrv_client_info","function.sqlsrv-client-info","refentry"],["","function.sqlsrv-close","example"],["sqlsrv_close","function.sqlsrv-close","refentry"],["","function.sqlsrv-commit","example"],["sqlsrv_commit","function.sqlsrv-commit","refentry"],["sqlsrv_configure","function.sqlsrv-configure","refentry"],["","function.sqlsrv-connect","example"],["","function.sqlsrv-connect","example"],["","function.sqlsrv-connect","example"],["sqlsrv_connect","function.sqlsrv-connect","refentry"],["","function.sqlsrv-errors","example"],["sqlsrv_errors","function.sqlsrv-errors","refentry"],["","function.sqlsrv-execute","example"],["sqlsrv_execute","function.sqlsrv-execute","refentry"],["","function.sqlsrv-fetch-array","example"],["","function.sqlsrv-fetch-array","example"],["sqlsrv_fetch_array","function.sqlsrv-fetch-array","refentry"],["","function.sqlsrv-fetch-object","example"],["sqlsrv_fetch_object","function.sqlsrv-fetch-object","refentry"],["","function.sqlsrv-fetch","example"],["sqlsrv_fetch","function.sqlsrv-fetch","refentry"],["","function.sqlsrv-field-metadata","example"],["sqlsrv_field_metadata","function.sqlsrv-field-metadata","refentry"],["","function.sqlsrv-free-stmt","example"],["sqlsrv_free_stmt","function.sqlsrv-free-stmt","refentry"],["sqlsrv_get_config","function.sqlsrv-get-config","refentry"],["","function.sqlsrv-get-field","example"],["sqlsrv_get_field","function.sqlsrv-get-field","refentry"],["","function.sqlsrv-has-rows","example"],["sqlsrv_has_rows","function.sqlsrv-has-rows","refentry"],["","function.sqlsrv-next-result","example"],["sqlsrv_next_result","function.sqlsrv-next-result","refentry"],["","function.sqlsrv-num-fields","example"],["sqlsrv_num_fields","function.sqlsrv-num-fields","refentry"],["","function.sqlsrv-num-rows","example"],["sqlsrv_num_rows","function.sqlsrv-num-rows","refentry"],["","function.sqlsrv-prepare","example"],["sqlsrv_prepare","function.sqlsrv-prepare","refentry"],["","function.sqlsrv-query","example"],["sqlsrv_query","function.sqlsrv-query","refentry"],["","function.sqlsrv-rollback","example"],["sqlsrv_rollback","function.sqlsrv-rollback","refentry"],["","function.sqlsrv-rows-affected","example"],["sqlsrv_rows_affected","function.sqlsrv-rows-affected","refentry"],["","function.sqlsrv-send-stream-data","example"],["sqlsrv_send_stream_data","function.sqlsrv-send-stream-data","refentry"],["","function.sqlsrv-server-info","example"],["sqlsrv_server_info","function.sqlsrv-server-info","refentry"],["","ref.sqlsrv","reference"],["SQLSRV","book.sqlsrv","book"],["","intro.sybase","preface"],["","sybase.requirements","section"],["","sybase.installation","section"],["","sybase.configuration","varlistentry"],["","sybase.configuration","varlistentry"],["","sybase.configuration","varlistentry"],["","sybase.configuration","varlistentry"],["","sybase.configuration","varlistentry"],["","sybase.configuration","varlistentry"],["","sybase.configuration","varlistentry"],["","sybase.configuration","varlistentry"],["","sybase.configuration","varlistentry"],["","sybase.configuration","varlistentry"],["","sybase.configuration","varlistentry"],["","sybase.configuration","varlistentry"],["","sybase.configuration","varlistentry"],["","sybase.configuration","varlistentry"],["","sybase.configuration","varlistentry"],["","sybase.configuration","section"],["","sybase.resources","section"],["","sybase.setup","chapter"],["","sybase.constants","appendix"],["","function.sybase-affected-rows","example"],["sybase_affected_rows","function.sybase-affected-rows","refentry"],["sybase_close","function.sybase-close","refentry"],["","function.sybase-connect","example"],["sybase_connect","function.sybase-connect","refentry"],["sybase_data_seek","function.sybase-data-seek","refentry"],["sybase_deadlock_retry_count","function.sybase-deadlock-retry-count","refentry"],["","function.sybase-fetch-array","example"],["sybase_fetch_array","function.sybase-fetch-array","refentry"],["sybase_fetch_assoc","function.sybase-fetch-assoc","refentry"],["sybase_fetch_field","function.sybase-fetch-field","refentry"],["","function.sybase-fetch-object","example"],["sybase_fetch_object","function.sybase-fetch-object","refentry"],["sybase_fetch_row","function.sybase-fetch-row","refentry"],["sybase_field_seek","function.sybase-field-seek","refentry"],["sybase_free_result","function.sybase-free-result","refentry"],["sybase_get_last_message","function.sybase-get-last-message","refentry"],["sybase_min_client_severity","function.sybase-min-client-severity","refentry"],["sybase_min_error_severity","function.sybase-min-error-severity","refentry"],["sybase_min_message_severity","function.sybase-min-message-severity","refentry"],["sybase_min_server_severity","function.sybase-min-server-severity","refentry"],["sybase_num_fields","function.sybase-num-fields","refentry"],["sybase_num_rows","function.sybase-num-rows","refentry"],["sybase_pconnect","function.sybase-pconnect","refentry"],["sybase_query","function.sybase-query","refentry"],["sybase_result","function.sybase-result","refentry"],["sybase_select_db","function.sybase-select-db","refentry"],["","function.sybase-set-message-handler","example"],["","function.sybase-set-message-handler","example"],["","function.sybase-set-message-handler","example"],["sybase_set_message_handler","function.sybase-set-message-handler","refentry"],["","function.sybase-unbuffered-query","example"],["sybase_unbuffered_query","function.sybase-unbuffered-query","refentry"],["","ref.sybase","reference"],["","book.sybase","book"],["","intro.tokyo-tyrant","preface"],["","tokyo-tyrant.requirements","section"],["","tokyo-tyrant.installation","section"],["","tokyo-tyrant.installation","section"],["","tokyo-tyrant.configuration","varlistentry"],["","tokyo-tyrant.configuration","varlistentry"],["","tokyo-tyrant.configuration","varlistentry"],["","tokyo-tyrant.configuration","varlistentry"],["","tokyo-tyrant.configuration","varlistentry"],["","tokyo-tyrant.configuration","varlistentry"],["","tokyo-tyrant.configuration","varlistentry"],["","tokyo-tyrant.configuration","section"],["","tokyo-tyrant.resources","section"],["","tokyo-tyrant.setup","chapter"],["","tokyo-tyrant.constants","appendix"],["","tokyo-tyrant.examples","example"],["","tokyo-tyrant.examples","chapter"],["","class.tokyotyrant","section"],["","class.tokyotyrant","section"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","varlistentry"],["","class.tokyotyrant","section"],["","class.tokyotyrant","section"],["","tokyotyrant.add","example"],["TokyoTyrant::add","tokyotyrant.add","refentry"],["","tokyotyrant.connect","example"],["TokyoTyrant::connect","tokyotyrant.connect","refentry"],["","tokyotyrant.connecturi","example"],["TokyoTyrant::connectUri","tokyotyrant.connecturi","refentry"],["TokyoTyrant::__construct","tokyotyrant.construct","refentry"],["","tokyotyrant.copy","example"],["TokyoTyrant::copy","tokyotyrant.copy","refentry"],["","tokyotyrant.ext","example"],["TokyoTyrant::ext","tokyotyrant.ext","refentry"],["","tokyotyrant.fwmkeys","example"],["TokyoTyrant::fwmKeys","tokyotyrant.fwmkeys","refentry"],["","tokyotyrant.get","example"],["TokyoTyrant::get","tokyotyrant.get","refentry"],["","tokyotyrant.getiterator","example"],["TokyoTyrant::getIterator","tokyotyrant.getiterator","refentry"],["","tokyotyrant.num","example"],["TokyoTyrant::num","tokyotyrant.num","refentry"],["","tokyotyrant.out","example"],["TokyoTyrant::out","tokyotyrant.out","refentry"],["","tokyotyrant.put","example"],["TokyoTyrant::put","tokyotyrant.put","refentry"],["","tokyotyrant.putcat","example"],["TokyoTyrant::putCat","tokyotyrant.putcat","refentry"],["","tokyotyrant.putkeep","example"],["TokyoTyrant::putKeep","tokyotyrant.putkeep","refentry"],["","tokyotyrant.putnr","example"],["TokyoTyrant::putNr","tokyotyrant.putnr","refentry"],["","tokyotyrant.putshl","example"],["TokyoTyrant::putShl","tokyotyrant.putshl","refentry"],["TokyoTyrant::restore","tokyotyrant.restore","refentry"],["","tokyotyrant.setmaster","example"],["TokyoTyrant::setMaster","tokyotyrant.setmaster","refentry"],["","tokyotyrant.size","example"],["TokyoTyrant::size","tokyotyrant.size","refentry"],["","tokyotyrant.stat","example"],["TokyoTyrant::stat","tokyotyrant.stat","refentry"],["TokyoTyrant::sync","tokyotyrant.sync","refentry"],["TokyoTyrant::tune","tokyotyrant.tune","refentry"],["","tokyotyrant.vanish","example"],["TokyoTyrant::vanish","tokyotyrant.vanish","refentry"],["TokyoTyrant","class.tokyotyrant","phpdoc:classref"],["","class.tokyotyranttable","section"],["","class.tokyotyranttable","section"],["TokyoTyrantTable::add","tokyotyranttable.add","refentry"],["","tokyotyranttable.genuid","example"],["TokyoTyrantTable::genUid","tokyotyranttable.genuid","refentry"],["","tokyotyranttable.get","example"],["TokyoTyrantTable::get","tokyotyranttable.get","refentry"],["","tokyotyranttable.getiterator","example"],["TokyoTyrantTable::getIterator","tokyotyranttable.getiterator","refentry"],["","tokyotyranttable.getquery","example"],["TokyoTyrantTable::getQuery","tokyotyranttable.getquery","refentry"],["","tokyotyranttable.out","example"],["TokyoTyrantTable::out","tokyotyranttable.out","refentry"],["","tokyotyranttable.put","example"],["TokyoTyrantTable::put","tokyotyranttable.put","refentry"],["","tokyotyranttable.putcat","example"],["TokyoTyrantTable::putCat","tokyotyranttable.putcat","refentry"],["","tokyotyranttable.putkeep","example"],["TokyoTyrantTable::putKeep","tokyotyranttable.putkeep","refentry"],["TokyoTyrantTable::putNr","tokyotyranttable.putnr","refentry"],["TokyoTyrantTable::putShl","tokyotyranttable.putshl","refentry"],["TokyoTyrantTable::setIndex","tokyotyranttable.setindex","refentry"],["TokyoTyrantTable","class.tokyotyranttable","phpdoc:classref"],["","class.tokyotyrantquery","section"],["","class.tokyotyrantquery","section"],["","tokyotyrantquery.addcond","example"],["TokyoTyrantQuery::addCond","tokyotyrantquery.addcond","refentry"],["","tokyotyrantquery.construct","example"],["TokyoTyrantQuery::__construct","tokyotyrantquery.construct","refentry"],["","tokyotyrantquery.count","example"],["TokyoTyrantQuery::count","tokyotyrantquery.count","refentry"],["","tokyotyrantquery.current","example"],["TokyoTyrantQuery::current","tokyotyrantquery.current","refentry"],["","tokyotyrantquery.hint","example"],["TokyoTyrantQuery::hint","tokyotyrantquery.hint","refentry"],["","tokyotyrantquery.key","example"],["TokyoTyrantQuery::key","tokyotyrantquery.key","refentry"],["","tokyotyrantquery.metasearch","example"],["TokyoTyrantQuery::metaSearch","tokyotyrantquery.metasearch","refentry"],["","tokyotyrantquery.next","example"],["TokyoTyrantQuery::next","tokyotyrantquery.next","refentry"],["","tokyotyrantquery.out","example"],["TokyoTyrantQuery::out","tokyotyrantquery.out","refentry"],["","tokyotyrantquery.rewind","example"],["TokyoTyrantQuery::rewind","tokyotyrantquery.rewind","refentry"],["","tokyotyrantquery.search","example"],["TokyoTyrantQuery::search","tokyotyrantquery.search","refentry"],["TokyoTyrantQuery::setLimit","tokyotyrantquery.setlimit","refentry"],["TokyoTyrantQuery::setOrder","tokyotyrantquery.setorder","refentry"],["","tokyotyrantquery.valid","example"],["TokyoTyrantQuery::valid","tokyotyrantquery.valid","refentry"],["TokyoTyrantQuery","class.tokyotyrantquery","phpdoc:classref"],["","class.tokyotyrantiterator","section"],["","class.tokyotyrantiterator","section"],["","tokyotyrantiterator.construct","example"],["TokyoTyrantIterator::__construct","tokyotyrantiterator.construct","refentry"],["TokyoTyrantIterator::current","tokyotyrantiterator.current","refentry"],["TokyoTyrantIterator::key","tokyotyrantiterator.key","refentry"],["TokyoTyrantIterator::next","tokyotyrantiterator.next","refentry"],["TokyoTyrantIterator::rewind","tokyotyrantiterator.rewind","refentry"],["TokyoTyrantIterator::valid","tokyotyrantiterator.valid","refentry"],["TokyoTyrantIterator","class.tokyotyrantiterator","phpdoc:classref"],["","class.tokyotyrantexception","section"],["","class.tokyotyrantexception","section"],["","class.tokyotyrantexception","varlistentry"],["","class.tokyotyrantexception","section"],["TokyoTyrantException","class.tokyotyrantexception","phpdoc:classref"],["tokyo_tyrant","book.tokyo-tyrant","book"],["","refs.database.vendors","set"],["","refs.database","set"],["","intro.calendar","preface"],["","calendar.requirements","section"],["","calendar.installation","section"],["","calendar.configuration","section"],["","calendar.resources","section"],["","calendar.setup","chapter"],["","calendar.constants","varlistentry"],["","calendar.constants","varlistentry"],["","calendar.constants","varlistentry"],["","calendar.constants","varlistentry"],["","calendar.constants","varlistentry"],["","calendar.constants","varlistentry"],["","calendar.constants","varlistentry"],["","calendar.constants","varlistentry"],["","calendar.constants","varlistentry"],["","calendar.constants","varlistentry"],["","calendar.constants","varlistentry"],["","calendar.constants","varlistentry"],["","calendar.constants","varlistentry"],["","calendar.constants","varlistentry"],["","calendar.constants","varlistentry"],["","calendar.constants","varlistentry"],["","calendar.constants","varlistentry"],["","calendar.constants","varlistentry"],["","calendar.constants","varlistentry"],["","calendar.constants","varlistentry"],["","calendar.constants","varlistentry"],["","calendar.constants","appendix"],["","function.cal-days-in-month","example"],["cal_days_in_month","function.cal-days-in-month","refentry"],["","function.cal-from-jd","example"],["cal_from_jd","function.cal-from-jd","refentry"],["","function.cal-info","example"],["cal_info","function.cal-info","refentry"],["cal_to_jd","function.cal-to-jd","refentry"],["","function.easter-date","example"],["easter_date","function.easter-date","refentry"],["","function.easter-days","example"],["easter_days","function.easter-days","refentry"],["FrenchToJD","function.frenchtojd","refentry"],["","function.gregoriantojd","example"],["GregorianToJD","function.gregoriantojd","refentry"],["JDDayOfWeek","function.jddayofweek","refentry"],["JDMonthName","function.jdmonthname","refentry"],["JDToFrench","function.jdtofrench","refentry"],["JDToGregorian","function.jdtogregorian","refentry"],["","function.jdtojewish","example"],["jdtojewish","function.jdtojewish","refentry"],["JDToJulian","function.jdtojulian","refentry"],["jdtounix","function.jdtounix","refentry"],["JewishToJD","function.jewishtojd","refentry"],["JulianToJD","function.juliantojd","refentry"],["unixtojd","function.unixtojd","refentry"],["","ref.calendar","reference"],["","book.calendar","book"],["","intro.datetime","preface"],["","datetime.requirements","section"],["","datetime.installation","section"],["","datetime.configuration","varlistentry"],["","datetime.configuration","varlistentry"],["","datetime.configuration","varlistentry"],["","datetime.configuration","varlistentry"],["","datetime.configuration","varlistentry"],["","datetime.configuration","section"],["","datetime.resources","section"],["","datetime.setup","chapter"],["","datetime.constants","varlistentry"],["","datetime.constants","varlistentry"],["","datetime.constants","varlistentry"],["","datetime.constants","appendix"],["","class.datetime","section"],["","class.datetime","section"],["","class.datetime","varlistentry"],["","class.datetime","varlistentry"],["","class.datetime","varlistentry"],["","class.datetime","varlistentry"],["","class.datetime","varlistentry"],["","class.datetime","varlistentry"],["","class.datetime","varlistentry"],["","class.datetime","varlistentry"],["","class.datetime","varlistentry"],["","class.datetime","varlistentry"],["","class.datetime","varlistentry"],["","class.datetime","section"],["","class.datetime","section"],["","datetime.add","example"],["","datetime.add","example"],["","datetime.add","example"],["DateTime::add","datetime.add","refentry"],["","datetime.construct","example"],["","datetime.construct","example"],["DateTime::__construct","datetime.construct","refentry"],["","datetime.createfromformat","example"],["","datetime.createfromformat","example"],["DateTime::createFromFormat","datetime.createfromformat","refentry"],["","datetime.getlasterrors","example"],["DateTime::getLastErrors","datetime.getlasterrors","refentry"],["","datetime.modify","example"],["","datetime.modify","example"],["DateTime::modify","datetime.modify","refentry"],["DateTime::__set_state","datetime.set-state","refentry"],["","datetime.setdate","example"],["","datetime.setdate","example"],["DateTime::setDate","datetime.setdate","refentry"],["","datetime.setisodate","example"],["","datetime.setisodate","example"],["","datetime.setisodate","example"],["DateTime::setISODate","datetime.setisodate","refentry"],["","datetime.settime","example"],["","datetime.settime","example"],["DateTime::setTime","datetime.settime","refentry"],["","datetime.settimestamp","example"],["","datetime.settimestamp","example"],["DateTime::setTimestamp","datetime.settimestamp","refentry"],["","datetime.settimezone","example"],["DateTime::setTimezone","datetime.settimezone","refentry"],["","datetime.sub","example"],["","datetime.sub","example"],["","datetime.sub","example"],["DateTime::sub","datetime.sub","refentry"],["DateTime","class.datetime","phpdoc:classref"],["","class.datetimeimmutable","section"],["","class.datetimeimmutable","section"],["DateTimeImmutable::add","datetimeimmutable.add","refentry"],["DateTimeImmutable::__construct","datetimeimmutable.construct","refentry"],["DateTimeImmutable::createFromFormat","datetimeimmutable.createfromformat","refentry"],["DateTimeImmutable::getLastErrors","datetimeimmutable.getlasterrors","refentry"],["DateTimeImmutable::modify","datetimeimmutable.modify","refentry"],["DateTimeImmutable::__set_state","datetimeimmutable.set-state","refentry"],["DateTimeImmutable::setDate","datetimeimmutable.setdate","refentry"],["DateTimeImmutable::setISODate","datetimeimmutable.setisodate","refentry"],["DateTimeImmutable::setTime","datetimeimmutable.settime","refentry"],["DateTimeImmutable::setTimestamp","datetimeimmutable.settimestamp","refentry"],["DateTimeImmutable::setTimezone","datetimeimmutable.settimezone","refentry"],["DateTimeImmutable::sub","datetimeimmutable.sub","refentry"],["DateTimeImmutable","class.datetimeimmutable","phpdoc:classref"],["","class.datetimeinterface","section"],["","class.datetimeinterface","section"],["","datetime.diff","example"],["","datetime.diff","example"],["DateTime::diff","datetime.diff","refentry"],["","datetime.format","example"],["DateTime::format","datetime.format","refentry"],["","datetime.getoffset","example"],["DateTime::getOffset","datetime.getoffset","refentry"],["","datetime.gettimestamp","example"],["DateTime::getTimestamp","datetime.gettimestamp","refentry"],["","datetime.gettimezone","example"],["DateTime::getTimezone","datetime.gettimezone","refentry"],["DateTime::__wakeup","datetime.wakeup","refentry"],["DateTimeInterface","class.datetimeinterface","phpdoc:classref"],["","class.datetimezone","section"],["","class.datetimezone","section"],["","class.datetimezone","varlistentry"],["","class.datetimezone","varlistentry"],["","class.datetimezone","varlistentry"],["","class.datetimezone","varlistentry"],["","class.datetimezone","varlistentry"],["","class.datetimezone","varlistentry"],["","class.datetimezone","varlistentry"],["","class.datetimezone","varlistentry"],["","class.datetimezone","varlistentry"],["","class.datetimezone","varlistentry"],["","class.datetimezone","varlistentry"],["","class.datetimezone","varlistentry"],["","class.datetimezone","varlistentry"],["","class.datetimezone","varlistentry"],["","class.datetimezone","section"],["","datetimezone.construct","example"],["DateTimeZone::__construct","datetimezone.construct","refentry"],["","datetimezone.getlocation","example"],["DateTimeZone::getLocation","datetimezone.getlocation","refentry"],["DateTimeZone::getName","datetimezone.getname","refentry"],["","datetimezone.getoffset","example"],["DateTimeZone::getOffset","datetimezone.getoffset","refentry"],["","datetimezone.gettransitions","example"],["DateTimeZone::getTransitions","datetimezone.gettransitions","refentry"],["","datetimezone.listabbreviations","example"],["DateTimeZone::listAbbreviations","datetimezone.listabbreviations","refentry"],["","datetimezone.listidentifiers","example"],["DateTimeZone::listIdentifiers","datetimezone.listidentifiers","refentry"],["DateTimeZone","class.datetimezone","phpdoc:classref"],["","class.dateinterval","section"],["","class.dateinterval","section"],["","class.dateinterval","varlistentry"],["","class.dateinterval","varlistentry"],["","class.dateinterval","varlistentry"],["","class.dateinterval","varlistentry"],["","class.dateinterval","varlistentry"],["","class.dateinterval","varlistentry"],["","class.dateinterval","varlistentry"],["","class.dateinterval","varlistentry"],["","class.dateinterval","section"],["","dateinterval.construct","example"],["DateInterval::__construct","dateinterval.construct","refentry"],["","dateinterval.createfromdatestring","example"],["DateInterval::createFromDateString","dateinterval.createfromdatestring","refentry"],["","dateinterval.format","example"],["","dateinterval.format","example"],["","dateinterval.format","example"],["DateInterval::format","dateinterval.format","refentry"],["DateInterval","class.dateinterval","phpdoc:classref"],["","class.dateperiod","section"],["","class.dateperiod","section"],["","class.dateperiod","varlistentry"],["","class.dateperiod","section"],["","dateperiod.construct","example"],["","dateperiod.construct","example"],["DatePeriod::__construct","dateperiod.construct","refentry"],["DatePeriod","class.dateperiod","phpdoc:classref"],["","function.checkdate","example"],["checkdate","function.checkdate","refentry"],["date_add","function.date-add","refentry"],["date_create_from_format","function.date-create-from-format","refentry"],["date_create_immutable_from_format","function.date-create-immutable-from-format","refentry"],["date_create_immutable","function.date-create-immutable","refentry"],["date_create","function.date-create","refentry"],["date_date_set","function.date-date-set","refentry"],["","function.date-default-timezone-get","example"],["","function.date-default-timezone-get","example"],["date_default_timezone_get","function.date-default-timezone-get","refentry"],["","function.date-default-timezone-set","example"],["date_default_timezone_set","function.date-default-timezone-set","refentry"],["date_diff","function.date-diff","refentry"],["date_format","function.date-format","refentry"],["date_get_last_errors","function.date-get-last-errors","refentry"],["date_interval_create_from_date_string","function.date-interval-create-from-date-string","refentry"],["date_interval_format","function.date-interval-format","refentry"],["date_isodate_set","function.date-isodate-set","refentry"],["date_modify","function.date-modify","refentry"],["date_offset_get","function.date-offset-get","refentry"],["","function.date-parse-from-format","example"],["date_parse_from_format","function.date-parse-from-format","refentry"],["","function.date-parse","example"],["date_parse","function.date-parse","refentry"],["date_sub","function.date-sub","refentry"],["","function.date-sun-info","example"],["date_sun_info","function.date-sun-info","refentry"],["","function.date-sunrise","example"],["date_sunrise","function.date-sunrise","refentry"],["","function.date-sunset","example"],["date_sunset","function.date-sunset","refentry"],["date_time_set","function.date-time-set","refentry"],["date_timestamp_get","function.date-timestamp-get","refentry"],["date_timestamp_set","function.date-timestamp-set","refentry"],["date_timezone_get","function.date-timezone-get","refentry"],["date_timezone_set","function.date-timezone-set","refentry"],["","function.date","example"],["","function.date","example"],["","function.date","example"],["","function.date","example"],["date","function.date","refentry"],["","function.getdate","example"],["getdate","function.getdate","refentry"],["","function.gettimeofday","example"],["gettimeofday","function.gettimeofday","refentry"],["","function.gmdate","example"],["gmdate","function.gmdate","refentry"],["","function.gmmktime","example"],["gmmktime","function.gmmktime","refentry"],["","function.gmstrftime","example"],["gmstrftime","function.gmstrftime","refentry"],["","function.idate","example"],["idate","function.idate","refentry"],["","function.localtime","example"],["localtime","function.localtime","refentry"],["","function.microtime","example"],["","function.microtime","example"],["","function.microtime","example"],["microtime","function.microtime","refentry"],["","function.mktime","example"],["","function.mktime","example"],["","function.mktime","example"],["mktime","function.mktime","refentry"],["","function.strftime","example"],["","function.strftime","example"],["","function.strftime","example"],["","function.strftime","example"],["strftime","function.strftime","refentry"],["","function.strptime","example"],["strptime","function.strptime","refentry"],["","function.strtotime","example"],["","function.strtotime","example"],["strtotime","function.strtotime","refentry"],["","function.time","example"],["time","function.time","refentry"],["timezone_abbreviations_list","function.timezone-abbreviations-list","refentry"],["timezone_identifiers_list","function.timezone-identifiers-list","refentry"],["timezone_location_get","function.timezone-location-get","refentry"],["","function.timezone-name-from-abbr","example"],["timezone_name_from_abbr","function.timezone-name-from-abbr","refentry"],["timezone_name_get","function.timezone-name-get","refentry"],["timezone_offset_get","function.timezone-offset-get","refentry"],["timezone_open","function.timezone-open","refentry"],["timezone_transitions_get","function.timezone-transitions-get","refentry"],["","function.timezone-version-get","example"],["timezone_version_get","function.timezone-version-get","refentry"],["","ref.datetime","reference"],["","datetime.formats.time","section"],["","datetime.formats.date","section"],["","datetime.formats.compound","section"],["","datetime.formats.relative","section"],["","datetime.formats","chapter"],["","timezones.africa","sect1"],["","timezones.america","sect1"],["","timezones.antarctica","sect1"],["","timezones.arctic","sect1"],["","timezones.asia","sect1"],["","timezones.atlantic","sect1"],["","timezones.australia","sect1"],["","timezones.europe","sect1"],["","timezones.indian","sect1"],["","timezones.pacific","sect1"],["","timezones.others","sect1"],["","timezones","appendix"],["Date\/Time","book.datetime","book"],["","refs.calendar","set"],["","intro.dio","preface"],["","dio.requirements","section"],["","dio.installation","section"],["","dio.configuration","section"],["","dio.resources","section"],["","dio.setup","chapter"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","varlistentry"],["","dio.constants","appendix"],["","function.dio-close","example"],["dio_close","function.dio-close","refentry"],["","function.dio-fcntl","example"],["dio_fcntl","function.dio-fcntl","refentry"],["","function.dio-open","example"],["dio_open","function.dio-open","refentry"],["dio_read","function.dio-read","refentry"],["","function.dio-seek","example"],["dio_seek","function.dio-seek","refentry"],["dio_stat","function.dio-stat","refentry"],["","function.dio-tcsetattr","example"],["dio_tcsetattr","function.dio-tcsetattr","refentry"],["dio_truncate","function.dio-truncate","refentry"],["dio_write","function.dio-write","refentry"],["","ref.dio","reference"],["","book.dio","book"],["","dir.requirements","section"],["","dir.installation","section"],["","dir.configuration","section"],["","dir.resources","section"],["","dir.setup","chapter"],["","dir.constants","varlistentry"],["","dir.constants","varlistentry"],["","dir.constants","varlistentry"],["","dir.constants","varlistentry"],["","dir.constants","varlistentry"],["","dir.constants","appendix"],["","class.directory","section"],["","class.directory","section"],["","class.directory","varlistentry"],["","class.directory","varlistentry"],["","class.directory","section"],["Directory::close","directory.close","refentry"],["Directory::read","directory.read","refentry"],["Directory::rewind","directory.rewind","refentry"],["Directory","class.directory","phpdoc:classref"],["","function.chdir","example"],["chdir","function.chdir","refentry"],["","function.chroot","example"],["chroot","function.chroot","refentry"],["","function.closedir","example"],["closedir","function.closedir","refentry"],["","function.dir","example"],["dir","function.dir","refentry"],["","function.getcwd","example"],["getcwd","function.getcwd","refentry"],["","function.opendir","example"],["opendir","function.opendir","refentry"],["","function.readdir","example"],["","function.readdir","example"],["readdir","function.readdir","refentry"],["rewinddir","function.rewinddir","refentry"],["","function.scandir","example"],["","function.scandir","example"],["scandir","function.scandir","refentry"],["","ref.dir","reference"],["","book.dir","book"],["","intro.fileinfo","preface"],["","fileinfo.requirements","section"],["","fileinfo.installation","section"],["","fileinfo.configuration","section"],["","fileinfo.resources","section"],["","fileinfo.setup","chapter"],["","fileinfo.constants","varlistentry"],["","fileinfo.constants","varlistentry"],["","fileinfo.constants","varlistentry"],["","fileinfo.constants","varlistentry"],["","fileinfo.constants","varlistentry"],["","fileinfo.constants","varlistentry"],["","fileinfo.constants","varlistentry"],["","fileinfo.constants","varlistentry"],["","fileinfo.constants","varlistentry"],["","fileinfo.constants","varlistentry"],["","fileinfo.constants","appendix"],["","function.finfo-buffer","example"],["finfo_buffer","function.finfo-buffer","refentry"],["finfo_close","function.finfo-close","refentry"],["","function.finfo-file","example"],["finfo_file","function.finfo-file","refentry"],["","function.finfo-open","example"],["","function.finfo-open","example"],["finfo_open","function.finfo-open","refentry"],["finfo_set_flags","function.finfo-set-flags","refentry"],["","function.mime-content-type","example"],["mime_content_type","function.mime-content-type","refentry"],["","ref.fileinfo","reference"],["Fileinfo","book.fileinfo","book"],["","intro.filesystem","preface"],["","filesystem.requirements","section"],["","filesystem.installation","section"],["","filesystem.configuration","varlistentry"],["","filesystem.configuration","varlistentry"],["","filesystem.configuration","varlistentry"],["","filesystem.configuration","varlistentry"],["","filesystem.configuration","varlistentry"],["","filesystem.configuration","varlistentry"],["","filesystem.configuration","section"],["","filesystem.resources","section"],["","filesystem.setup","chapter"],["","filesystem.constants","varlistentry"],["","filesystem.constants","varlistentry"],["","filesystem.constants","varlistentry"],["","filesystem.constants","varlistentry"],["","filesystem.constants","varlistentry"],["","filesystem.constants","varlistentry"],["","filesystem.constants","varlistentry"],["","filesystem.constants","varlistentry"],["","filesystem.constants","varlistentry"],["","filesystem.constants","varlistentry"],["","filesystem.constants","varlistentry"],["","filesystem.constants","varlistentry"],["","filesystem.constants","varlistentry"],["","filesystem.constants","varlistentry"],["","filesystem.constants","varlistentry"],["","filesystem.constants","varlistentry"],["","filesystem.constants","varlistentry"],["","filesystem.constants","varlistentry"],["","filesystem.constants","varlistentry"],["","filesystem.constants","varlistentry"],["","filesystem.constants","varlistentry"],["","filesystem.constants","varlistentry"],["","filesystem.constants","varlistentry"],["","filesystem.constants","varlistentry"],["","filesystem.constants","varlistentry"],["","filesystem.constants","varlistentry"],["","filesystem.constants","varlistentry"],["","filesystem.constants","varlistentry"],["","filesystem.constants","varlistentry"],["","filesystem.constants","varlistentry"],["","filesystem.constants","varlistentry"],["","filesystem.constants","appendix"],["","function.basename","example"],["basename","function.basename","refentry"],["","function.chgrp","example"],["chgrp","function.chgrp","refentry"],["chmod","function.chmod","refentry"],["","function.chown","example"],["chown","function.chown","refentry"],["","function.clearstatcache","example"],["clearstatcache","function.clearstatcache","refentry"],["","function.copy","example"],["copy","function.copy","refentry"],["delete","function.delete","refentry"],["","function.dirname","example"],["dirname","function.dirname","refentry"],["","function.disk-free-space","example"],["disk_free_space","function.disk-free-space","refentry"],["","function.disk-total-space","example"],["disk_total_space","function.disk-total-space","refentry"],["diskfreespace","function.diskfreespace","refentry"],["","function.fclose","example"],["fclose","function.fclose","refentry"],["","function.feof","example"],["","function.feof","example"],["feof","function.feof","refentry"],["","function.fflush","example"],["fflush","function.fflush","refentry"],["","function.fgetc","example"],["fgetc","function.fgetc","refentry"],["","function.fgetcsv","example"],["fgetcsv","function.fgetcsv","refentry"],["","function.fgets","example"],["fgets","function.fgets","refentry"],["","function.fgetss","example"],["fgetss","function.fgetss","refentry"],["","function.file-exists","example"],["file_exists","function.file-exists","refentry"],["","function.file-get-contents","example"],["","function.file-get-contents","example"],["","function.file-get-contents","example"],["","function.file-get-contents","example"],["file_get_contents","function.file-get-contents","refentry"],["","function.file-put-contents","example"],["","function.file-put-contents","example"],["file_put_contents","function.file-put-contents","refentry"],["","function.file","example"],["file","function.file","refentry"],["","function.fileatime","example"],["fileatime","function.fileatime","refentry"],["","function.filectime","example"],["filectime","function.filectime","refentry"],["","function.filegroup","example"],["filegroup","function.filegroup","refentry"],["","function.fileinode","example"],["fileinode","function.fileinode","refentry"],["","function.filemtime","example"],["filemtime","function.filemtime","refentry"],["","function.fileowner","example"],["fileowner","function.fileowner","refentry"],["","function.fileperms","example"],["","function.fileperms","example"],["fileperms","function.fileperms","refentry"],["","function.filesize","example"],["filesize","function.filesize","refentry"],["","function.filetype","example"],["filetype","function.filetype","refentry"],["","function.flock","example"],["","function.flock","example"],["flock","function.flock","refentry"],["","function.fnmatch","example"],["fnmatch","function.fnmatch","refentry"],["","function.fopen","example"],["fopen","function.fopen","refentry"],["","function.fpassthru","example"],["fpassthru","function.fpassthru","refentry"],["","function.fputcsv","example"],["fputcsv","function.fputcsv","refentry"],["fputs","function.fputs","refentry"],["","function.fread","example"],["","function.fread","example"],["","function.fread","example"],["fread","function.fread","refentry"],["","function.fscanf","example"],["","function.fscanf","example"],["fscanf","function.fscanf","refentry"],["","function.fseek","example"],["fseek","function.fseek","refentry"],["","function.fstat","example"],["fstat","function.fstat","refentry"],["","function.ftell","example"],["ftell","function.ftell","refentry"],["","function.ftruncate","example"],["ftruncate","function.ftruncate","refentry"],["","function.fwrite","example"],["fwrite","function.fwrite","refentry"],["","function.glob","example"],["glob","function.glob","refentry"],["","function.is-dir","example"],["is_dir","function.is-dir","refentry"],["","function.is-executable","example"],["is_executable","function.is-executable","refentry"],["","function.is-file","example"],["is_file","function.is-file","refentry"],["","function.is-link","example"],["is_link","function.is-link","refentry"],["","function.is-readable","example"],["is_readable","function.is-readable","refentry"],["","function.is-uploaded-file","example"],["is_uploaded_file","function.is-uploaded-file","refentry"],["","function.is-writable","example"],["is_writable","function.is-writable","refentry"],["is_writeable","function.is-writeable","refentry"],["","function.lchgrp","example"],["lchgrp","function.lchgrp","refentry"],["","function.lchown","example"],["lchown","function.lchown","refentry"],["","function.link","example"],["link","function.link","refentry"],["","function.linkinfo","example"],["linkinfo","function.linkinfo","refentry"],["","function.lstat","example"],["lstat","function.lstat","refentry"],["","function.mkdir","example"],["","function.mkdir","example"],["mkdir","function.mkdir","refentry"],["","function.move-uploaded-file","example"],["move_uploaded_file","function.move-uploaded-file","refentry"],["","function.parse-ini-file","example"],["","function.parse-ini-file","example"],["","function.parse-ini-file","example"],["parse_ini_file","function.parse-ini-file","refentry"],["parse_ini_string","function.parse-ini-string","refentry"],["","function.pathinfo","example"],["","function.pathinfo","example"],["pathinfo","function.pathinfo","refentry"],["","function.pclose","example"],["pclose","function.pclose","refentry"],["","function.popen","example"],["","function.popen","example"],["popen","function.popen","refentry"],["","function.readfile","example"],["readfile","function.readfile","refentry"],["","function.readlink","example"],["readlink","function.readlink","refentry"],["","function.realpath-cache-get","example"],["realpath_cache_get","function.realpath-cache-get","refentry"],["","function.realpath-cache-size","example"],["realpath_cache_size","function.realpath-cache-size","refentry"],["","function.realpath","example"],["","function.realpath","example"],["realpath","function.realpath","refentry"],["","function.rename","example"],["rename","function.rename","refentry"],["","function.rewind","example"],["rewind","function.rewind","refentry"],["","function.rmdir","example"],["rmdir","function.rmdir","refentry"],["set_file_buffer","function.set-file-buffer","refentry"],["","function.stat","example"],["","function.stat","example"],["stat","function.stat","refentry"],["","function.symlink","example"],["symlink","function.symlink","refentry"],["","function.tempnam","example"],["tempnam","function.tempnam","refentry"],["","function.tmpfile","example"],["tmpfile","function.tmpfile","refentry"],["","function.touch","example"],["","function.touch","example"],["touch","function.touch","refentry"],["","function.umask","example"],["umask","function.umask","refentry"],["","function.unlink","example"],["unlink","function.unlink","refentry"],["","ref.filesystem","reference"],["","book.filesystem","book"],["","intro.inotify","preface"],["","inotify.requirements","section"],["","inotify.install","section"],["","inotify.configuration","section"],["","inotify.resources","section"],["","inotify.setup","chapter"],["","inotify.constants","varlistentry"],["","inotify.constants","varlistentry"],["","inotify.constants","varlistentry"],["","inotify.constants","varlistentry"],["","inotify.constants","varlistentry"],["","inotify.constants","varlistentry"],["","inotify.constants","varlistentry"],["","inotify.constants","varlistentry"],["","inotify.constants","varlistentry"],["","inotify.constants","varlistentry"],["","inotify.constants","varlistentry"],["","inotify.constants","varlistentry"],["","inotify.constants","varlistentry"],["","inotify.constants","varlistentry"],["","inotify.constants","varlistentry"],["","inotify.constants","varlistentry"],["","inotify.constants","varlistentry"],["","inotify.constants","varlistentry"],["","inotify.constants","varlistentry"],["","inotify.constants","varlistentry"],["","inotify.constants","varlistentry"],["","inotify.constants","varlistentry"],["","inotify.constants","varlistentry"],["","inotify.constants","variablelist"],["","inotify.constants","appendix"],["inotify_add_watch","function.inotify-add-watch","refentry"],["","function.inotify-init","example"],["inotify_init","function.inotify-init","refentry"],["inotify_queue_len","function.inotify-queue-len","refentry"],["inotify_read","function.inotify-read","refentry"],["inotify_rm_watch","function.inotify-rm-watch","refentry"],["","ref.inotify","reference"],["","book.inotify","book"],["","intro.mime-magic","preface"],["","mime-magic.requirements","section"],["","mime-magic.installation","example"],["","mime-magic.installation","section"],["","mime-magic.configuration","varlistentry"],["","mime-magic.configuration","varlistentry"],["","mime-magic.configuration","section"],["","mime-magic.resources","section"],["","mime-magic.setup","chapter"],["","mime-magic.constants","appendix"],["","book.mime-magic","book"],["","intro.proctitle","preface"],["","proctitle.requirements","section"],["","proctitle.installation","section"],["","proctitle.configuration","section"],["","proctitle.resources","section"],["","proctitle.setup","chapter"],["","proctitle.constants","appendix"],["","function.setproctitle","example"],["setproctitle","function.setproctitle","refentry"],["","function.setthreadtitle","example"],["setthreadtitle","function.setthreadtitle","refentry"],["","ref.proctitle","reference"],["Proctitle","book.proctitle","book"],["","intro.xattr","preface"],["","xattr.requirements","section"],["","xattr.installation","section"],["","xattr.configuration","section"],["","xattr.resources","section"],["","xattr.setup","chapter"],["","xattr.constants","varlistentry"],["","xattr.constants","varlistentry"],["","xattr.constants","varlistentry"],["","xattr.constants","varlistentry"],["","xattr.constants","appendix"],["","function.xattr-get","example"],["xattr_get","function.xattr-get","refentry"],["","function.xattr-list","example"],["xattr_list","function.xattr-list","refentry"],["","function.xattr-remove","example"],["xattr_remove","function.xattr-remove","refentry"],["","function.xattr-set","example"],["xattr_set","function.xattr-set","refentry"],["","function.xattr-supported","example"],["xattr_supported","function.xattr-supported","refentry"],["","ref.xattr","reference"],["","book.xattr","book"],["","intro.xdiff","preface"],["","xdiff.requirements","section"],["","xdiff.installation","section"],["","xdiff.configuration","section"],["","xdiff.resources","section"],["","xdiff.setup","chapter"],["","xdiff.constants","varlistentry"],["","xdiff.constants","varlistentry"],["","xdiff.constants","appendix"],["","function.xdiff-file-bdiff-size","example"],["xdiff_file_bdiff_size","function.xdiff-file-bdiff-size","refentry"],["","function.xdiff-file-bdiff","example"],["xdiff_file_bdiff","function.xdiff-file-bdiff","refentry"],["","function.xdiff-file-bpatch","example"],["xdiff_file_bpatch","function.xdiff-file-bpatch","refentry"],["","function.xdiff-file-diff-binary","example"],["xdiff_file_diff_binary","function.xdiff-file-diff-binary","refentry"],["","function.xdiff-file-diff","example"],["xdiff_file_diff","function.xdiff-file-diff","refentry"],["","function.xdiff-file-merge3","example"],["xdiff_file_merge3","function.xdiff-file-merge3","refentry"],["","function.xdiff-file-patch-binary","example"],["xdiff_file_patch_binary","function.xdiff-file-patch-binary","refentry"],["","function.xdiff-file-patch","example"],["","function.xdiff-file-patch","example"],["xdiff_file_patch","function.xdiff-file-patch","refentry"],["","function.xdiff-file-rabdiff","example"],["xdiff_file_rabdiff","function.xdiff-file-rabdiff","refentry"],["","function.xdiff-string-bdiff-size","example"],["xdiff_string_bdiff_size","function.xdiff-string-bdiff-size","refentry"],["xdiff_string_bdiff","function.xdiff-string-bdiff","refentry"],["xdiff_string_bpatch","function.xdiff-string-bpatch","refentry"],["xdiff_string_diff_binary","function.xdiff-string-diff-binary","refentry"],["","function.xdiff-string-diff","example"],["xdiff_string_diff","function.xdiff-string-diff","refentry"],["xdiff_string_merge3","function.xdiff-string-merge3","refentry"],["xdiff_string_patch_binary","function.xdiff-string-patch-binary","refentry"],["","function.xdiff-string-patch","example"],["xdiff_string_patch","function.xdiff-string-patch","refentry"],["xdiff_string_rabdiff","function.xdiff-string-rabdiff","refentry"],["","ref.xdiff","reference"],["","book.xdiff","book"],["","refs.fileprocess.file","set"],["","intro.enchant","preface"],["","enchant.requirements","section"],["","enchant.installation","section"],["","enchant.configuration","section"],["","enchant.resources","section"],["","enchant.setup","chapter"],["","enchant.constants","appendix"],["","enchant.examples","example"],["","enchant.examples","appendix"],["","function.enchant-broker-describe","example"],["enchant_broker_describe","function.enchant-broker-describe","refentry"],["","function.enchant-broker-dict-exists","example"],["enchant_broker_dict_exists","function.enchant-broker-dict-exists","refentry"],["enchant_broker_free_dict","function.enchant-broker-free-dict","refentry"],["enchant_broker_free","function.enchant-broker-free","refentry"],["enchant_broker_get_error","function.enchant-broker-get-error","refentry"],["enchant_broker_init","function.enchant-broker-init","refentry"],["","function.enchant-broker-list-dicts","example"],["enchant_broker_list_dicts","function.enchant-broker-list-dicts","refentry"],["","function.enchant-broker-request-dict","example"],["enchant_broker_request_dict","function.enchant-broker-request-dict","refentry"],["enchant_broker_request_pwl_dict","function.enchant-broker-request-pwl-dict","refentry"],["enchant_broker_set_ordering","function.enchant-broker-set-ordering","refentry"],["enchant_dict_add_to_personal","function.enchant-dict-add-to-personal","refentry"],["enchant_dict_add_to_session","function.enchant-dict-add-to-session","refentry"],["enchant_dict_check","function.enchant-dict-check","refentry"],["","function.enchant-dict-describe","example"],["enchant_dict_describe","function.enchant-dict-describe","refentry"],["enchant_dict_get_error","function.enchant-dict-get-error","refentry"],["enchant_dict_is_in_session","function.enchant-dict-is-in-session","refentry"],["","function.enchant-dict-quick-check","example"],["enchant_dict_quick_check","function.enchant-dict-quick-check","refentry"],["enchant_dict_store_replacement","function.enchant-dict-store-replacement","refentry"],["","function.enchant-dict-suggest","example"],["enchant_dict_suggest","function.enchant-dict-suggest","refentry"],["","ref.enchant","reference"],["Enchant","book.enchant","book"],["","intro.fribidi","preface"],["","fribidi.requirements","section"],["","fribidi.installation","section"],["","fribidi.configuration","section"],["","fribidi.resources","section"],["","fribidi.setup","chapter"],["","fribidi.constants","varlistentry"],["","fribidi.constants","varlistentry"],["","fribidi.constants","varlistentry"],["","fribidi.constants","varlistentry"],["","fribidi.constants","varlistentry"],["","fribidi.constants","varlistentry"],["","fribidi.constants","varlistentry"],["","fribidi.constants","varlistentry"],["","fribidi.constants","varlistentry"],["","fribidi.constants","varlistentry"],["","fribidi.constants","appendix"],["fribidi_log2vis","function.fribidi-log2vis","refentry"],["","ref.fribidi","reference"],["","book.fribidi","book"],["","intro.gender","preface"],["","gender.installation","section"],["","gender.setup","chapter"],["","gender.example.admin","example"],["","gender.example.admin","section"],["","gender.examples","chapter"],["","class.gender","section"],["","class.gender","section"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","varlistentry"],["","class.gender","section"],["Gender\\Gender::connect","gender-gender.connect","refentry"],["Gender\\Gender::__construct","gender-gender.construct","refentry"],["","gender-gender.country","example"],["Gender\\Gender::country","gender-gender.country","refentry"],["Gender\\Gender::get","gender-gender.get","refentry"],["Gender\\Gender::isNick","gender-gender.isnick","refentry"],["Gender\\Gender::similarNames","gender-gender.similarnames","refentry"],["Gender\\Gender","class.gender","phpdoc:classref"],["Gender","book.gender","book"],["","intro.gettext","preface"],["","gettext.requirements","section"],["","gettext.installation","section"],["","gettext.configuration","section"],["","gettext.resources","section"],["","gettext.setup","chapter"],["","gettext.constants","appendix"],["bind_textdomain_codeset","function.bind-textdomain-codeset","refentry"],["","function.bindtextdomain","example"],["bindtextdomain","function.bindtextdomain","refentry"],["dcgettext","function.dcgettext","refentry"],["dcngettext","function.dcngettext","refentry"],["dgettext","function.dgettext","refentry"],["dngettext","function.dngettext","refentry"],["","function.gettext","example"],["gettext","function.gettext","refentry"],["","function.ngettext","example"],["ngettext","function.ngettext","refentry"],["textdomain","function.textdomain","refentry"],["","ref.gettext","reference"],["","book.gettext","book"],["","intro.iconv","preface"],["","iconv.requirements","section"],["","iconv.installation","section"],["","iconv.configuration","varlistentry"],["","iconv.configuration","varlistentry"],["","iconv.configuration","varlistentry"],["","iconv.configuration","section"],["","iconv.resources","section"],["","iconv.setup","chapter"],["","iconv.constants","appendix"],["","function.iconv-get-encoding","example"],["iconv_get_encoding","function.iconv-get-encoding","refentry"],["","function.iconv-mime-decode-headers","example"],["iconv_mime_decode_headers","function.iconv-mime-decode-headers","refentry"],["","function.iconv-mime-decode","example"],["iconv_mime_decode","function.iconv-mime-decode","refentry"],["","function.iconv-mime-encode","example"],["iconv_mime_encode","function.iconv-mime-encode","refentry"],["","function.iconv-set-encoding","example"],["iconv_set_encoding","function.iconv-set-encoding","refentry"],["iconv_strlen","function.iconv-strlen","refentry"],["iconv_strpos","function.iconv-strpos","refentry"],["iconv_strrpos","function.iconv-strrpos","refentry"],["iconv_substr","function.iconv-substr","refentry"],["","function.iconv","example"],["iconv","function.iconv","refentry"],["","function.ob-iconv-handler","example"],["ob_iconv_handler","function.ob-iconv-handler","refentry"],["","ref.iconv","reference"],["","book.iconv","book"],["","intro.intl","section"],["","intro.intl","preface"],["","intl.requirements","section"],["","intl.installation","section"],["","intl.configuration","varlistentry"],["","intl.configuration","varlistentry"],["","intl.configuration","varlistentry"],["","intl.configuration","section"],["","intl.resources","section"],["","intl.setup","chapter"],["","intl.constants","varlistentry"],["","intl.constants","varlistentry"],["","intl.constants","varlistentry"],["","intl.constants","varlistentry"],["","intl.constants","varlistentry"],["","intl.constants","varlistentry"],["","intl.constants","varlistentry"],["","intl.constants","varlistentry"],["","intl.constants","varlistentry"],["","intl.constants","varlistentry"],["","intl.constants","varlistentry"],["","intl.constants","appendix"],["","intl.examples.basic","example"],["","intl.examples.basic","example"],["","intl.examples.basic","section"],["","intl.examples","chapter"],["","class.collator","section"],["","class.collator","section"],["","class.collator","example"],["","class.collator","varlistentry"],["","class.collator","example"],["","class.collator","varlistentry"],["","class.collator","example"],["","class.collator","varlistentry"],["","class.collator","example"],["","class.collator","varlistentry"],["","class.collator","varlistentry"],["","class.collator","varlistentry"],["","class.collator","varlistentry"],["","class.collator","varlistentry"],["","class.collator","varlistentry"],["","class.collator","varlistentry"],["","class.collator","varlistentry"],["","class.collator","varlistentry"],["","class.collator","varlistentry"],["","class.collator","varlistentry"],["","class.collator","varlistentry"],["","class.collator","varlistentry"],["","class.collator","varlistentry"],["","class.collator","varlistentry"],["","class.collator","varlistentry"],["","class.collator","varlistentry"],["","class.collator","varlistentry"],["","class.collator","section"],["","collator.asort","example"],["Collator::asort","collator.asort","refentry"],["","collator.compare","example"],["Collator::compare","collator.compare","refentry"],["","collator.construct","example"],["Collator::__construct","collator.construct","refentry"],["","collator.create","example"],["Collator::create","collator.create","refentry"],["","collator.getattribute","example"],["Collator::getAttribute","collator.getattribute","refentry"],["","collator.geterrorcode","example"],["Collator::getErrorCode","collator.geterrorcode","refentry"],["","collator.geterrormessage","example"],["Collator::getErrorMessage","collator.geterrormessage","refentry"],["","collator.getlocale","example"],["Collator::getLocale","collator.getlocale","refentry"],["","collator.getsortkey","example"],["Collator::getSortKey","collator.getsortkey","refentry"],["","collator.getstrength","example"],["Collator::getStrength","collator.getstrength","refentry"],["","collator.setattribute","example"],["Collator::setAttribute","collator.setattribute","refentry"],["","collator.setstrength","example"],["Collator::setStrength","collator.setstrength","refentry"],["","collator.sortwithsortkeys","example"],["Collator::sortWithSortKeys","collator.sortwithsortkeys","refentry"],["","collator.sort","example"],["Collator::sort","collator.sort","refentry"],["Collator","class.collator","phpdoc:classref"],["","class.numberformatter","section"],["","class.numberformatter","section"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","section"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","section"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","section"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","section"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","section"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","section"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","varlistentry"],["","class.numberformatter","section"],["","class.numberformatter","section"],["","class.numberformatter","section"],["","numberformatter.create","example"],["","numberformatter.create","example"],["NumberFormatter::create","numberformatter.create","refentry"],["","numberformatter.formatcurrency","example"],["","numberformatter.formatcurrency","example"],["NumberFormatter::formatCurrency","numberformatter.formatcurrency","refentry"],["","numberformatter.format","example"],["","numberformatter.format","example"],["NumberFormatter::format","numberformatter.format","refentry"],["","numberformatter.getattribute","example"],["","numberformatter.getattribute","example"],["NumberFormatter::getAttribute","numberformatter.getattribute","refentry"],["","numberformatter.geterrorcode","example"],["","numberformatter.geterrorcode","example"],["NumberFormatter::getErrorCode","numberformatter.geterrorcode","refentry"],["","numberformatter.geterrormessage","example"],["","numberformatter.geterrormessage","example"],["NumberFormatter::getErrorMessage","numberformatter.geterrormessage","refentry"],["","numberformatter.getlocale","example"],["NumberFormatter::getLocale","numberformatter.getlocale","refentry"],["","numberformatter.getpattern","example"],["","numberformatter.getpattern","example"],["NumberFormatter::getPattern","numberformatter.getpattern","refentry"],["","numberformatter.getsymbol","example"],["","numberformatter.getsymbol","example"],["NumberFormatter::getSymbol","numberformatter.getsymbol","refentry"],["","numberformatter.gettextattribute","example"],["","numberformatter.gettextattribute","example"],["NumberFormatter::getTextAttribute","numberformatter.gettextattribute","refentry"],["","numberformatter.parsecurrency","example"],["","numberformatter.parsecurrency","example"],["NumberFormatter::parseCurrency","numberformatter.parsecurrency","refentry"],["","numberformatter.parse","example"],["","numberformatter.parse","example"],["NumberFormatter::parse","numberformatter.parse","refentry"],["","numberformatter.setattribute","example"],["","numberformatter.setattribute","example"],["NumberFormatter::setAttribute","numberformatter.setattribute","refentry"],["","numberformatter.setpattern","example"],["","numberformatter.setpattern","example"],["NumberFormatter::setPattern","numberformatter.setpattern","refentry"],["","numberformatter.setsymbol","example"],["","numberformatter.setsymbol","example"],["NumberFormatter::setSymbol","numberformatter.setsymbol","refentry"],["","numberformatter.settextattribute","example"],["","numberformatter.settextattribute","example"],["NumberFormatter::setTextAttribute","numberformatter.settextattribute","refentry"],["NumberFormatter","class.numberformatter","phpdoc:classref"],["","class.locale","section"],["","class.locale","section"],["","class.locale","varlistentry"],["","class.locale","varlistentry"],["","class.locale","varlistentry"],["","class.locale","varlistentry"],["","class.locale","varlistentry"],["","class.locale","varlistentry"],["","class.locale","varlistentry"],["","class.locale","varlistentry"],["","class.locale","varlistentry"],["","class.locale","varlistentry"],["","class.locale","section"],["","class.locale","section"],["","class.locale","section"],["","locale.acceptfromhttp","example"],["","locale.acceptfromhttp","example"],["Locale::acceptFromHttp","locale.acceptfromhttp","refentry"],["Locale::canonicalize","locale.canonicalize","refentry"],["","locale.composelocale","example"],["","locale.composelocale","example"],["Locale::composeLocale","locale.composelocale","refentry"],["","locale.filtermatches","example"],["","locale.filtermatches","example"],["Locale::filterMatches","locale.filtermatches","refentry"],["","locale.getallvariants","example"],["","locale.getallvariants","example"],["Locale::getAllVariants","locale.getallvariants","refentry"],["","locale.getdefault","example"],["","locale.getdefault","example"],["Locale::getDefault","locale.getdefault","refentry"],["","locale.getdisplaylanguage","example"],["","locale.getdisplaylanguage","example"],["Locale::getDisplayLanguage","locale.getdisplaylanguage","refentry"],["","locale.getdisplayname","example"],["","locale.getdisplayname","example"],["Locale::getDisplayName","locale.getdisplayname","refentry"],["","locale.getdisplayregion","example"],["","locale.getdisplayregion","example"],["Locale::getDisplayRegion","locale.getdisplayregion","refentry"],["","locale.getdisplayscript","example"],["","locale.getdisplayscript","example"],["Locale::getDisplayScript","locale.getdisplayscript","refentry"],["","locale.getdisplayvariant","example"],["","locale.getdisplayvariant","example"],["Locale::getDisplayVariant","locale.getdisplayvariant","refentry"],["","locale.getkeywords","example"],["","locale.getkeywords","example"],["Locale::getKeywords","locale.getkeywords","refentry"],["","locale.getprimarylanguage","example"],["","locale.getprimarylanguage","example"],["Locale::getPrimaryLanguage","locale.getprimarylanguage","refentry"],["","locale.getregion","example"],["","locale.getregion","example"],["Locale::getRegion","locale.getregion","refentry"],["","locale.getscript","example"],["","locale.getscript","example"],["Locale::getScript","locale.getscript","refentry"],["","locale.lookup","example"],["","locale.lookup","example"],["Locale::lookup","locale.lookup","refentry"],["","locale.parselocale","example"],["","locale.parselocale","example"],["Locale::parseLocale","locale.parselocale","refentry"],["","locale.setdefault","example"],["","locale.setdefault","example"],["Locale::setDefault","locale.setdefault","refentry"],["Locale","class.locale","phpdoc:classref"],["","class.normalizer","section"],["","class.normalizer","section"],["","class.normalizer","varlistentry"],["","class.normalizer","varlistentry"],["","class.normalizer","varlistentry"],["","class.normalizer","varlistentry"],["","class.normalizer","varlistentry"],["","class.normalizer","varlistentry"],["","class.normalizer","section"],["","class.normalizer","section"],["","normalizer.isnormalized","example"],["","normalizer.isnormalized","example"],["Normalizer::isNormalized","normalizer.isnormalized","refentry"],["","normalizer.normalize","example"],["","normalizer.normalize","example"],["Normalizer::normalize","normalizer.normalize","refentry"],["Normalizer","class.normalizer","phpdoc:classref"],["","class.messageformatter","section"],["","class.messageformatter","section"],["","class.messageformatter","section"],["","messageformatter.create","example"],["","messageformatter.create","example"],["MessageFormatter::create","messageformatter.create","refentry"],["","messageformatter.formatmessage","example"],["","messageformatter.formatmessage","example"],["MessageFormatter::formatMessage","messageformatter.formatmessage","refentry"],["","messageformatter.format","example"],["","messageformatter.format","example"],["MessageFormatter::format","messageformatter.format","refentry"],["","messageformatter.geterrorcode","example"],["","messageformatter.geterrorcode","example"],["MessageFormatter::getErrorCode","messageformatter.geterrorcode","refentry"],["","messageformatter.geterrormessage","example"],["","messageformatter.geterrormessage","example"],["MessageFormatter::getErrorMessage","messageformatter.geterrormessage","refentry"],["","messageformatter.getlocale","example"],["","messageformatter.getlocale","example"],["MessageFormatter::getLocale","messageformatter.getlocale","refentry"],["","messageformatter.getpattern","example"],["","messageformatter.getpattern","example"],["MessageFormatter::getPattern","messageformatter.getpattern","refentry"],["","messageformatter.parsemessage","example"],["","messageformatter.parsemessage","example"],["MessageFormatter::parseMessage","messageformatter.parsemessage","refentry"],["","messageformatter.parse","example"],["","messageformatter.parse","example"],["MessageFormatter::parse","messageformatter.parse","refentry"],["","messageformatter.setpattern","example"],["","messageformatter.setpattern","example"],["MessageFormatter::setPattern","messageformatter.setpattern","refentry"],["MessageFormatter","class.messageformatter","phpdoc:classref"],["","class.intlcalendar","section"],["","class.intlcalendar","section"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","varlistentry"],["","class.intlcalendar","section"],["","intlcalendar.add","example"],["IntlCalendar::add","intlcalendar.add","refentry"],["","intlcalendar.after","example"],["IntlCalendar::after","intlcalendar.after","refentry"],["IntlCalendar::before","intlcalendar.before","refentry"],["","intlcalendar.clear","example"],["IntlCalendar::clear","intlcalendar.clear","refentry"],["IntlCalendar::__construct","intlcalendar.construct","refentry"],["","intlcalendar.createinstance","example"],["IntlCalendar::createInstance","intlcalendar.createinstance","refentry"],["","intlcalendar.equals","example"],["IntlCalendar::equals","intlcalendar.equals","refentry"],["","intlcalendar.fielddifference","example"],["IntlCalendar::fieldDifference","intlcalendar.fielddifference","refentry"],["","intlcalendar.fromdatetime","example"],["IntlCalendar::fromDateTime","intlcalendar.fromdatetime","refentry"],["","intlcalendar.get","example"],["IntlCalendar::get","intlcalendar.get","refentry"],["","intlcalendar.getactualmaximum","example"],["IntlCalendar::getActualMaximum","intlcalendar.getactualmaximum","refentry"],["IntlCalendar::getActualMinimum","intlcalendar.getactualminimum","refentry"],["","intlcalendar.getavailablelocales","example"],["IntlCalendar::getAvailableLocales","intlcalendar.getavailablelocales","refentry"],["","intlcalendar.getdayofweektype","example"],["IntlCalendar::getDayOfWeekType","intlcalendar.getdayofweektype","refentry"],["","intlcalendar.geterrorcode","example"],["IntlCalendar::getErrorCode","intlcalendar.geterrorcode","refentry"],["","intlcalendar.geterrormessage","example"],["IntlCalendar::getErrorMessage","intlcalendar.geterrormessage","refentry"],["","intlcalendar.getfirstdayofweek","example"],["IntlCalendar::getFirstDayOfWeek","intlcalendar.getfirstdayofweek","refentry"],["IntlCalendar::getGreatestMinimum","intlcalendar.getgreatestminimum","refentry"],["","intlcalendar.getkeywordvaluesforlocale","example"],["IntlCalendar::getKeywordValuesForLocale","intlcalendar.getkeywordvaluesforlocale","refentry"],["","intlcalendar.getleastmaximum","example"],["IntlCalendar::getLeastMaximum","intlcalendar.getleastmaximum","refentry"],["","intlcalendar.getlocale","example"],["IntlCalendar::getLocale","intlcalendar.getlocale","refentry"],["IntlCalendar::getMaximum","intlcalendar.getmaximum","refentry"],["","intlcalendar.getminimaldaysinfirstweek","example"],["IntlCalendar::getMinimalDaysInFirstWeek","intlcalendar.getminimaldaysinfirstweek","refentry"],["IntlCalendar::getMinimum","intlcalendar.getminimum","refentry"],["","intlcalendar.getnow","example"],["IntlCalendar::getNow","intlcalendar.getnow","refentry"],["","intlcalendar.getrepeatedwalltimeoption","example"],["IntlCalendar::getRepeatedWallTimeOption","intlcalendar.getrepeatedwalltimeoption","refentry"],["","intlcalendar.getskippedwalltimeoption","example"],["IntlCalendar::getSkippedWallTimeOption","intlcalendar.getskippedwalltimeoption","refentry"],["","intlcalendar.gettime","example"],["IntlCalendar::getTime","intlcalendar.gettime","refentry"],["","intlcalendar.gettimezone","example"],["IntlCalendar::getTimeZone","intlcalendar.gettimezone","refentry"],["","intlcalendar.gettype","example"],["IntlCalendar::getType","intlcalendar.gettype","refentry"],["IntlCalendar::getWeekendTransition","intlcalendar.getweekendtransition","refentry"],["","intlcalendar.indaylighttime","example"],["IntlCalendar::inDaylightTime","intlcalendar.indaylighttime","refentry"],["","intlcalendar.isequivalentto","example"],["IntlCalendar::isEquivalentTo","intlcalendar.isequivalentto","refentry"],["","intlcalendar.islenient","example"],["IntlCalendar::isLenient","intlcalendar.islenient","refentry"],["IntlCalendar::isSet","intlcalendar.isset","refentry"],["","intlcalendar.isweekend","example"],["IntlCalendar::isWeekend","intlcalendar.isweekend","refentry"],["","intlcalendar.roll","example"],["IntlCalendar::roll","intlcalendar.roll","refentry"],["","intlcalendar.set","example"],["IntlCalendar::set","intlcalendar.set","refentry"],["","intlcalendar.setfirstdayofweek","example"],["IntlCalendar::setFirstDayOfWeek","intlcalendar.setfirstdayofweek","refentry"],["IntlCalendar::setLenient","intlcalendar.setlenient","refentry"],["IntlCalendar::setMinimalDaysInFirstWeek","intlcalendar.setminimaldaysinfirstweek","refentry"],["IntlCalendar::setRepeatedWallTimeOption","intlcalendar.setrepeatedwalltimeoption","refentry"],["IntlCalendar::setSkippedWallTimeOption","intlcalendar.setskippedwalltimeoption","refentry"],["","intlcalendar.settime","example"],["IntlCalendar::setTime","intlcalendar.settime","refentry"],["","intlcalendar.settimezone","example"],["IntlCalendar::setTimeZone","intlcalendar.settimezone","refentry"],["","intlcalendar.todatetime","example"],["IntlCalendar::toDateTime","intlcalendar.todatetime","refentry"],["IntlCalendar","class.intlcalendar","phpdoc:classref"],["","class.intltimezone","section"],["","class.intltimezone","section"],["","class.intltimezone","varlistentry"],["","class.intltimezone","varlistentry"],["","class.intltimezone","section"],["IntlTimeZone::countEquivalentIDs","intltimezone.countequivalentids","refentry"],["IntlTimeZone::createDefault","intltimezone.createdefault","refentry"],["IntlTimeZone::createEnumeration","intltimezone.createenumeration","refentry"],["IntlTimeZone::createTimeZone","intltimezone.createtimezone","refentry"],["IntlTimeZone::fromDateTimeZone","intltimezone.fromdatetimezone","refentry"],["IntlTimeZone::getCanonicalID","intltimezone.getcanonicalid","refentry"],["IntlTimeZone::getDisplayName","intltimezone.getdisplayname","refentry"],["IntlTimeZone::getDSTSavings","intltimezone.getdstsavings","refentry"],["IntlTimeZone::getEquivalentID","intltimezone.getequivalentid","refentry"],["IntlTimeZone::getErrorCode","intltimezone.geterrorcode","refentry"],["IntlTimeZone::getErrorMessage","intltimezone.geterrormessage","refentry"],["IntlTimeZone::getGMT","intltimezone.getgmt","refentry"],["IntlTimeZone::getID","intltimezone.getid","refentry"],["IntlTimeZone::getOffset","intltimezone.getoffset","refentry"],["IntlTimeZone::getRawOffset","intltimezone.getrawoffset","refentry"],["IntlTimeZone::getTZDataVersion","intltimezone.gettzdataversion","refentry"],["IntlTimeZone::hasSameRules","intltimezone.hassamerules","refentry"],["IntlTimeZone::toDateTimeZone","intltimezone.todatetimezone","refentry"],["IntlTimeZone::useDaylightTime","intltimezone.usedaylighttime","refentry"],["IntlTimeZone","class.intltimezone","phpdoc:classref"],["","class.intldateformatter","section"],["","class.intldateformatter","section"],["","class.intldateformatter","section"],["","class.intldateformatter","varlistentry"],["","class.intldateformatter","varlistentry"],["","class.intldateformatter","varlistentry"],["","class.intldateformatter","varlistentry"],["","class.intldateformatter","varlistentry"],["","class.intldateformatter","varlistentry"],["","class.intldateformatter","varlistentry"],["","class.intldateformatter","para"],["","class.intldateformatter","section"],["","intldateformatter.create","example"],["","intldateformatter.create","example"],["IntlDateFormatter::create","intldateformatter.create","refentry"],["","intldateformatter.format","example"],["","intldateformatter.format","example"],["","intldateformatter.format","example"],["IntlDateFormatter::format","intldateformatter.format","refentry"],["","intldateformatter.formatobject","example"],["IntlDateFormatter::formatObject","intldateformatter.formatobject","refentry"],["","intldateformatter.getcalendar","example"],["","intldateformatter.getcalendar","example"],["IntlDateFormatter::getCalendar","intldateformatter.getcalendar","refentry"],["","intldateformatter.getdatetype","example"],["","intldateformatter.getdatetype","example"],["IntlDateFormatter::getDateType","intldateformatter.getdatetype","refentry"],["","intldateformatter.geterrorcode","example"],["","intldateformatter.geterrorcode","example"],["IntlDateFormatter::getErrorCode","intldateformatter.geterrorcode","refentry"],["","intldateformatter.geterrormessage","example"],["","intldateformatter.geterrormessage","example"],["IntlDateFormatter::getErrorMessage","intldateformatter.geterrormessage","refentry"],["","intldateformatter.getlocale","example"],["","intldateformatter.getlocale","example"],["IntlDateFormatter::getLocale","intldateformatter.getlocale","refentry"],["","intldateformatter.getpattern","example"],["","intldateformatter.getpattern","example"],["IntlDateFormatter::getPattern","intldateformatter.getpattern","refentry"],["","intldateformatter.gettimetype","example"],["","intldateformatter.gettimetype","example"],["IntlDateFormatter::getTimeType","intldateformatter.gettimetype","refentry"],["","intldateformatter.gettimezoneid","example"],["","intldateformatter.gettimezoneid","example"],["IntlDateFormatter::getTimeZoneId","intldateformatter.gettimezoneid","refentry"],["","intldateformatter.getcalendarobject","example"],["IntlDateFormatter::getCalendarObject","intldateformatter.getcalendarobject","refentry"],["","intldateformatter.gettimezone","example"],["IntlDateFormatter::getTimeZone","intldateformatter.gettimezone","refentry"],["","intldateformatter.islenient","example"],["","intldateformatter.islenient","example"],["IntlDateFormatter::isLenient","intldateformatter.islenient","refentry"],["","intldateformatter.localtime","example"],["","intldateformatter.localtime","example"],["IntlDateFormatter::localtime","intldateformatter.localtime","refentry"],["","intldateformatter.parse","example"],["","intldateformatter.parse","example"],["IntlDateFormatter::parse","intldateformatter.parse","refentry"],["","intldateformatter.setcalendar","example"],["","intldateformatter.setcalendar","example"],["","intldateformatter.setcalendar","example"],["IntlDateFormatter::setCalendar","intldateformatter.setcalendar","refentry"],["","intldateformatter.setlenient","example"],["","intldateformatter.setlenient","example"],["IntlDateFormatter::setLenient","intldateformatter.setlenient","refentry"],["","intldateformatter.setpattern","example"],["","intldateformatter.setpattern","example"],["IntlDateFormatter::setPattern","intldateformatter.setpattern","refentry"],["","intldateformatter.settimezoneid","example"],["","intldateformatter.settimezoneid","example"],["IntlDateFormatter::setTimeZoneId","intldateformatter.settimezoneid","refentry"],["","intldateformatter.settimezone","example"],["IntlDateFormatter::setTimeZone","intldateformatter.settimezone","refentry"],["IntlDateFormatter","class.intldateformatter","phpdoc:classref"],["","class.resourcebundle","section"],["","class.resourcebundle","section"],["","class.resourcebundle","section"],["","resourcebundle.count","example"],["","resourcebundle.count","example"],["ResourceBundle::count","resourcebundle.count","refentry"],["","resourcebundle.create","example"],["","resourcebundle.create","example"],["ResourceBundle::create","resourcebundle.create","refentry"],["","resourcebundle.geterrorcode","example"],["","resourcebundle.geterrorcode","example"],["ResourceBundle::getErrorCode","resourcebundle.geterrorcode","refentry"],["","resourcebundle.geterrormessage","example"],["","resourcebundle.geterrormessage","example"],["ResourceBundle::getErrorMessage","resourcebundle.geterrormessage","refentry"],["","resourcebundle.get","example"],["","resourcebundle.get","example"],["ResourceBundle::get","resourcebundle.get","refentry"],["","resourcebundle.locales","example"],["","resourcebundle.locales","example"],["ResourceBundle::getLocales","resourcebundle.locales","refentry"],["ResourceBundle","class.resourcebundle","phpdoc:classref"],["","class.spoofchecker","section"],["","class.spoofchecker","section"],["","class.spoofchecker","varlistentry"],["","class.spoofchecker","varlistentry"],["","class.spoofchecker","varlistentry"],["","class.spoofchecker","varlistentry"],["","class.spoofchecker","varlistentry"],["","class.spoofchecker","varlistentry"],["","class.spoofchecker","varlistentry"],["","class.spoofchecker","section"],["Spoofchecker::areConfusable","spoofchecker.areconfusable","refentry"],["Spoofchecker::__construct","spoofchecker.construct","refentry"],["Spoofchecker::isSuspicious","spoofchecker.issuspicious","refentry"],["Spoofchecker::setAllowedLocales","spoofchecker.setallowedlocales","refentry"],["Spoofchecker::setChecks","spoofchecker.setchecks","refentry"],["Spoofchecker","class.spoofchecker","phpdoc:classref"],["","class.transliterator","section"],["","class.transliterator","section"],["","class.transliterator","varlistentry"],["","class.transliterator","section"],["","class.transliterator","varlistentry"],["","class.transliterator","varlistentry"],["","class.transliterator","section"],["Transliterator::__construct","transliterator.construct","refentry"],["Transliterator::create","transliterator.create","refentry"],["Transliterator::createFromRules","transliterator.createfromrules","refentry"],["Transliterator::createInverse","transliterator.createinverse","refentry"],["Transliterator::getErrorCode","transliterator.geterrorcode","refentry"],["Transliterator::getErrorMessage","transliterator.geterrormessage","refentry"],["Transliterator::listIDs","transliterator.listids","refentry"],["","transliterator.transliterate","example"],["Transliterator::transliterate","transliterator.transliterate","refentry"],["Transliterator","class.transliterator","phpdoc:classref"],["","class.intlbreakiterator","section"],["","class.intlbreakiterator","section"],["","class.intlbreakiterator","varlistentry"],["","class.intlbreakiterator","varlistentry"],["","class.intlbreakiterator","varlistentry"],["","class.intlbreakiterator","varlistentry"],["","class.intlbreakiterator","varlistentry"],["","class.intlbreakiterator","varlistentry"],["","class.intlbreakiterator","varlistentry"],["","class.intlbreakiterator","varlistentry"],["","class.intlbreakiterator","varlistentry"],["","class.intlbreakiterator","varlistentry"],["","class.intlbreakiterator","varlistentry"],["","class.intlbreakiterator","varlistentry"],["","class.intlbreakiterator","varlistentry"],["","class.intlbreakiterator","varlistentry"],["","class.intlbreakiterator","varlistentry"],["","class.intlbreakiterator","varlistentry"],["","class.intlbreakiterator","varlistentry"],["","class.intlbreakiterator","varlistentry"],["","class.intlbreakiterator","varlistentry"],["","class.intlbreakiterator","section"],["IntlBreakIterator::__construct","intlbreakiterator.construct","refentry"],["IntlBreakIterator::createCharacterInstance","intlbreakiterator.createcharacterinstance","refentry"],["IntlBreakIterator::createCodePointInstance","intlbreakiterator.createcodepointinstance","refentry"],["IntlBreakIterator::createLineInstance","intlbreakiterator.createlineinstance","refentry"],["IntlBreakIterator::createSentenceInstance","intlbreakiterator.createsentenceinstance","refentry"],["IntlBreakIterator::createTitleInstance","intlbreakiterator.createtitleinstance","refentry"],["IntlBreakIterator::createWordInstance","intlbreakiterator.createwordinstance","refentry"],["IntlBreakIterator::current","intlbreakiterator.current","refentry"],["IntlBreakIterator::first","intlbreakiterator.first","refentry"],["IntlBreakIterator::following","intlbreakiterator.following","refentry"],["IntlBreakIterator::getErrorCode","intlbreakiterator.geterrorcode","refentry"],["IntlBreakIterator::getErrorMessage","intlbreakiterator.geterrormessage","refentry"],["IntlBreakIterator::getLocale","intlbreakiterator.getlocale","refentry"],["IntlBreakIterator::getPartsIterator","intlbreakiterator.getpartsiterator","refentry"],["IntlBreakIterator::getText","intlbreakiterator.gettext","refentry"],["IntlBreakIterator::isBoundary","intlbreakiterator.isboundary","refentry"],["IntlBreakIterator::last","intlbreakiterator.last","refentry"],["IntlBreakIterator::next","intlbreakiterator.next","refentry"],["IntlBreakIterator::preceding","intlbreakiterator.preceding","refentry"],["IntlBreakIterator::previous","intlbreakiterator.previous","refentry"],["IntlBreakIterator::setText","intlbreakiterator.settext","refentry"],["IntlBreakIterator","class.intlbreakiterator","phpdoc:classref"],["","class.intlrulebasedbreakiterator","section"],["","class.intlrulebasedbreakiterator","section"],["","class.intlrulebasedbreakiterator","varlistentry"],["","class.intlrulebasedbreakiterator","varlistentry"],["","class.intlrulebasedbreakiterator","varlistentry"],["","class.intlrulebasedbreakiterator","varlistentry"],["","class.intlrulebasedbreakiterator","varlistentry"],["","class.intlrulebasedbreakiterator","varlistentry"],["","class.intlrulebasedbreakiterator","varlistentry"],["","class.intlrulebasedbreakiterator","varlistentry"],["","class.intlrulebasedbreakiterator","varlistentry"],["","class.intlrulebasedbreakiterator","varlistentry"],["","class.intlrulebasedbreakiterator","varlistentry"],["","class.intlrulebasedbreakiterator","varlistentry"],["","class.intlrulebasedbreakiterator","varlistentry"],["","class.intlrulebasedbreakiterator","varlistentry"],["","class.intlrulebasedbreakiterator","varlistentry"],["","class.intlrulebasedbreakiterator","varlistentry"],["","class.intlrulebasedbreakiterator","varlistentry"],["","class.intlrulebasedbreakiterator","varlistentry"],["","class.intlrulebasedbreakiterator","varlistentry"],["","class.intlrulebasedbreakiterator","section"],["IntlRuleBasedBreakIterator::__construct","intlrulebasedbreakiterator.construct","refentry"],["IntlRuleBasedBreakIterator::getBinaryRules","intlrulebasedbreakiterator.getbinaryrules","refentry"],["IntlRuleBasedBreakIterator::getRules","intlrulebasedbreakiterator.getrules","refentry"],["IntlRuleBasedBreakIterator::getRuleStatus","intlrulebasedbreakiterator.getrulestatus","refentry"],["IntlRuleBasedBreakIterator::getRuleStatusVec","intlrulebasedbreakiterator.getrulestatusvec","refentry"],["IntlRuleBasedBreakIterator","class.intlrulebasedbreakiterator","phpdoc:classref"],["","class.intlcodepointbreakiterator","section"],["","class.intlcodepointbreakiterator","section"],["","class.intlcodepointbreakiterator","varlistentry"],["","class.intlcodepointbreakiterator","varlistentry"],["","class.intlcodepointbreakiterator","varlistentry"],["","class.intlcodepointbreakiterator","varlistentry"],["","class.intlcodepointbreakiterator","varlistentry"],["","class.intlcodepointbreakiterator","varlistentry"],["","class.intlcodepointbreakiterator","varlistentry"],["","class.intlcodepointbreakiterator","varlistentry"],["","class.intlcodepointbreakiterator","varlistentry"],["","class.intlcodepointbreakiterator","varlistentry"],["","class.intlcodepointbreakiterator","varlistentry"],["","class.intlcodepointbreakiterator","varlistentry"],["","class.intlcodepointbreakiterator","varlistentry"],["","class.intlcodepointbreakiterator","varlistentry"],["","class.intlcodepointbreakiterator","varlistentry"],["","class.intlcodepointbreakiterator","varlistentry"],["","class.intlcodepointbreakiterator","varlistentry"],["","class.intlcodepointbreakiterator","varlistentry"],["","class.intlcodepointbreakiterator","varlistentry"],["","class.intlcodepointbreakiterator","section"],["IntlCodePointBreakIterator::getLastCodePoint","intlcodepointbreakiterator.getlastcodepoint","refentry"],["IntlCodePointBreakIterator","class.intlcodepointbreakiterator","phpdoc:classref"],["","class.intlpartsiterator","section"],["","class.intlpartsiterator","section"],["","class.intlpartsiterator","varlistentry"],["","class.intlpartsiterator","varlistentry"],["","class.intlpartsiterator","varlistentry"],["","class.intlpartsiterator","section"],["IntlPartsIterator::getBreakIterator","intlpartsiterator.getbreakiterator","refentry"],["IntlPartsIterator","class.intlpartsiterator","phpdoc:classref"],["","class.uconverter","section"],["","class.uconverter","section"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","varlistentry"],["","class.uconverter","section"],["UConverter::__construct","uconverter.construct","refentry"],["UConverter::convert","uconverter.convert","refentry"],["UConverter::fromUCallback","uconverter.fromucallback","refentry"],["UConverter::getAliases","uconverter.getaliases","refentry"],["UConverter::getAvailable","uconverter.getavailable","refentry"],["UConverter::getDestinationEncoding","uconverter.getdestinationencoding","refentry"],["UConverter::getDestinationType","uconverter.getdestinationtype","refentry"],["UConverter::getErrorCode","uconverter.geterrorcode","refentry"],["UConverter::getErrorMessage","uconverter.geterrormessage","refentry"],["UConverter::getSourceEncoding","uconverter.getsourceencoding","refentry"],["UConverter::getSourceType","uconverter.getsourcetype","refentry"],["UConverter::getStandards","uconverter.getstandards","refentry"],["UConverter::getSubstChars","uconverter.getsubstchars","refentry"],["UConverter::reasonText","uconverter.reasontext","refentry"],["UConverter::setDestinationEncoding","uconverter.setdestinationencoding","refentry"],["UConverter::setSourceEncoding","uconverter.setsourceencoding","refentry"],["UConverter::setSubstChars","uconverter.setsubstchars","refentry"],["UConverter::toUCallback","uconverter.toucallback","refentry"],["UConverter::transcode","uconverter.transcode","refentry"],["UConverter","class.uconverter","phpdoc:classref"],["","function.grapheme-extract","example"],["grapheme_extract","function.grapheme-extract","refentry"],["","function.grapheme-stripos","example"],["grapheme_stripos","function.grapheme-stripos","refentry"],["","function.grapheme-stristr","example"],["grapheme_stristr","function.grapheme-stristr","refentry"],["","function.grapheme-strlen","example"],["grapheme_strlen","function.grapheme-strlen","refentry"],["","function.grapheme-strpos","example"],["grapheme_strpos","function.grapheme-strpos","refentry"],["","function.grapheme-strripos","example"],["grapheme_strripos","function.grapheme-strripos","refentry"],["","function.grapheme-strrpos","example"],["grapheme_strrpos","function.grapheme-strrpos","refentry"],["","function.grapheme-strstr","example"],["grapheme_strstr","function.grapheme-strstr","refentry"],["","function.grapheme-substr","example"],["grapheme_substr","function.grapheme-substr","refentry"],["","ref.intl.grapheme","reference"],["","function.idn-to-ascii","example"],["idn_to_ascii","function.idn-to-ascii","refentry"],["idn_to_unicode","function.idn-to-unicode","refentry"],["","function.idn-to-utf8","example"],["idn_to_utf8","function.idn-to-utf8","refentry"],["","ref.intl.idn","reference"],["","class.intlexception","section"],["","class.intlexception","section"],["IntlException","class.intlexception","phpdoc:classref"],["","class.intliterator","section"],["","class.intliterator","section"],["IntlIterator::current","intliterator.current","refentry"],["IntlIterator::key","intliterator.key","refentry"],["IntlIterator::next","intliterator.next","refentry"],["IntlIterator::rewind","intliterator.rewind","refentry"],["IntlIterator::valid","intliterator.valid","refentry"],["IntlIterator","class.intliterator","phpdoc:classref"],["","function.intl-error-name","example"],["intl_error_name","function.intl-error-name","refentry"],["","function.intl-get-error-code","example"],["intl_get_error_code","function.intl-get-error-code","refentry"],["","function.intl-get-error-message","example"],["intl_get_error_message","function.intl-get-error-message","refentry"],["","function.intl-is-failure","example"],["intl_is_failure","function.intl-is-failure","refentry"],["","ref.intl","reference"],["intl","book.intl","book"],["","intro.mbstring","preface"],["","mbstring.requirements","section"],["","mbstring.installation","section"],["","mbstring.configuration","varlistentry"],["","mbstring.configuration","varlistentry"],["","mbstring.configuration","varlistentry"],["","mbstring.configuration","varlistentry"],["","mbstring.configuration","varlistentry"],["","mbstring.configuration","varlistentry"],["","mbstring.configuration","varlistentry"],["","mbstring.configuration","varlistentry"],["","mbstring.configuration","varlistentry"],["","mbstring.configuration","example"],["","mbstring.configuration","example"],["","mbstring.configuration","example"],["","mbstring.configuration","section"],["","mbstring.resources","section"],["","mbstring.setup","chapter"],["","mbstring.constants","varlistentry"],["","mbstring.constants","varlistentry"],["","mbstring.constants","varlistentry"],["","mbstring.constants","varlistentry"],["","mbstring.constants","varlistentry"],["","mbstring.constants","varlistentry"],["","mbstring.constants","appendix"],["","mbstring.encodings","chapter"],["","mbstring.ja-basic","chapter"],["","mbstring.http","example"],["","mbstring.http","example"],["","mbstring.http","example"],["","mbstring.http","chapter"],["","mbstring.supported-encodings","chapter"],["","mbstring.overload","chapter"],["","mbstring.php4.req","chapter"],["mb_check_encoding","function.mb-check-encoding","refentry"],["","function.mb-convert-case","example"],["","function.mb-convert-case","example"],["mb_convert_case","function.mb-convert-case","refentry"],["","function.mb-convert-encoding","example"],["mb_convert_encoding","function.mb-convert-encoding","refentry"],["","function.mb-convert-kana","example"],["mb_convert_kana","function.mb-convert-kana","refentry"],["","function.mb-convert-variables","example"],["mb_convert_variables","function.mb-convert-variables","refentry"],["mb_decode_mimeheader","function.mb-decode-mimeheader","refentry"],["","function.mb-decode-numericentity","example"],["mb_decode_numericentity","function.mb-decode-numericentity","refentry"],["","function.mb-detect-encoding","example"],["mb_detect_encoding","function.mb-detect-encoding","refentry"],["","function.mb-detect-order","example"],["","function.mb-detect-order","example"],["mb_detect_order","function.mb-detect-order","refentry"],["","function.mb-encode-mimeheader","example"],["mb_encode_mimeheader","function.mb-encode-mimeheader","refentry"],["","function.mb-encode-numericentity","example"],["","function.mb-encode-numericentity","example"],["mb_encode_numericentity","function.mb-encode-numericentity","refentry"],["","function.mb-encoding-aliases","example"],["mb_encoding_aliases","function.mb-encoding-aliases","refentry"],["mb_ereg_match","function.mb-ereg-match","refentry"],["","function.mb-ereg-replace-callback","example"],["","function.mb-ereg-replace-callback","example"],["mb_ereg_replace_callback","function.mb-ereg-replace-callback","refentry"],["mb_ereg_replace","function.mb-ereg-replace","refentry"],["mb_ereg_search_getpos","function.mb-ereg-search-getpos","refentry"],["mb_ereg_search_getregs","function.mb-ereg-search-getregs","refentry"],["mb_ereg_search_init","function.mb-ereg-search-init","refentry"],["mb_ereg_search_pos","function.mb-ereg-search-pos","refentry"],["mb_ereg_search_regs","function.mb-ereg-search-regs","refentry"],["mb_ereg_search_setpos","function.mb-ereg-search-setpos","refentry"],["mb_ereg_search","function.mb-ereg-search","refentry"],["mb_ereg","function.mb-ereg","refentry"],["mb_eregi_replace","function.mb-eregi-replace","refentry"],["mb_eregi","function.mb-eregi","refentry"],["mb_get_info","function.mb-get-info","refentry"],["mb_http_input","function.mb-http-input","refentry"],["mb_http_output","function.mb-http-output","refentry"],["","function.mb-internal-encoding","example"],["mb_internal_encoding","function.mb-internal-encoding","refentry"],["mb_language","function.mb-language","refentry"],["","function.mb-list-encodings","example"],["mb_list_encodings","function.mb-list-encodings","refentry"],["","function.mb-output-handler","example"],["mb_output_handler","function.mb-output-handler","refentry"],["mb_parse_str","function.mb-parse-str","refentry"],["","function.mb-preferred-mime-name","example"],["mb_preferred_mime_name","function.mb-preferred-mime-name","refentry"],["mb_regex_encoding","function.mb-regex-encoding","refentry"],["mb_regex_set_options","function.mb-regex-set-options","refentry"],["mb_send_mail","function.mb-send-mail","refentry"],["mb_split","function.mb-split","refentry"],["mb_strcut","function.mb-strcut","refentry"],["","function.mb-strimwidth","example"],["mb_strimwidth","function.mb-strimwidth","refentry"],["mb_stripos","function.mb-stripos","refentry"],["mb_stristr","function.mb-stristr","refentry"],["mb_strlen","function.mb-strlen","refentry"],["mb_strpos","function.mb-strpos","refentry"],["mb_strrchr","function.mb-strrchr","refentry"],["mb_strrichr","function.mb-strrichr","refentry"],["mb_strripos","function.mb-strripos","refentry"],["mb_strrpos","function.mb-strrpos","refentry"],["mb_strstr","function.mb-strstr","refentry"],["","function.mb-strtolower","example"],["","function.mb-strtolower","example"],["mb_strtolower","function.mb-strtolower","refentry"],["","function.mb-strtoupper","example"],["","function.mb-strtoupper","example"],["mb_strtoupper","function.mb-strtoupper","refentry"],["mb_strwidth","function.mb-strwidth","refentry"],["","function.mb-substitute-character","example"],["mb_substitute_character","function.mb-substitute-character","refentry"],["","function.mb-substr-count","example"],["mb_substr_count","function.mb-substr-count","refentry"],["mb_substr","function.mb-substr","refentry"],["","ref.mbstring","reference"],["","book.mbstring","book"],["","intro.pspell","preface"],["","pspell.requirements","section"],["","pspell.installation","section"],["","pspell.configuration","section"],["","pspell.resources","section"],["","pspell.setup","chapter"],["","pspell.constants","varlistentry"],["","pspell.constants","varlistentry"],["","pspell.constants","varlistentry"],["","pspell.constants","varlistentry"],["","pspell.constants","appendix"],["","function.pspell-add-to-personal","example"],["pspell_add_to_personal","function.pspell-add-to-personal","refentry"],["pspell_add_to_session","function.pspell-add-to-session","refentry"],["","function.pspell-check","example"],["pspell_check","function.pspell-check","refentry"],["","function.pspell-clear-session","example"],["pspell_clear_session","function.pspell-clear-session","refentry"],["","function.pspell-config-create","example"],["pspell_config_create","function.pspell-config-create","refentry"],["pspell_config_data_dir","function.pspell-config-data-dir","refentry"],["pspell_config_dict_dir","function.pspell-config-dict-dir","refentry"],["","function.pspell-config-ignore","example"],["pspell_config_ignore","function.pspell-config-ignore","refentry"],["","function.pspell-config-mode","example"],["pspell_config_mode","function.pspell-config-mode","refentry"],["","function.pspell-config-personal","example"],["pspell_config_personal","function.pspell-config-personal","refentry"],["","function.pspell-config-repl","example"],["pspell_config_repl","function.pspell-config-repl","refentry"],["","function.pspell-config-runtogether","example"],["pspell_config_runtogether","function.pspell-config-runtogether","refentry"],["pspell_config_save_repl","function.pspell-config-save-repl","refentry"],["","function.pspell-new-config","example"],["pspell_new_config","function.pspell-new-config","refentry"],["","function.pspell-new-personal","example"],["pspell_new_personal","function.pspell-new-personal","refentry"],["","function.pspell-new","example"],["pspell_new","function.pspell-new","refentry"],["","function.pspell-save-wordlist","example"],["pspell_save_wordlist","function.pspell-save-wordlist","refentry"],["","function.pspell-store-replacement","example"],["pspell_store_replacement","function.pspell-store-replacement","refentry"],["","function.pspell-suggest","example"],["pspell_suggest","function.pspell-suggest","refentry"],["","ref.pspell","reference"],["","book.pspell","book"],["","intro.recode","preface"],["","recode.requirements","section"],["","recode.installation","section"],["","recode.configuration","section"],["","recode.resources","section"],["","recode.setup","chapter"],["","recode.constants","appendix"],["","function.recode-file","example"],["recode_file","function.recode-file","refentry"],["","function.recode-string","example"],["recode_string","function.recode-string","refentry"],["recode","function.recode","refentry"],["","ref.recode","reference"],["Recode","book.recode","book"],["","refs.international","set"],["","intro.cairo","preface"],["","cairo.requirements","section"],["","cairo.installation","section"],["","cairo.configuration","section"],["","cairo.resources","section"],["","cairo.setup","chapter"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","varlistentry"],["","cairo.constants","appendix"],["","cairo.examples","example"],["","cairo.examples","chapter"],["","function.cairo-create","example"],["cairo_create","function.cairo-create","refentry"],["","function.cairo-font-face-get-type","example"],["cairo_font_face_get_type","function.cairo-font-face-get-type","refentry"],["","function.cairo-font-face-status","example"],["cairo_font_face_status","function.cairo-font-face-status","refentry"],["","function.cairo-font-options-create","example"],["cairo_font_options_create","function.cairo-font-options-create","refentry"],["","function.cairo-font-options-equal","example"],["cairo_font_options_equal","function.cairo-font-options-equal","refentry"],["","function.cairo-font-options-get-antialias","example"],["cairo_font_options_get_antialias","function.cairo-font-options-get-antialias","refentry"],["","function.cairo-font-options-get-hint-metrics","example"],["cairo_font_options_get_hint_metrics","function.cairo-font-options-get-hint-metrics","refentry"],["","function.cairo-font-options-get-hint-style","example"],["cairo_font_options_get_hint_style","function.cairo-font-options-get-hint-style","refentry"],["","function.cairo-font-options-get-subpixel-order","example"],["cairo_font_options_get_subpixel_order","function.cairo-font-options-get-subpixel-order","refentry"],["","function.cairo-font-options-hash","example"],["cairo_font_options_hash","function.cairo-font-options-hash","refentry"],["","function.cairo-font-options-merge","example"],["cairo_font_options_merge","function.cairo-font-options-merge","refentry"],["","function.cairo-font-options-set-antialias","example"],["cairo_font_options_set_antialias","function.cairo-font-options-set-antialias","refentry"],["","function.cairo-font-options-set-hint-metrics","example"],["cairo_font_options_set_hint_metrics","function.cairo-font-options-set-hint-metrics","refentry"],["","function.cairo-font-options-set-hint-style","example"],["cairo_font_options_set_hint_style","function.cairo-font-options-set-hint-style","refentry"],["","function.cairo-font-options-set-subpixel-order","example"],["cairo_font_options_set_subpixel_order","function.cairo-font-options-set-subpixel-order","refentry"],["","function.cairo-font-options-status","example"],["cairo_font_options_status","function.cairo-font-options-status","refentry"],["","function.cairo-format-stride-for-width","example"],["cairo_format_stride_for_width","function.cairo-format-stride-for-width","refentry"],["","function.cairo-image-surface-create-for-data","example"],["cairo_image_surface_create_for_data","function.cairo-image-surface-create-for-data","refentry"],["","function.cairo-image-surface-create-from-png","example"],["cairo_image_surface_create_from_png","function.cairo-image-surface-create-from-png","refentry"],["","function.cairo-image-surface-create","example"],["cairo_image_surface_create","function.cairo-image-surface-create","refentry"],["","function.cairo-image-surface-get-data","example"],["cairo_image_surface_get_data","function.cairo-image-surface-get-data","refentry"],["","function.cairo-image-surface-get-format","example"],["cairo_image_surface_get_format","function.cairo-image-surface-get-format","refentry"],["","function.cairo-image-surface-get-height","example"],["cairo_image_surface_get_height","function.cairo-image-surface-get-height","refentry"],["","function.cairo-image-surface-get-stride","example"],["cairo_image_surface_get_stride","function.cairo-image-surface-get-stride","refentry"],["","function.cairo-image-surface-get-width","example"],["cairo_image_surface_get_width","function.cairo-image-surface-get-width","refentry"],["cairo_matrix_create_scale","function.cairo-matrix-create-scale","refentry"],["cairo_matrix_create_translate","function.cairo-matrix-create-translate","refentry"],["","function.cairo-matrix-invert","example"],["cairo_matrix_invert","function.cairo-matrix-invert","refentry"],["","function.cairo-matrix-multiply","example"],["cairo_matrix_multiply","function.cairo-matrix-multiply","refentry"],["","function.cairo-matrix-rotate","example"],["cairo_matrix_rotate","function.cairo-matrix-rotate","refentry"],["","function.cairo-matrix-transform-distance","example"],["cairo_matrix_transform_distance","function.cairo-matrix-transform-distance","refentry"],["","function.cairo-matrix-transform-point","example"],["cairo_matrix_transform_point","function.cairo-matrix-transform-point","refentry"],["","function.cairo-matrix-translate","example"],["cairo_matrix_translate","function.cairo-matrix-translate","refentry"],["","function.cairo-pattern-add-color-stop-rgb","example"],["cairo_pattern_add_color_stop_rgb","function.cairo-pattern-add-color-stop-rgb","refentry"],["","function.cairo-pattern-add-color-stop-rgba","example"],["cairo_pattern_add_color_stop_rgba","function.cairo-pattern-add-color-stop-rgba","refentry"],["","function.cairo-pattern-create-for-surface","example"],["cairo_pattern_create_for_surface","function.cairo-pattern-create-for-surface","refentry"],["","function.cairo-pattern-create-linear","example"],["cairo_pattern_create_linear","function.cairo-pattern-create-linear","refentry"],["","function.cairo-pattern-create-radial","example"],["cairo_pattern_create_radial","function.cairo-pattern-create-radial","refentry"],["","function.cairo-pattern-create-rgb","example"],["cairo_pattern_create_rgb","function.cairo-pattern-create-rgb","refentry"],["","function.cairo-pattern-create-rgba","example"],["cairo_pattern_create_rgba","function.cairo-pattern-create-rgba","refentry"],["","function.cairo-pattern-get-color-stop-count","example"],["cairo_pattern_get_color_stop_count","function.cairo-pattern-get-color-stop-count","refentry"],["","function.cairo-pattern-get-color-stop-rgba","example"],["cairo_pattern_get_color_stop_rgba","function.cairo-pattern-get-color-stop-rgba","refentry"],["","function.cairo-pattern-get-extend","example"],["cairo_pattern_get_extend","function.cairo-pattern-get-extend","refentry"],["","function.cairo-pattern-get-filter","example"],["cairo_pattern_get_filter","function.cairo-pattern-get-filter","refentry"],["","function.cairo-pattern-get-linear-points","example"],["cairo_pattern_get_linear_points","function.cairo-pattern-get-linear-points","refentry"],["","function.cairo-pattern-get-matrix","example"],["cairo_pattern_get_matrix","function.cairo-pattern-get-matrix","refentry"],["","function.cairo-pattern-get-radial-circles","example"],["cairo_pattern_get_radial_circles","function.cairo-pattern-get-radial-circles","refentry"],["","function.cairo-pattern-get-rgba","example"],["cairo_pattern_get_rgba","function.cairo-pattern-get-rgba","refentry"],["","function.cairo-pattern-get-surface","example"],["cairo_pattern_get_surface","function.cairo-pattern-get-surface","refentry"],["","function.cairo-pattern-get-type","example"],["cairo_pattern_get_type","function.cairo-pattern-get-type","refentry"],["","function.cairo-pattern-set-extend","example"],["cairo_pattern_set_extend","function.cairo-pattern-set-extend","refentry"],["","function.cairo-pattern-set-filter","example"],["cairo_pattern_set_filter","function.cairo-pattern-set-filter","refentry"],["","function.cairo-pattern-set-matrix","example"],["cairo_pattern_set_matrix","function.cairo-pattern-set-matrix","refentry"],["","function.cairo-pattern-status","example"],["cairo_pattern_status","function.cairo-pattern-status","refentry"],["","function.cairo-pdf-surface-create","example"],["cairo_pdf_surface_create","function.cairo-pdf-surface-create","refentry"],["","function.cairo-pdf-surface-set-size","example"],["cairo_pdf_surface_set_size","function.cairo-pdf-surface-set-size","refentry"],["","function.cairo-ps-get-levels","example"],["cairo_ps_get_levels","function.cairo-ps-get-levels","refentry"],["","function.cairo-ps-level-to-string","example"],["cairo_ps_level_to_string","function.cairo-ps-level-to-string","refentry"],["","function.cairo-ps-surface-create","example"],["cairo_ps_surface_create","function.cairo-ps-surface-create","refentry"],["","function.cairo-ps-surface-dsc-begin-page-setup","example"],["cairo_ps_surface_dsc_begin_page_setup","function.cairo-ps-surface-dsc-begin-page-setup","refentry"],["","function.cairo-ps-surface-dsc-begin-setup","example"],["cairo_ps_surface_dsc_begin_setup","function.cairo-ps-surface-dsc-begin-setup","refentry"],["","function.cairo-ps-surface-dsc-comment","example"],["cairo_ps_surface_dsc_comment","function.cairo-ps-surface-dsc-comment","refentry"],["","function.cairo-ps-surface-get-eps","example"],["cairo_ps_surface_get_eps","function.cairo-ps-surface-get-eps","refentry"],["","function.cairo-ps-surface-restrict-to-level","example"],["cairo_ps_surface_restrict_to_level","function.cairo-ps-surface-restrict-to-level","refentry"],["","function.cairo-ps-surface-set-eps","example"],["cairo_ps_surface_set_eps","function.cairo-ps-surface-set-eps","refentry"],["","function.cairo-ps-surface-set-size","example"],["cairo_ps_surface_set_size","function.cairo-ps-surface-set-size","refentry"],["","function.cairo-scaled-font-create","example"],["cairo_scaled_font_create","function.cairo-scaled-font-create","refentry"],["","function.cairo-scaled-font-extents","example"],["cairo_scaled_font_extents","function.cairo-scaled-font-extents","refentry"],["","function.cairo-scaled-font-get-ctm","example"],["cairo_scaled_font_get_ctm","function.cairo-scaled-font-get-ctm","refentry"],["","function.cairo-scaled-font-get-font-face","example"],["cairo_scaled_font_get_font_face","function.cairo-scaled-font-get-font-face","refentry"],["","function.cairo-scaled-font-get-font-matrix","example"],["cairo_scaled_font_get_font_matrix","function.cairo-scaled-font-get-font-matrix","refentry"],["","function.cairo-scaled-font-get-font-options","example"],["cairo_scaled_font_get_font_options","function.cairo-scaled-font-get-font-options","refentry"],["","function.cairo-scaled-font-get-scale-matrix","example"],["cairo_scaled_font_get_scale_matrix","function.cairo-scaled-font-get-scale-matrix","refentry"],["","function.cairo-scaled-font-get-type","example"],["cairo_scaled_font_get_type","function.cairo-scaled-font-get-type","refentry"],["","function.cairo-scaled-font-glyph-extents","example"],["cairo_scaled_font_glyph_extents","function.cairo-scaled-font-glyph-extents","refentry"],["","function.cairo-scaled-font-status","example"],["cairo_scaled_font_status","function.cairo-scaled-font-status","refentry"],["","function.cairo-scaled-font-text-extents","example"],["cairo_scaled_font_text_extents","function.cairo-scaled-font-text-extents","refentry"],["","function.cairo-surface-copy-page","example"],["cairo_surface_copy_page","function.cairo-surface-copy-page","refentry"],["","function.cairo-surface-create-similar","example"],["cairo_surface_create_similar","function.cairo-surface-create-similar","refentry"],["","function.cairo-surface-finish","example"],["cairo_surface_finish","function.cairo-surface-finish","refentry"],["","function.cairo-surface-flush","example"],["cairo_surface_flush","function.cairo-surface-flush","refentry"],["","function.cairo-surface-get-content","example"],["cairo_surface_get_content","function.cairo-surface-get-content","refentry"],["","function.cairo-surface-get-device-offset","example"],["cairo_surface_get_device_offset","function.cairo-surface-get-device-offset","refentry"],["","function.cairo-surface-get-font-options","example"],["cairo_surface_get_font_options","function.cairo-surface-get-font-options","refentry"],["","function.cairo-surface-get-type","example"],["cairo_surface_get_type","function.cairo-surface-get-type","refentry"],["","function.cairo-surface-mark-dirty-rectangle","example"],["cairo_surface_mark_dirty_rectangle","function.cairo-surface-mark-dirty-rectangle","refentry"],["","function.cairo-surface-mark-dirty","example"],["cairo_surface_mark_dirty","function.cairo-surface-mark-dirty","refentry"],["","function.cairo-surface-set-device-offset","example"],["cairo_surface_set_device_offset","function.cairo-surface-set-device-offset","refentry"],["","function.cairo-surface-set-fallback-resolution","example"],["cairo_surface_set_fallback_resolution","function.cairo-surface-set-fallback-resolution","refentry"],["","function.cairo-surface-show-page","example"],["cairo_surface_show_page","function.cairo-surface-show-page","refentry"],["","function.cairo-surface-status","example"],["cairo_surface_status","function.cairo-surface-status","refentry"],["","function.cairo-surface-write-to-png","example"],["cairo_surface_write_to_png","function.cairo-surface-write-to-png","refentry"],["","function.cairo-svg-surface-create","example"],["cairo_svg_surface_create","function.cairo-svg-surface-create","refentry"],["","function.cairo-svg-surface-restrict-to-version","example"],["cairo_svg_surface_restrict_to_version","function.cairo-svg-surface-restrict-to-version","refentry"],["","function.cairo-svg-version-to-string","example"],["cairo_svg_version_to_string","function.cairo-svg-version-to-string","refentry"],["","ref.cairo","reference"],["","class.cairo","section"],["","class.cairo","section"],["","cairo.availablefonts","example"],["","cairo.availablefonts","example"],["Cairo::availableFonts","cairo.availablefonts","refentry"],["","cairo.availablesurfaces","example"],["","cairo.availablesurfaces","example"],["Cairo::availableSurfaces","cairo.availablesurfaces","refentry"],["","cairo.statustostring","example"],["","cairo.statustostring","example"],["Cairo::statusToString","cairo.statustostring","refentry"],["","cairo.version","example"],["","cairo.version","example"],["Cairo::version","cairo.version","refentry"],["","cairo.versionstring","example"],["","cairo.versionstring","example"],["Cairo::versionString","cairo.versionstring","refentry"],["Cairo","class.cairo","phpdoc:classref"],["","class.cairocontext","section"],["","class.cairocontext","section"],["","cairocontext.appendpath","example"],["","cairocontext.appendpath","example"],["CairoContext::appendPath","cairocontext.appendpath","refentry"],["","cairocontext.arc","example"],["","cairocontext.arc","example"],["CairoContext::arc","cairocontext.arc","refentry"],["","cairocontext.arcnegative","example"],["","cairocontext.arcnegative","example"],["CairoContext::arcNegative","cairocontext.arcnegative","refentry"],["","cairocontext.clip","example"],["","cairocontext.clip","example"],["CairoContext::clip","cairocontext.clip","refentry"],["","cairocontext.clipextents","example"],["","cairocontext.clipextents","example"],["CairoContext::clipExtents","cairocontext.clipextents","refentry"],["","cairocontext.clippreserve","example"],["","cairocontext.clippreserve","example"],["CairoContext::clipPreserve","cairocontext.clippreserve","refentry"],["","cairocontext.cliprectanglelist","example"],["","cairocontext.cliprectanglelist","example"],["CairoContext::clipRectangleList","cairocontext.cliprectanglelist","refentry"],["","cairocontext.closepath","example"],["","cairocontext.closepath","example"],["CairoContext::closePath","cairocontext.closepath","refentry"],["","cairocontext.construct","example"],["CairoContext::__construct","cairocontext.construct","refentry"],["","cairocontext.copypage","example"],["","cairocontext.copypage","example"],["CairoContext::copyPage","cairocontext.copypage","refentry"],["","cairocontext.copypath","example"],["","cairocontext.copypath","example"],["CairoContext::copyPath","cairocontext.copypath","refentry"],["","cairocontext.copypathflat","example"],["","cairocontext.copypathflat","example"],["CairoContext::copyPathFlat","cairocontext.copypathflat","refentry"],["","cairocontext.curveto","example"],["","cairocontext.curveto","example"],["CairoContext::curveTo","cairocontext.curveto","refentry"],["CairoContext::deviceToUser","cairocontext.devicetouser","refentry"],["CairoContext::deviceToUserDistance","cairocontext.devicetouserdistance","refentry"],["","cairocontext.fill","example"],["","cairocontext.fill","example"],["CairoContext::fill","cairocontext.fill","refentry"],["","cairocontext.fillextents","example"],["","cairocontext.fillextents","example"],["CairoContext::fillExtents","cairocontext.fillextents","refentry"],["","cairocontext.fillpreserve","example"],["","cairocontext.fillpreserve","example"],["CairoContext::fillPreserve","cairocontext.fillpreserve","refentry"],["","cairocontext.fontextents","example"],["","cairocontext.fontextents","example"],["CairoContext::fontExtents","cairocontext.fontextents","refentry"],["","cairocontext.getantialias","example"],["","cairocontext.getantialias","example"],["CairoContext::getAntialias","cairocontext.getantialias","refentry"],["","cairocontext.getcurrentpoint","example"],["","cairocontext.getcurrentpoint","example"],["CairoContext::getCurrentPoint","cairocontext.getcurrentpoint","refentry"],["","cairocontext.getdash","example"],["","cairocontext.getdash","example"],["CairoContext::getDash","cairocontext.getdash","refentry"],["","cairocontext.getdashcount","example"],["","cairocontext.getdashcount","example"],["CairoContext::getDashCount","cairocontext.getdashcount","refentry"],["","cairocontext.getfillrule","example"],["","cairocontext.getfillrule","example"],["CairoContext::getFillRule","cairocontext.getfillrule","refentry"],["","cairocontext.getfontface","example"],["","cairocontext.getfontface","example"],["CairoContext::getFontFace","cairocontext.getfontface","refentry"],["","cairocontext.getfontmatrix","example"],["","cairocontext.getfontmatrix","example"],["CairoContext::getFontMatrix","cairocontext.getfontmatrix","refentry"],["","cairocontext.getfontoptions","example"],["","cairocontext.getfontoptions","example"],["CairoContext::getFontOptions","cairocontext.getfontoptions","refentry"],["","cairocontext.getgrouptarget","example"],["","cairocontext.getgrouptarget","example"],["CairoContext::getGroupTarget","cairocontext.getgrouptarget","refentry"],["","cairocontext.getlinecap","example"],["","cairocontext.getlinecap","example"],["CairoContext::getLineCap","cairocontext.getlinecap","refentry"],["","cairocontext.getlinejoin","example"],["","cairocontext.getlinejoin","example"],["CairoContext::getLineJoin","cairocontext.getlinejoin","refentry"],["","cairocontext.getlinewidth","example"],["","cairocontext.getlinewidth","example"],["CairoContext::getLineWidth","cairocontext.getlinewidth","refentry"],["","cairocontext.getmatrix","example"],["","cairocontext.getmatrix","example"],["CairoContext::getMatrix","cairocontext.getmatrix","refentry"],["","cairocontext.getmiterlimit","example"],["","cairocontext.getmiterlimit","example"],["CairoContext::getMiterLimit","cairocontext.getmiterlimit","refentry"],["","cairocontext.getoperator","example"],["","cairocontext.getoperator","example"],["CairoContext::getOperator","cairocontext.getoperator","refentry"],["","cairocontext.getscaledfont","example"],["","cairocontext.getscaledfont","example"],["CairoContext::getScaledFont","cairocontext.getscaledfont","refentry"],["","cairocontext.getsource","example"],["","cairocontext.getsource","example"],["CairoContext::getSource","cairocontext.getsource","refentry"],["","cairocontext.gettarget","example"],["","cairocontext.gettarget","example"],["CairoContext::getTarget","cairocontext.gettarget","refentry"],["","cairocontext.gettolerance","example"],["","cairocontext.gettolerance","example"],["CairoContext::getTolerance","cairocontext.gettolerance","refentry"],["","cairocontext.glyphpath","example"],["","cairocontext.glyphpath","example"],["CairoContext::glyphPath","cairocontext.glyphpath","refentry"],["","cairocontext.hascurrentpoint","example"],["","cairocontext.hascurrentpoint","example"],["CairoContext::hasCurrentPoint","cairocontext.hascurrentpoint","refentry"],["","cairocontext.identitymatrix","example"],["","cairocontext.identitymatrix","example"],["CairoContext::identityMatrix","cairocontext.identitymatrix","refentry"],["","cairocontext.infill","example"],["","cairocontext.infill","example"],["CairoContext::inFill","cairocontext.infill","refentry"],["","cairocontext.instroke","example"],["","cairocontext.instroke","example"],["CairoContext::inStroke","cairocontext.instroke","refentry"],["","cairocontext.lineto","example"],["","cairocontext.lineto","example"],["CairoContext::lineTo","cairocontext.lineto","refentry"],["","cairocontext.mask","example"],["","cairocontext.mask","example"],["CairoContext::mask","cairocontext.mask","refentry"],["","cairocontext.masksurface","example"],["","cairocontext.masksurface","example"],["CairoContext::maskSurface","cairocontext.masksurface","refentry"],["","cairocontext.moveto","example"],["","cairocontext.moveto","example"],["CairoContext::moveTo","cairocontext.moveto","refentry"],["","cairocontext.newpath","example"],["","cairocontext.newpath","example"],["CairoContext::newPath","cairocontext.newpath","refentry"],["","cairocontext.newsubpath","example"],["","cairocontext.newsubpath","example"],["CairoContext::newSubPath","cairocontext.newsubpath","refentry"],["","cairocontext.paint","example"],["","cairocontext.paint","example"],["CairoContext::paint","cairocontext.paint","refentry"],["","cairocontext.paintwithalpha","example"],["","cairocontext.paintwithalpha","example"],["CairoContext::paintWithAlpha","cairocontext.paintwithalpha","refentry"],["","cairocontext.pathextents","example"],["","cairocontext.pathextents","example"],["CairoContext::pathExtents","cairocontext.pathextents","refentry"],["","cairocontext.popgroup","example"],["","cairocontext.popgroup","example"],["CairoContext::popGroup","cairocontext.popgroup","refentry"],["","cairocontext.popgrouptosource","example"],["","cairocontext.popgrouptosource","example"],["CairoContext::popGroupToSource","cairocontext.popgrouptosource","refentry"],["","cairocontext.pushgroup","example"],["","cairocontext.pushgroup","example"],["CairoContext::pushGroup","cairocontext.pushgroup","refentry"],["","cairocontext.pushgroupwithcontent","example"],["","cairocontext.pushgroupwithcontent","example"],["CairoContext::pushGroupWithContent","cairocontext.pushgroupwithcontent","refentry"],["","cairocontext.rectangle","example"],["","cairocontext.rectangle","example"],["CairoContext::rectangle","cairocontext.rectangle","refentry"],["","cairocontext.relcurveto","example"],["","cairocontext.relcurveto","example"],["CairoContext::relCurveTo","cairocontext.relcurveto","refentry"],["","cairocontext.rellineto","example"],["","cairocontext.rellineto","example"],["CairoContext::relLineTo","cairocontext.rellineto","refentry"],["","cairocontext.relmoveto","example"],["","cairocontext.relmoveto","example"],["CairoContext::relMoveTo","cairocontext.relmoveto","refentry"],["","cairocontext.resetclip","example"],["","cairocontext.resetclip","example"],["CairoContext::resetClip","cairocontext.resetclip","refentry"],["","cairocontext.restore","example"],["","cairocontext.restore","example"],["CairoContext::restore","cairocontext.restore","refentry"],["","cairocontext.rotate","example"],["","cairocontext.rotate","example"],["CairoContext::rotate","cairocontext.rotate","refentry"],["","cairocontext.save","example"],["","cairocontext.save","example"],["CairoContext::save","cairocontext.save","refentry"],["","cairocontext.scale","example"],["","cairocontext.scale","example"],["CairoContext::scale","cairocontext.scale","refentry"],["","cairocontext.selectfontface","example"],["","cairocontext.selectfontface","example"],["CairoContext::selectFontFace","cairocontext.selectfontface","refentry"],["","cairocontext.setantialias","example"],["","cairocontext.setantialias","example"],["CairoContext::setAntialias","cairocontext.setantialias","refentry"],["","cairocontext.setdash","example"],["","cairocontext.setdash","example"],["CairoContext::setDash","cairocontext.setdash","refentry"],["","cairocontext.setfillrule","example"],["","cairocontext.setfillrule","example"],["CairoContext::setFillRule","cairocontext.setfillrule","refentry"],["","cairocontext.setfontface","example"],["","cairocontext.setfontface","example"],["CairoContext::setFontFace","cairocontext.setfontface","refentry"],["","cairocontext.setfontmatrix","example"],["","cairocontext.setfontmatrix","example"],["CairoContext::setFontMatrix","cairocontext.setfontmatrix","refentry"],["","cairocontext.setfontoptions","example"],["","cairocontext.setfontoptions","example"],["CairoContext::setFontOptions","cairocontext.setfontoptions","refentry"],["","cairocontext.setfontsize","example"],["","cairocontext.setfontsize","example"],["CairoContext::setFontSize","cairocontext.setfontsize","refentry"],["","cairocontext.setlinecap","example"],["","cairocontext.setlinecap","example"],["CairoContext::setLineCap","cairocontext.setlinecap","refentry"],["","cairocontext.setlinejoin","example"],["","cairocontext.setlinejoin","example"],["CairoContext::setLineJoin","cairocontext.setlinejoin","refentry"],["","cairocontext.setlinewidth","example"],["","cairocontext.setlinewidth","example"],["CairoContext::setLineWidth","cairocontext.setlinewidth","refentry"],["","cairocontext.setmatrix","example"],["","cairocontext.setmatrix","example"],["CairoContext::setMatrix","cairocontext.setmatrix","refentry"],["","cairocontext.setmiterlimit","example"],["","cairocontext.setmiterlimit","example"],["CairoContext::setMiterLimit","cairocontext.setmiterlimit","refentry"],["","cairocontext.setoperator","example"],["","cairocontext.setoperator","example"],["CairoContext::setOperator","cairocontext.setoperator","refentry"],["","cairocontext.setscaledfont","example"],["","cairocontext.setscaledfont","example"],["CairoContext::setScaledFont","cairocontext.setscaledfont","refentry"],["","cairocontext.setsource","example"],["","cairocontext.setsource","example"],["CairoContext::setSource","cairocontext.setsource","refentry"],["","cairocontext.setsourcergb","example"],["","cairocontext.setsourcergb","example"],["CairoContext::setSourceRGB","cairocontext.setsourcergb","refentry"],["","cairocontext.setsourcergba","example"],["","cairocontext.setsourcergba","example"],["CairoContext::setSourceRGBA","cairocontext.setsourcergba","refentry"],["","cairocontext.setsourcesurface","example"],["","cairocontext.setsourcesurface","example"],["CairoContext::setSourceSurface","cairocontext.setsourcesurface","refentry"],["","cairocontext.settolerance","example"],["","cairocontext.settolerance","example"],["CairoContext::setTolerance","cairocontext.settolerance","refentry"],["","cairocontext.showpage","example"],["","cairocontext.showpage","example"],["CairoContext::showPage","cairocontext.showpage","refentry"],["","cairocontext.showtext","example"],["","cairocontext.showtext","example"],["CairoContext::showText","cairocontext.showtext","refentry"],["","cairocontext.status","example"],["","cairocontext.status","example"],["CairoContext::status","cairocontext.status","refentry"],["","cairocontext.stroke","example"],["","cairocontext.stroke","example"],["CairoContext::stroke","cairocontext.stroke","refentry"],["","cairocontext.strokeextents","example"],["","cairocontext.strokeextents","example"],["CairoContext::strokeExtents","cairocontext.strokeextents","refentry"],["","cairocontext.strokepreserve","example"],["","cairocontext.strokepreserve","example"],["CairoContext::strokePreserve","cairocontext.strokepreserve","refentry"],["","cairocontext.textextents","example"],["","cairocontext.textextents","example"],["CairoContext::textExtents","cairocontext.textextents","refentry"],["","cairocontext.textpath","example"],["","cairocontext.textpath","example"],["CairoContext::textPath","cairocontext.textpath","refentry"],["","cairocontext.transform","example"],["","cairocontext.transform","example"],["CairoContext::transform","cairocontext.transform","refentry"],["","cairocontext.translate","example"],["","cairocontext.translate","example"],["CairoContext::translate","cairocontext.translate","refentry"],["","cairocontext.usertodevice","example"],["","cairocontext.usertodevice","example"],["CairoContext::userToDevice","cairocontext.usertodevice","refentry"],["","cairocontext.usertodevicedistance","example"],["","cairocontext.usertodevicedistance","example"],["CairoContext::userToDeviceDistance","cairocontext.usertodevicedistance","refentry"],["CairoContext","class.cairocontext","phpdoc:classref"],["","class.cairoexception","section"],["","class.cairoexception","section"],["CairoException","class.cairoexception","phpdoc:classref"],["","class.cairostatus","section"],["","class.cairostatus","section"],["","class.cairostatus","varlistentry"],["","class.cairostatus","varlistentry"],["","class.cairostatus","varlistentry"],["","class.cairostatus","varlistentry"],["","class.cairostatus","varlistentry"],["","class.cairostatus","varlistentry"],["","class.cairostatus","varlistentry"],["","class.cairostatus","varlistentry"],["","class.cairostatus","varlistentry"],["","class.cairostatus","varlistentry"],["","class.cairostatus","varlistentry"],["","class.cairostatus","varlistentry"],["","class.cairostatus","varlistentry"],["","class.cairostatus","varlistentry"],["","class.cairostatus","varlistentry"],["","class.cairostatus","varlistentry"],["","class.cairostatus","varlistentry"],["","class.cairostatus","varlistentry"],["","class.cairostatus","varlistentry"],["","class.cairostatus","varlistentry"],["","class.cairostatus","varlistentry"],["","class.cairostatus","varlistentry"],["","class.cairostatus","varlistentry"],["","class.cairostatus","varlistentry"],["","class.cairostatus","varlistentry"],["","class.cairostatus","section"],["CairoStatus","class.cairostatus","phpdoc:classref"],["","class.cairosurface","section"],["","class.cairosurface","section"],["CairoSurface::__construct","cairosurface.construct","refentry"],["","cairosurface.copypage","example"],["","cairosurface.copypage","example"],["CairoSurface::copyPage","cairosurface.copypage","refentry"],["","cairosurface.createsimilar","example"],["CairoSurface::createSimilar","cairosurface.createsimilar","refentry"],["","cairosurface.finish","example"],["CairoSurface::finish","cairosurface.finish","refentry"],["","cairosurface.flush","example"],["CairoSurface::flush","cairosurface.flush","refentry"],["","cairosurface.getcontent","example"],["CairoSurface::getContent","cairosurface.getcontent","refentry"],["","cairosurface.getdeviceoffset","example"],["CairoSurface::getDeviceOffset","cairosurface.getdeviceoffset","refentry"],["","cairosurface.getfontoptions","example"],["","cairosurface.getfontoptions","example"],["CairoSurface::getFontOptions","cairosurface.getfontoptions","refentry"],["","cairosurface.gettype","example"],["CairoSurface::getType","cairosurface.gettype","refentry"],["","cairosurface.markdirty","example"],["CairoSurface::markDirty","cairosurface.markdirty","refentry"],["","cairosurface.markdirtyrectangle","example"],["CairoSurface::markDirtyRectangle","cairosurface.markdirtyrectangle","refentry"],["","cairosurface.setdeviceoffset","example"],["CairoSurface::setDeviceOffset","cairosurface.setdeviceoffset","refentry"],["","cairosurface.setfallbackresolution","example"],["CairoSurface::setFallbackResolution","cairosurface.setfallbackresolution","refentry"],["","cairosurface.showpage","example"],["","cairosurface.showpage","example"],["CairoSurface::showPage","cairosurface.showpage","refentry"],["","cairosurface.status","example"],["","cairosurface.status","example"],["CairoSurface::status","cairosurface.status","refentry"],["","cairosurface.writetopng","example"],["CairoSurface::writeToPng","cairosurface.writetopng","refentry"],["CairoSurface","class.cairosurface","phpdoc:classref"],["","class.cairosvgsurface","section"],["","class.cairosvgsurface","section"],["","cairosvgsurface.construct","example"],["CairoSvgSurface::__construct","cairosvgsurface.construct","refentry"],["","cairosvgsurface.getversions","example"],["","cairosvgsurface.getversions","example"],["CairoSvgSurface::getVersions","cairosvgsurface.getversions","refentry"],["","cairosvgsurface.restricttoversion","example"],["CairoSvgSurface::restrictToVersion","cairosvgsurface.restricttoversion","refentry"],["","cairosvgsurface.versiontostring","example"],["CairoSvgSurface::versionToString","cairosvgsurface.versiontostring","refentry"],["CairoSvgSurface","class.cairosvgsurface","phpdoc:classref"],["","class.cairoimagesurface","section"],["","class.cairoimagesurface","section"],["","cairoimagesurface.construct","example"],["CairoImageSurface::__construct","cairoimagesurface.construct","refentry"],["","cairoimagesurface.createfordata","example"],["CairoImageSurface::createForData","cairoimagesurface.createfordata","refentry"],["","cairoimagesurface.createfrompng","example"],["CairoImageSurface::createFromPng","cairoimagesurface.createfrompng","refentry"],["","cairoimagesurface.getdata","example"],["CairoImageSurface::getData","cairoimagesurface.getdata","refentry"],["","cairoimagesurface.getformat","example"],["CairoImageSurface::getFormat","cairoimagesurface.getformat","refentry"],["","cairoimagesurface.getheight","example"],["CairoImageSurface::getHeight","cairoimagesurface.getheight","refentry"],["","cairoimagesurface.getstride","example"],["CairoImageSurface::getStride","cairoimagesurface.getstride","refentry"],["","cairoimagesurface.getwidth","example"],["CairoImageSurface::getWidth","cairoimagesurface.getwidth","refentry"],["CairoImageSurface","class.cairoimagesurface","phpdoc:classref"],["","class.cairopdfsurface","section"],["","class.cairopdfsurface","section"],["","cairopdfsurface.construct","example"],["CairoPdfSurface::__construct","cairopdfsurface.construct","refentry"],["","cairopdfsurface.setsize","example"],["CairoPdfSurface::setSize","cairopdfsurface.setsize","refentry"],["CairoPdfSurface","class.cairopdfsurface","phpdoc:classref"],["","class.cairopssurface","section"],["","class.cairopssurface","section"],["","cairopssurface.construct","example"],["CairoPsSurface::__construct","cairopssurface.construct","refentry"],["","cairopssurface.dscbeginpagesetup","example"],["CairoPsSurface::dscBeginPageSetup","cairopssurface.dscbeginpagesetup","refentry"],["","cairopssurface.dscbeginsetup","example"],["CairoPsSurface::dscBeginSetup","cairopssurface.dscbeginsetup","refentry"],["","cairopssurface.dsccomment","example"],["CairoPsSurface::dscComment","cairopssurface.dsccomment","refentry"],["","cairopssurface.geteps","example"],["CairoPsSurface::getEps","cairopssurface.geteps","refentry"],["","cairopssurface.getlevels","example"],["CairoPsSurface::getLevels","cairopssurface.getlevels","refentry"],["","cairopssurface.leveltostring","example"],["CairoPsSurface::levelToString","cairopssurface.leveltostring","refentry"],["","cairopssurface.restricttolevel","example"],["CairoPsSurface::restrictToLevel","cairopssurface.restricttolevel","refentry"],["","cairopssurface.seteps","example"],["CairoPsSurface::setEps","cairopssurface.seteps","refentry"],["","cairopssurface.setsize","example"],["CairoPsSurface::setSize","cairopssurface.setsize","refentry"],["CairoPsSurface","class.cairopssurface","phpdoc:classref"],["","class.cairosurfacetype","section"],["","class.cairosurfacetype","section"],["","class.cairosurfacetype","varlistentry"],["","class.cairosurfacetype","varlistentry"],["","class.cairosurfacetype","varlistentry"],["","class.cairosurfacetype","varlistentry"],["","class.cairosurfacetype","varlistentry"],["","class.cairosurfacetype","varlistentry"],["","class.cairosurfacetype","varlistentry"],["","class.cairosurfacetype","varlistentry"],["","class.cairosurfacetype","varlistentry"],["","class.cairosurfacetype","varlistentry"],["","class.cairosurfacetype","varlistentry"],["","class.cairosurfacetype","varlistentry"],["","class.cairosurfacetype","varlistentry"],["","class.cairosurfacetype","varlistentry"],["","class.cairosurfacetype","section"],["CairoSurfaceType","class.cairosurfacetype","phpdoc:classref"],["","class.cairofontface","section"],["","class.cairofontface","section"],["","cairofontface.construct","example"],["CairoFontFace::__construct","cairofontface.construct","refentry"],["","cairofontface.gettype","example"],["CairoFontFace::getType","cairofontface.gettype","refentry"],["","cairofontface.status","example"],["","cairofontface.status","example"],["CairoFontFace::status","cairofontface.status","refentry"],["CairoFontFace","class.cairofontface","phpdoc:classref"],["","class.cairofontoptions","section"],["","class.cairofontoptions","section"],["","cairofontoptions.construct","example"],["CairoFontOptions::__construct","cairofontoptions.construct","refentry"],["","cairofontoptions.equal","example"],["CairoFontOptions::equal","cairofontoptions.equal","refentry"],["","cairofontoptions.getantialias","example"],["","cairofontoptions.getantialias","example"],["CairoFontOptions::getAntialias","cairofontoptions.getantialias","refentry"],["","cairofontoptions.gethintmetrics","example"],["CairoFontOptions::getHintMetrics","cairofontoptions.gethintmetrics","refentry"],["","cairofontoptions.gethintstyle","example"],["CairoFontOptions::getHintStyle","cairofontoptions.gethintstyle","refentry"],["","cairofontoptions.getsubpixelorder","example"],["CairoFontOptions::getSubpixelOrder","cairofontoptions.getsubpixelorder","refentry"],["","cairofontoptions.hash","example"],["CairoFontOptions::hash","cairofontoptions.hash","refentry"],["","cairofontoptions.merge","example"],["CairoFontOptions::merge","cairofontoptions.merge","refentry"],["","cairofontoptions.setantialias","example"],["","cairofontoptions.setantialias","example"],["CairoFontOptions::setAntialias","cairofontoptions.setantialias","refentry"],["","cairofontoptions.sethintmetrics","example"],["CairoFontOptions::setHintMetrics","cairofontoptions.sethintmetrics","refentry"],["","cairofontoptions.sethintstyle","example"],["CairoFontOptions::setHintStyle","cairofontoptions.sethintstyle","refentry"],["","cairofontoptions.setsubpixelorder","example"],["CairoFontOptions::setSubpixelOrder","cairofontoptions.setsubpixelorder","refentry"],["","cairofontoptions.status","example"],["","cairofontoptions.status","example"],["CairoFontOptions::status","cairofontoptions.status","refentry"],["CairoFontOptions","class.cairofontoptions","phpdoc:classref"],["","class.cairofontslant","section"],["","class.cairofontslant","section"],["","class.cairofontslant","varlistentry"],["","class.cairofontslant","varlistentry"],["","class.cairofontslant","varlistentry"],["","class.cairofontslant","section"],["CairoFontSlant","class.cairofontslant","phpdoc:classref"],["","class.cairofonttype","section"],["","class.cairofonttype","section"],["","class.cairofonttype","varlistentry"],["","class.cairofonttype","varlistentry"],["","class.cairofonttype","varlistentry"],["","class.cairofonttype","varlistentry"],["","class.cairofonttype","varlistentry"],["","class.cairofonttype","section"],["CairoFontType","class.cairofonttype","phpdoc:classref"],["","class.cairofontweight","section"],["","class.cairofontweight","section"],["","class.cairofontweight","varlistentry"],["","class.cairofontweight","varlistentry"],["","class.cairofontweight","section"],["CairoFontWeight","class.cairofontweight","phpdoc:classref"],["","class.cairoscaledfont","section"],["","class.cairoscaledfont","section"],["","cairoscaledfont.construct","example"],["CairoScaledFont::__construct","cairoscaledfont.construct","refentry"],["","cairoscaledfont.extents","example"],["CairoScaledFont::extents","cairoscaledfont.extents","refentry"],["","cairoscaledfont.getctm","example"],["CairoScaledFont::getCtm","cairoscaledfont.getctm","refentry"],["","cairoscaledfont.getfontface","example"],["","cairoscaledfont.getfontface","example"],["CairoScaledFont::getFontFace","cairoscaledfont.getfontface","refentry"],["","cairoscaledfont.getfontmatrix","example"],["","cairoscaledfont.getfontmatrix","example"],["CairoScaledFont::getFontMatrix","cairoscaledfont.getfontmatrix","refentry"],["","cairoscaledfont.getfontoptions","example"],["","cairoscaledfont.getfontoptions","example"],["CairoScaledFont::getFontOptions","cairoscaledfont.getfontoptions","refentry"],["","cairoscaledfont.getscalematrix","example"],["CairoScaledFont::getScaleMatrix","cairoscaledfont.getscalematrix","refentry"],["","cairoscaledfont.gettype","example"],["CairoScaledFont::getType","cairoscaledfont.gettype","refentry"],["","cairoscaledfont.glyphextents","example"],["CairoScaledFont::glyphExtents","cairoscaledfont.glyphextents","refentry"],["","cairoscaledfont.status","example"],["","cairoscaledfont.status","example"],["CairoScaledFont::status","cairoscaledfont.status","refentry"],["","cairoscaledfont.textextents","example"],["","cairoscaledfont.textextents","example"],["CairoScaledFont::textExtents","cairoscaledfont.textextents","refentry"],["CairoScaledFont","class.cairoscaledfont","phpdoc:classref"],["","class.cairotoyfontface","section"],["","class.cairotoyfontface","section"],["CairoToyFontFace","class.cairotoyfontface","phpdoc:classref"],["","class.cairopatterntype","section"],["","class.cairopatterntype","section"],["","class.cairopatterntype","varlistentry"],["","class.cairopatterntype","varlistentry"],["","class.cairopatterntype","varlistentry"],["","class.cairopatterntype","varlistentry"],["","class.cairopatterntype","section"],["CairoPatternType","class.cairopatterntype","phpdoc:classref"],["","class.cairopattern","section"],["","class.cairopattern","section"],["","cairopattern.construct","example"],["CairoPattern::__construct","cairopattern.construct","refentry"],["","cairopattern.getmatrix","example"],["","cairopattern.getmatrix","example"],["CairoPattern::getMatrix","cairopattern.getmatrix","refentry"],["","cairopattern.gettype","example"],["CairoPattern::getType","cairopattern.gettype","refentry"],["","cairopattern.setmatrix","example"],["","cairopattern.setmatrix","example"],["CairoPattern::setMatrix","cairopattern.setmatrix","refentry"],["","cairopattern.status","example"],["","cairopattern.status","example"],["CairoPattern::status","cairopattern.status","refentry"],["CairoPattern","class.cairopattern","phpdoc:classref"],["","class.cairogradientpattern","section"],["","class.cairogradientpattern","section"],["","cairogradientpattern.addcolorstoprgb","example"],["CairoGradientPattern::addColorStopRgb","cairogradientpattern.addcolorstoprgb","refentry"],["","cairogradientpattern.addcolorstoprgba","example"],["CairoGradientPattern::addColorStopRgba","cairogradientpattern.addcolorstoprgba","refentry"],["","cairogradientpattern.getcolorstopcount","example"],["CairoGradientPattern::getColorStopCount","cairogradientpattern.getcolorstopcount","refentry"],["","cairogradientpattern.getcolorstoprgba","example"],["CairoGradientPattern::getColorStopRgba","cairogradientpattern.getcolorstoprgba","refentry"],["","cairogradientpattern.getextend","example"],["CairoGradientPattern::getExtend","cairogradientpattern.getextend","refentry"],["","cairogradientpattern.setextend","example"],["CairoGradientPattern::setExtend","cairogradientpattern.setextend","refentry"],["CairoGradientPattern","class.cairogradientpattern","phpdoc:classref"],["","class.cairosolidpattern","section"],["","class.cairosolidpattern","section"],["","cairosolidpattern.construct","example"],["CairoSolidPattern::__construct","cairosolidpattern.construct","refentry"],["","cairosolidpattern.getrgba","example"],["CairoSolidPattern::getRgba","cairosolidpattern.getrgba","refentry"],["CairoSolidPattern","class.cairosolidpattern","phpdoc:classref"],["","class.cairosurfacepattern","section"],["","class.cairosurfacepattern","section"],["","cairosurfacepattern.construct","example"],["CairoSurfacePattern::__construct","cairosurfacepattern.construct","refentry"],["","cairosurfacepattern.getextend","example"],["CairoSurfacePattern::getExtend","cairosurfacepattern.getextend","refentry"],["","cairosurfacepattern.getfilter","example"],["CairoSurfacePattern::getFilter","cairosurfacepattern.getfilter","refentry"],["","cairosurfacepattern.getsurface","example"],["CairoSurfacePattern::getSurface","cairosurfacepattern.getsurface","refentry"],["","cairosurfacepattern.setextend","example"],["CairoSurfacePattern::setExtend","cairosurfacepattern.setextend","refentry"],["","cairosurfacepattern.setfilter","example"],["CairoSurfacePattern::setFilter","cairosurfacepattern.setfilter","refentry"],["CairoSurfacePattern","class.cairosurfacepattern","phpdoc:classref"],["","class.cairolineargradient","section"],["","class.cairolineargradient","section"],["","cairolineargradient.construct","example"],["CairoLinearGradient::__construct","cairolineargradient.construct","refentry"],["","cairolineargradient.getpoints","example"],["CairoLinearGradient::getPoints","cairolineargradient.getpoints","refentry"],["CairoLinearGradient","class.cairolineargradient","phpdoc:classref"],["","class.cairoradialgradient","section"],["","class.cairoradialgradient","section"],["","cairoradialgradient.construct","example"],["CairoRadialGradient::__construct","cairoradialgradient.construct","refentry"],["","cairoradialgradient.getcircles","example"],["CairoRadialGradient::getCircles","cairoradialgradient.getcircles","refentry"],["CairoRadialGradient","class.cairoradialgradient","phpdoc:classref"],["","class.cairoantialias","section"],["","class.cairoantialias","section"],["","class.cairoantialias","varlistentry"],["","class.cairoantialias","varlistentry"],["","class.cairoantialias","varlistentry"],["","class.cairoantialias","varlistentry"],["","class.cairoantialias","section"],["CairoAntialias","class.cairoantialias","phpdoc:classref"],["","class.cairocontent","section"],["","class.cairocontent","section"],["","class.cairocontent","varlistentry"],["","class.cairocontent","varlistentry"],["","class.cairocontent","varlistentry"],["","class.cairocontent","section"],["CairoContent","class.cairocontent","phpdoc:classref"],["","class.cairoextend","section"],["","class.cairoextend","section"],["","class.cairoextend","varlistentry"],["","class.cairoextend","varlistentry"],["","class.cairoextend","varlistentry"],["","class.cairoextend","varlistentry"],["","class.cairoextend","section"],["CairoExtend","class.cairoextend","phpdoc:classref"],["","class.cairoformat","section"],["","class.cairoformat","section"],["","class.cairoformat","varlistentry"],["","class.cairoformat","varlistentry"],["","class.cairoformat","varlistentry"],["","class.cairoformat","varlistentry"],["","class.cairoformat","section"],["","cairoformat.strideforwidth","example"],["CairoFormat::strideForWidth","cairoformat.strideforwidth","refentry"],["CairoFormat","class.cairoformat","phpdoc:classref"],["","class.cairofillrule","section"],["","class.cairofillrule","section"],["","class.cairofillrule","varlistentry"],["","class.cairofillrule","varlistentry"],["","class.cairofillrule","section"],["CairoFillRule","class.cairofillrule","phpdoc:classref"],["","class.cairofilter","section"],["","class.cairofilter","section"],["","class.cairofilter","varlistentry"],["","class.cairofilter","varlistentry"],["","class.cairofilter","varlistentry"],["","class.cairofilter","varlistentry"],["","class.cairofilter","varlistentry"],["","class.cairofilter","varlistentry"],["","class.cairofilter","section"],["CairoFilter","class.cairofilter","phpdoc:classref"],["","class.cairohintmetrics","section"],["","class.cairohintmetrics","section"],["","class.cairohintmetrics","varlistentry"],["","class.cairohintmetrics","varlistentry"],["","class.cairohintmetrics","varlistentry"],["","class.cairohintmetrics","section"],["CairoHintMetrics","class.cairohintmetrics","phpdoc:classref"],["","class.cairohintstyle","section"],["","class.cairohintstyle","section"],["","class.cairohintstyle","varlistentry"],["","class.cairohintstyle","varlistentry"],["","class.cairohintstyle","varlistentry"],["","class.cairohintstyle","varlistentry"],["","class.cairohintstyle","varlistentry"],["","class.cairohintstyle","section"],["CairoHintStyle","class.cairohintstyle","phpdoc:classref"],["","class.cairolinecap","section"],["","class.cairolinecap","section"],["","class.cairolinecap","varlistentry"],["","class.cairolinecap","varlistentry"],["","class.cairolinecap","varlistentry"],["","class.cairolinecap","section"],["CairoLineCap","class.cairolinecap","phpdoc:classref"],["","class.cairolinejoin","section"],["","class.cairolinejoin","section"],["","class.cairolinejoin","varlistentry"],["","class.cairolinejoin","varlistentry"],["","class.cairolinejoin","varlistentry"],["","class.cairolinejoin","section"],["CairoLineJoin","class.cairolinejoin","phpdoc:classref"],["","class.cairomatrix","section"],["","class.cairomatrix","section"],["","cairomatrix.construct","example"],["","cairomatrix.construct","example"],["CairoMatrix::__construct","cairomatrix.construct","refentry"],["","cairomatrix.initidentity","example"],["","cairomatrix.initidentity","example"],["CairoMatrix::initIdentity","cairomatrix.initidentity","refentry"],["","cairomatrix.initrotate","example"],["","cairomatrix.initrotate","example"],["CairoMatrix::initRotate","cairomatrix.initrotate","refentry"],["","cairomatrix.initscale","example"],["","cairomatrix.initscale","example"],["CairoMatrix::initScale","cairomatrix.initscale","refentry"],["","cairomatrix.inittranslate","example"],["","cairomatrix.inittranslate","example"],["CairoMatrix::initTranslate","cairomatrix.inittranslate","refentry"],["","cairomatrix.invert","example"],["CairoMatrix::invert","cairomatrix.invert","refentry"],["","cairomatrix.multiply","example"],["CairoMatrix::multiply","cairomatrix.multiply","refentry"],["","cairomatrix.rotate","example"],["","cairomatrix.rotate","example"],["CairoMatrix::rotate","cairomatrix.rotate","refentry"],["","cairomatrix.scale","example"],["","cairomatrix.scale","example"],["CairoMatrix::scale","cairomatrix.scale","refentry"],["","cairomatrix.transformdistance","example"],["CairoMatrix::transformDistance","cairomatrix.transformdistance","refentry"],["","cairomatrix.transformpoint","example"],["CairoMatrix::transformPoint","cairomatrix.transformpoint","refentry"],["","cairomatrix.translate","example"],["","cairomatrix.translate","example"],["CairoMatrix::translate","cairomatrix.translate","refentry"],["CairoMatrix","class.cairomatrix","phpdoc:classref"],["","class.cairooperator","section"],["","class.cairooperator","section"],["","class.cairooperator","varlistentry"],["","class.cairooperator","varlistentry"],["","class.cairooperator","varlistentry"],["","class.cairooperator","varlistentry"],["","class.cairooperator","varlistentry"],["","class.cairooperator","varlistentry"],["","class.cairooperator","varlistentry"],["","class.cairooperator","varlistentry"],["","class.cairooperator","varlistentry"],["","class.cairooperator","varlistentry"],["","class.cairooperator","varlistentry"],["","class.cairooperator","varlistentry"],["","class.cairooperator","varlistentry"],["","class.cairooperator","varlistentry"],["","class.cairooperator","section"],["CairoOperator","class.cairooperator","phpdoc:classref"],["","class.cairopath","section"],["","class.cairopath","section"],["CairoPath","class.cairopath","phpdoc:classref"],["","class.cairopslevel","section"],["","class.cairopslevel","section"],["","class.cairopslevel","varlistentry"],["","class.cairopslevel","varlistentry"],["","class.cairopslevel","section"],["CairoPsLevel","class.cairopslevel","phpdoc:classref"],["","class.cairosubpixelorder","section"],["","class.cairosubpixelorder","section"],["","class.cairosubpixelorder","varlistentry"],["","class.cairosubpixelorder","varlistentry"],["","class.cairosubpixelorder","varlistentry"],["","class.cairosubpixelorder","varlistentry"],["","class.cairosubpixelorder","varlistentry"],["","class.cairosubpixelorder","section"],["CairoSubpixelOrder","class.cairosubpixelorder","phpdoc:classref"],["","class.cairosvgversion","section"],["","class.cairosvgversion","section"],["","class.cairosvgversion","varlistentry"],["","class.cairosvgversion","varlistentry"],["","class.cairosvgversion","section"],["CairoSvgVersion","class.cairosvgversion","phpdoc:classref"],["Cairo","book.cairo","book"],["","intro.exif","preface"],["","exif.requirements","section"],["","exif.installation","section"],["","exif.configuration","varlistentry"],["","exif.configuration","varlistentry"],["","exif.configuration","varlistentry"],["","exif.configuration","varlistentry"],["","exif.configuration","varlistentry"],["","exif.configuration","varlistentry"],["","exif.configuration","section"],["","exif.resources","section"],["","exif.setup","chapter"],["","exif.constants","varlistentry"],["","exif.constants","appendix"],["","function.exif-imagetype","example"],["exif_imagetype","function.exif-imagetype","refentry"],["","function.exif-read-data","example"],["exif_read_data","function.exif-read-data","refentry"],["","function.exif-tagname","example"],["exif_tagname","function.exif-tagname","refentry"],["","function.exif-thumbnail","example"],["exif_thumbnail","function.exif-thumbnail","refentry"],["read_exif_data","function.read-exif-data","refentry"],["","ref.exif","reference"],["Exif","book.exif","book"],["","intro.image","preface"],["","image.requirements","section"],["","image.installation","section"],["","image.configuration","varlistentry"],["","image.configuration","section"],["","image.resources","section"],["","image.setup","chapter"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","varlistentry"],["","image.constants","appendix"],["","image.examples-png","example"],["","image.examples-png","section"],["","image.examples-watermark","example"],["","image.examples-watermark","section"],["","image.examples.merged-watermark","example"],["","image.examples.merged-watermark","section"],["","image.examples","chapter"],["","function.gd-info","example"],["gd_info","function.gd-info","refentry"],["","function.getimagesize","example"],["","function.getimagesize","example"],["","function.getimagesize","example"],["","function.getimagesize","example"],["getimagesize","function.getimagesize","refentry"],["","function.getimagesizefromstring","example"],["getimagesizefromstring","function.getimagesizefromstring","refentry"],["","function.image-type-to-extension","example"],["image_type_to_extension","function.image-type-to-extension","refentry"],["","function.image-type-to-mime-type","example"],["image_type_to_mime_type","function.image-type-to-mime-type","refentry"],["","function.image2wbmp","example"],["image2wbmp","function.image2wbmp","refentry"],["imageaffine","function.imageaffine","refentry"],["imageaffinematrixconcat","function.imageaffinematrixconcat","refentry"],["imageaffinematrixget","function.imageaffinematrixget","refentry"],["","function.imagealphablending","example"],["imagealphablending","function.imagealphablending","refentry"],["","function.imageantialias","example"],["imageantialias","function.imageantialias","refentry"],["","function.imagearc","example"],["imagearc","function.imagearc","refentry"],["","function.imagechar","example"],["imagechar","function.imagechar","refentry"],["","function.imagecharup","example"],["imagecharup","function.imagecharup","refentry"],["","function.imagecolorallocate","example"],["imagecolorallocate","function.imagecolorallocate","refentry"],["","function.imagecolorallocatealpha","example"],["imagecolorallocatealpha","function.imagecolorallocatealpha","refentry"],["","function.imagecolorat","example"],["","function.imagecolorat","example"],["imagecolorat","function.imagecolorat","refentry"],["","function.imagecolorclosest","example"],["imagecolorclosest","function.imagecolorclosest","refentry"],["","function.imagecolorclosestalpha","example"],["imagecolorclosestalpha","function.imagecolorclosestalpha","refentry"],["","function.imagecolorclosesthwb","example"],["imagecolorclosesthwb","function.imagecolorclosesthwb","refentry"],["","function.imagecolordeallocate","example"],["imagecolordeallocate","function.imagecolordeallocate","refentry"],["","function.imagecolorexact","example"],["imagecolorexact","function.imagecolorexact","refentry"],["","function.imagecolorexactalpha","example"],["imagecolorexactalpha","function.imagecolorexactalpha","refentry"],["","function.imagecolormatch","example"],["imagecolormatch","function.imagecolormatch","refentry"],["","function.imagecolorresolve","example"],["imagecolorresolve","function.imagecolorresolve","refentry"],["","function.imagecolorresolvealpha","example"],["imagecolorresolvealpha","function.imagecolorresolvealpha","refentry"],["","function.imagecolorset","example"],["imagecolorset","function.imagecolorset","refentry"],["","function.imagecolorsforindex","example"],["imagecolorsforindex","function.imagecolorsforindex","refentry"],["","function.imagecolorstotal","example"],["imagecolorstotal","function.imagecolorstotal","refentry"],["","function.imagecolortransparent","example"],["imagecolortransparent","function.imagecolortransparent","refentry"],["","function.imageconvolution","example"],["","function.imageconvolution","example"],["imageconvolution","function.imageconvolution","refentry"],["","function.imagecopy","example"],["imagecopy","function.imagecopy","refentry"],["","function.imagecopymerge","example"],["imagecopymerge","function.imagecopymerge","refentry"],["","function.imagecopymergegray","example"],["imagecopymergegray","function.imagecopymergegray","refentry"],["","function.imagecopyresampled","example"],["","function.imagecopyresampled","example"],["imagecopyresampled","function.imagecopyresampled","refentry"],["","function.imagecopyresized","example"],["imagecopyresized","function.imagecopyresized","refentry"],["","function.imagecreate","example"],["imagecreate","function.imagecreate","refentry"],["","function.imagecreatefromgd2","example"],["imagecreatefromgd2","function.imagecreatefromgd2","refentry"],["","function.imagecreatefromgd2part","example"],["imagecreatefromgd2part","function.imagecreatefromgd2part","refentry"],["","function.imagecreatefromgd","example"],["imagecreatefromgd","function.imagecreatefromgd","refentry"],["","function.imagecreatefromgif","example"],["imagecreatefromgif","function.imagecreatefromgif","refentry"],["","function.imagecreatefromjpeg","example"],["imagecreatefromjpeg","function.imagecreatefromjpeg","refentry"],["","function.imagecreatefrompng","example"],["imagecreatefrompng","function.imagecreatefrompng","refentry"],["","function.imagecreatefromstring","example"],["imagecreatefromstring","function.imagecreatefromstring","refentry"],["","function.imagecreatefromwbmp","example"],["imagecreatefromwbmp","function.imagecreatefromwbmp","refentry"],["","function.imagecreatefromwebp","example"],["imagecreatefromwebp","function.imagecreatefromwebp","refentry"],["","function.imagecreatefromxbm","example"],["imagecreatefromxbm","function.imagecreatefromxbm","refentry"],["","function.imagecreatefromxpm","example"],["imagecreatefromxpm","function.imagecreatefromxpm","refentry"],["","function.imagecreatetruecolor","example"],["imagecreatetruecolor","function.imagecreatetruecolor","refentry"],["imagecrop","function.imagecrop","refentry"],["imagecropauto","function.imagecropauto","refentry"],["","function.imagedashedline","example"],["","function.imagedashedline","example"],["imagedashedline","function.imagedashedline","refentry"],["","function.imagedestroy","example"],["imagedestroy","function.imagedestroy","refentry"],["","function.imageellipse","example"],["imageellipse","function.imageellipse","refentry"],["","function.imagefill","example"],["imagefill","function.imagefill","refentry"],["","function.imagefilledarc","example"],["imagefilledarc","function.imagefilledarc","refentry"],["","function.imagefilledellipse","example"],["imagefilledellipse","function.imagefilledellipse","refentry"],["","function.imagefilledpolygon","example"],["imagefilledpolygon","function.imagefilledpolygon","refentry"],["","function.imagefilledrectangle","example"],["imagefilledrectangle","function.imagefilledrectangle","refentry"],["","function.imagefilltoborder","example"],["imagefilltoborder","function.imagefilltoborder","refentry"],["","function.imagefilter","example"],["","function.imagefilter","example"],["","function.imagefilter","example"],["","function.imagefilter","example"],["","function.imagefilter","example"],["imagefilter","function.imagefilter","refentry"],["","function.imageflip","example"],["","function.imageflip","example"],["imageflip","function.imageflip","refentry"],["","function.imagefontheight","example"],["","function.imagefontheight","example"],["imagefontheight","function.imagefontheight","refentry"],["","function.imagefontwidth","example"],["","function.imagefontwidth","example"],["imagefontwidth","function.imagefontwidth","refentry"],["","function.imageftbbox","example"],["imageftbbox","function.imageftbbox","refentry"],["","function.imagefttext","example"],["imagefttext","function.imagefttext","refentry"],["","function.imagegammacorrect","example"],["imagegammacorrect","function.imagegammacorrect","refentry"],["","function.imagegd2","example"],["","function.imagegd2","example"],["imagegd2","function.imagegd2","refentry"],["","function.imagegd","example"],["","function.imagegd","example"],["imagegd","function.imagegd","refentry"],["","function.imagegif","example"],["","function.imagegif","example"],["imagegif","function.imagegif","refentry"],["","function.imagegrabscreen","example"],["imagegrabscreen","function.imagegrabscreen","refentry"],["","function.imagegrabwindow","example"],["imagegrabwindow","function.imagegrabwindow","refentry"],["","function.imageinterlace","example"],["imageinterlace","function.imageinterlace","refentry"],["","function.imageistruecolor","example"],["imageistruecolor","function.imageistruecolor","refentry"],["","function.imagejpeg","example"],["","function.imagejpeg","example"],["","function.imagejpeg","example"],["imagejpeg","function.imagejpeg","refentry"],["","function.imagelayereffect","example"],["imagelayereffect","function.imagelayereffect","refentry"],["","function.imageline","example"],["imageline","function.imageline","refentry"],["","function.imageloadfont","example"],["imageloadfont","function.imageloadfont","refentry"],["","function.imagepalettecopy","example"],["imagepalettecopy","function.imagepalettecopy","refentry"],["","function.imagepalettetotruecolor","example"],["imagepalettetotruecolor","function.imagepalettetotruecolor","refentry"],["imagepng","function.imagepng","refentry"],["","function.imagepolygon","example"],["imagepolygon","function.imagepolygon","refentry"],["","function.imagepsbbox","example"],["imagepsbbox","function.imagepsbbox","refentry"],["","function.imagepsencodefont","example"],["imagepsencodefont","function.imagepsencodefont","refentry"],["","function.imagepsextendfont","example"],["imagepsextendfont","function.imagepsextendfont","refentry"],["","function.imagepsfreefont","example"],["imagepsfreefont","function.imagepsfreefont","refentry"],["","function.imagepsloadfont","example"],["imagepsloadfont","function.imagepsloadfont","refentry"],["","function.imagepsslantfont","example"],["imagepsslantfont","function.imagepsslantfont","refentry"],["","function.imagepstext","example"],["imagepstext","function.imagepstext","refentry"],["","function.imagerectangle","example"],["imagerectangle","function.imagerectangle","refentry"],["","function.imagerotate","example"],["imagerotate","function.imagerotate","refentry"],["","function.imagesavealpha","example"],["imagesavealpha","function.imagesavealpha","refentry"],["imagescale","function.imagescale","refentry"],["","function.imagesetbrush","example"],["imagesetbrush","function.imagesetbrush","refentry"],["","function.imagesetinterpolation","example"],["imagesetinterpolation","function.imagesetinterpolation","refentry"],["","function.imagesetpixel","example"],["imagesetpixel","function.imagesetpixel","refentry"],["","function.imagesetstyle","example"],["imagesetstyle","function.imagesetstyle","refentry"],["","function.imagesetthickness","example"],["imagesetthickness","function.imagesetthickness","refentry"],["","function.imagesettile","example"],["imagesettile","function.imagesettile","refentry"],["","function.imagestring","example"],["imagestring","function.imagestring","refentry"],["","function.imagestringup","example"],["imagestringup","function.imagestringup","refentry"],["","function.imagesx","example"],["imagesx","function.imagesx","refentry"],["","function.imagesy","example"],["imagesy","function.imagesy","refentry"],["","function.imagetruecolortopalette","example"],["imagetruecolortopalette","function.imagetruecolortopalette","refentry"],["","function.imagettfbbox","example"],["imagettfbbox","function.imagettfbbox","refentry"],["","function.imagettftext","example"],["imagettftext","function.imagettftext","refentry"],["","function.imagetypes","example"],["imagetypes","function.imagetypes","refentry"],["","function.imagewbmp","example"],["","function.imagewbmp","example"],["","function.imagewbmp","example"],["imagewbmp","function.imagewbmp","refentry"],["","function.imagewebp","example"],["imagewebp","function.imagewebp","refentry"],["","function.imagexbm","example"],["","function.imagexbm","example"],["imagexbm","function.imagexbm","refentry"],["","function.iptcembed","example"],["iptcembed","function.iptcembed","refentry"],["","function.iptcparse","example"],["iptcparse","function.iptcparse","refentry"],["","function.jpeg2wbmp","example"],["jpeg2wbmp","function.jpeg2wbmp","refentry"],["","function.png2wbmp","example"],["png2wbmp","function.png2wbmp","refentry"],["","ref.image","reference"],["GD","book.image","book"],["","intro.gmagick","preface"],["","gmagick.requirements","section"],["","gmagick.installation","section"],["","gmagick.configuration","section"],["","gmagick.setup","chapter"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","variablelist"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","variablelist"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","variablelist"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","variablelist"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","variablelist"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","variablelist"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","variablelist"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","variablelist"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","variablelist"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","variablelist"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","variablelist"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","variablelist"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","variablelist"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","variablelist"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","variablelist"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","variablelist"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","variablelist"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","variablelist"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","variablelist"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","variablelist"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","variablelist"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","variablelist"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","variablelist"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","variablelist"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","variablelist"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","variablelist"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","varlistentry"],["","gmagick.constants","variablelist"],["","gmagick.constants","appendix"],["","gmagick.examples","example"],["","gmagick.examples","chapter"],["","class.gmagick","section"],["","class.gmagick","section"],["Gmagick::addimage","gmagick.addimage","refentry"],["Gmagick::addnoiseimage","gmagick.addnoiseimage","refentry"],["Gmagick::annotateimage","gmagick.annotateimage","refentry"],["Gmagick::blurimage","gmagick.blurimage","refentry"],["Gmagick::borderimage","gmagick.borderimage","refentry"],["Gmagick::charcoalimage","gmagick.charcoalimage","refentry"],["Gmagick::chopimage","gmagick.chopimage","refentry"],["Gmagick::clear","gmagick.clear","refentry"],["Gmagick::commentimage","gmagick.commentimage","refentry"],["Gmagick::compositeimage","gmagick.compositeimage","refentry"],["Gmagick::__construct","gmagick.construct","refentry"],["Gmagick::cropimage","gmagick.cropimage","refentry"],["Gmagick::cropthumbnailimage","gmagick.cropthumbnailimage","refentry"],["Gmagick::current","gmagick.current","refentry"],["Gmagick::cyclecolormapimage","gmagick.cyclecolormapimage","refentry"],["Gmagick::deconstructimages","gmagick.deconstructimages","refentry"],["","gmagick.despeckleimage","example"],["Gmagick::despeckleimage","gmagick.despeckleimage","refentry"],["Gmagick::destroy","gmagick.destroy","refentry"],["Gmagick::drawimage","gmagick.drawimage","refentry"],["Gmagick::edgeimage","gmagick.edgeimage","refentry"],["Gmagick::embossimage","gmagick.embossimage","refentry"],["Gmagick::enhanceimage","gmagick.enhanceimage","refentry"],["Gmagick::equalizeimage","gmagick.equalizeimage","refentry"],["Gmagick::flipimage","gmagick.flipimage","refentry"],["Gmagick::flopimage","gmagick.flopimage","refentry"],["Gmagick::frameimage","gmagick.frameimage","refentry"],["Gmagick::gammaimage","gmagick.gammaimage","refentry"],["Gmagick::getcopyright","gmagick.getcopyright","refentry"],["Gmagick::getfilename","gmagick.getfilename","refentry"],["Gmagick::getimagebackgroundcolor","gmagick.getimagebackgroundcolor","refentry"],["Gmagick::getimageblueprimary","gmagick.getimageblueprimary","refentry"],["Gmagick::getimagebordercolor","gmagick.getimagebordercolor","refentry"],["Gmagick::getimagechanneldepth","gmagick.getimagechanneldepth","refentry"],["Gmagick::getimagecolors","gmagick.getimagecolors","refentry"],["Gmagick::getimagecolorspace","gmagick.getimagecolorspace","refentry"],["Gmagick::getimagecompose","gmagick.getimagecompose","refentry"],["Gmagick::getimagedelay","gmagick.getimagedelay","refentry"],["Gmagick::getimagedepth","gmagick.getimagedepth","refentry"],["Gmagick::getimagedispose","gmagick.getimagedispose","refentry"],["Gmagick::getimageextrema","gmagick.getimageextrema","refentry"],["Gmagick::getimagefilename","gmagick.getimagefilename","refentry"],["Gmagick::getimageformat","gmagick.getimageformat","refentry"],["Gmagick::getimagegamma","gmagick.getimagegamma","refentry"],["Gmagick::getimagegreenprimary","gmagick.getimagegreenprimary","refentry"],["Gmagick::getimageheight","gmagick.getimageheight","refentry"],["Gmagick::getimagehistogram","gmagick.getimagehistogram","refentry"],["Gmagick::getimageindex","gmagick.getimageindex","refentry"],["Gmagick::getimageinterlacescheme","gmagick.getimageinterlacescheme","refentry"],["Gmagick::getimageiterations","gmagick.getimageiterations","refentry"],["Gmagick::getimagematte","gmagick.getimagematte","refentry"],["Gmagick::getimagemattecolor","gmagick.getimagemattecolor","refentry"],["Gmagick::getimageprofile","gmagick.getimageprofile","refentry"],["Gmagick::getimageredprimary","gmagick.getimageredprimary","refentry"],["Gmagick::getimagerenderingintent","gmagick.getimagerenderingintent","refentry"],["Gmagick::getimageresolution","gmagick.getimageresolution","refentry"],["Gmagick::getimagescene","gmagick.getimagescene","refentry"],["Gmagick::getimagesignature","gmagick.getimagesignature","refentry"],["Gmagick::getimagetype","gmagick.getimagetype","refentry"],["Gmagick::getimageunits","gmagick.getimageunits","refentry"],["Gmagick::getimagewhitepoint","gmagick.getimagewhitepoint","refentry"],["Gmagick::getimagewidth","gmagick.getimagewidth","refentry"],["Gmagick::getpackagename","gmagick.getpackagename","refentry"],["Gmagick::getquantumdepth","gmagick.getquantumdepth","refentry"],["Gmagick::getreleasedate","gmagick.getreleasedate","refentry"],["Gmagick::getsamplingfactors","gmagick.getsamplingfactors","refentry"],["Gmagick::getsize","gmagick.getsize","refentry"],["Gmagick::getversion","gmagick.getversion","refentry"],["Gmagick::hasnextimage","gmagick.hasnextimage","refentry"],["Gmagick::haspreviousimage","gmagick.haspreviousimage","refentry"],["Gmagick::implodeimage","gmagick.implodeimage","refentry"],["Gmagick::labelimage","gmagick.labelimage","refentry"],["Gmagick::levelimage","gmagick.levelimage","refentry"],["Gmagick::magnifyimage","gmagick.magnifyimage","refentry"],["Gmagick::mapimage","gmagick.mapimage","refentry"],["Gmagick::medianfilterimage","gmagick.medianfilterimage","refentry"],["Gmagick::minifyimage","gmagick.minifyimage","refentry"],["Gmagick::modulateimage","gmagick.modulateimage","refentry"],["Gmagick::motionblurimage","gmagick.motionblurimage","refentry"],["Gmagick::newimage","gmagick.newimage","refentry"],["Gmagick::nextimage","gmagick.nextimage","refentry"],["Gmagick::normalizeimage","gmagick.normalizeimage","refentry"],["Gmagick::oilpaintimage","gmagick.oilpaintimage","refentry"],["Gmagick::previousimage","gmagick.previousimage","refentry"],["Gmagick::profileimage","gmagick.profileimage","refentry"],["Gmagick::quantizeimage","gmagick.quantizeimage","refentry"],["Gmagick::quantizeimages","gmagick.quantizeimages","refentry"],["Gmagick::queryfontmetrics","gmagick.queryfontmetrics","refentry"],["Gmagick::queryfonts","gmagick.queryfonts","refentry"],["Gmagick::queryformats","gmagick.queryformats","refentry"],["Gmagick::radialblurimage","gmagick.radialblurimage","refentry"],["Gmagick::raiseimage","gmagick.raiseimage","refentry"],["Gmagick::read","gmagick.read","refentry"],["Gmagick::readimage","gmagick.readimage","refentry"],["Gmagick::readimageblob","gmagick.readimageblob","refentry"],["Gmagick::readimagefile","gmagick.readimagefile","refentry"],["Gmagick::reducenoiseimage","gmagick.reducenoiseimage","refentry"],["Gmagick::removeimage","gmagick.removeimage","refentry"],["Gmagick::removeimageprofile","gmagick.removeimageprofile","refentry"],["Gmagick::resampleimage","gmagick.resampleimage","refentry"],["Gmagick::resizeimage","gmagick.resizeimage","refentry"],["Gmagick::rollimage","gmagick.rollimage","refentry"],["Gmagick::rotateimage","gmagick.rotateimage","refentry"],["Gmagick::scaleimage","gmagick.scaleimage","refentry"],["Gmagick::separateimagechannel","gmagick.separateimagechannel","refentry"],["Gmagick::setfilename","gmagick.setfilename","refentry"],["Gmagick::setimagebackgroundcolor","gmagick.setimagebackgroundcolor","refentry"],["Gmagick::setimageblueprimary","gmagick.setimageblueprimary","refentry"],["Gmagick::setimagebordercolor","gmagick.setimagebordercolor","refentry"],["Gmagick::setimagechanneldepth","gmagick.setimagechanneldepth","refentry"],["Gmagick::setimagecolorspace","gmagick.setimagecolorspace","refentry"],["Gmagick::setimagecompose","gmagick.setimagecompose","refentry"],["Gmagick::setimagedelay","gmagick.setimagedelay","refentry"],["Gmagick::setimagedepth","gmagick.setimagedepth","refentry"],["Gmagick::setimagedispose","gmagick.setimagedispose","refentry"],["Gmagick::setimagefilename","gmagick.setimagefilename","refentry"],["Gmagick::setimageformat","gmagick.setimageformat","refentry"],["Gmagick::setimagegamma","gmagick.setimagegamma","refentry"],["Gmagick::setimagegreenprimary","gmagick.setimagegreenprimary","refentry"],["Gmagick::setimageindex","gmagick.setimageindex","refentry"],["Gmagick::setimageinterlacescheme","gmagick.setimageinterlacescheme","refentry"],["Gmagick::setimageiterations","gmagick.setimageiterations","refentry"],["Gmagick::setimageprofile","gmagick.setimageprofile","refentry"],["Gmagick::setimageredprimary","gmagick.setimageredprimary","refentry"],["Gmagick::setimagerenderingintent","gmagick.setimagerenderingintent","refentry"],["Gmagick::setimageresolution","gmagick.setimageresolution","refentry"],["Gmagick::setimagescene","gmagick.setimagescene","refentry"],["Gmagick::setimagetype","gmagick.setimagetype","refentry"],["Gmagick::setimageunits","gmagick.setimageunits","refentry"],["Gmagick::setimagewhitepoint","gmagick.setimagewhitepoint","refentry"],["Gmagick::setsamplingfactors","gmagick.setsamplingfactors","refentry"],["Gmagick::setsize","gmagick.setsize","refentry"],["Gmagick::shearimage","gmagick.shearimage","refentry"],["Gmagick::solarizeimage","gmagick.solarizeimage","refentry"],["Gmagick::spreadimage","gmagick.spreadimage","refentry"],["Gmagick::stripimage","gmagick.stripimage","refentry"],["Gmagick::swirlimage","gmagick.swirlimage","refentry"],["Gmagick::thumbnailimage","gmagick.thumbnailimage","refentry"],["Gmagick::trimimage","gmagick.trimimage","refentry"],["Gmagick::write","gmagick.write","refentry"],["Gmagick::writeimage","gmagick.writeimage","refentry"],["Gmagick","class.gmagick","phpdoc:classref"],["","class.gmagickdraw","section"],["","class.gmagickdraw","section"],["GmagickDraw::annotate","gmagickdraw.annotate","refentry"],["GmagickDraw::arc","gmagickdraw.arc","refentry"],["GmagickDraw::bezier","gmagickdraw.bezier","refentry"],["GmagickDraw::ellipse","gmagickdraw.ellipse","refentry"],["GmagickDraw::getfillcolor","gmagickdraw.getfillcolor","refentry"],["GmagickDraw::getfillopacity","gmagickdraw.getfillopacity","refentry"],["GmagickDraw::getfont","gmagickdraw.getfont","refentry"],["GmagickDraw::getfontsize","gmagickdraw.getfontsize","refentry"],["GmagickDraw::getfontstyle","gmagickdraw.getfontstyle","refentry"],["GmagickDraw::getfontweight","gmagickdraw.getfontweight","refentry"],["GmagickDraw::getstrokecolor","gmagickdraw.getstrokecolor","refentry"],["GmagickDraw::getstrokeopacity","gmagickdraw.getstrokeopacity","refentry"],["GmagickDraw::getstrokewidth","gmagickdraw.getstrokewidth","refentry"],["GmagickDraw::gettextdecoration","gmagickdraw.gettextdecoration","refentry"],["GmagickDraw::gettextencoding","gmagickdraw.gettextencoding","refentry"],["GmagickDraw::line","gmagickdraw.line","refentry"],["GmagickDraw::point","gmagickdraw.point","refentry"],["GmagickDraw::polygon","gmagickdraw.polygon","refentry"],["GmagickDraw::polyline","gmagickdraw.polyline","refentry"],["GmagickDraw::rectangle","gmagickdraw.rectangle","refentry"],["GmagickDraw::rotate","gmagickdraw.rotate","refentry"],["GmagickDraw::roundrectangle","gmagickdraw.roundrectangle","refentry"],["GmagickDraw::scale","gmagickdraw.scale","refentry"],["GmagickDraw::setfillcolor","gmagickdraw.setfillcolor","refentry"],["GmagickDraw::setfillopacity","gmagickdraw.setfillopacity","refentry"],["GmagickDraw::setfont","gmagickdraw.setfont","refentry"],["GmagickDraw::setfontsize","gmagickdraw.setfontsize","refentry"],["GmagickDraw::setfontstyle","gmagickdraw.setfontstyle","refentry"],["GmagickDraw::setfontweight","gmagickdraw.setfontweight","refentry"],["GmagickDraw::setstrokecolor","gmagickdraw.setstrokecolor","refentry"],["GmagickDraw::setstrokeopacity","gmagickdraw.setstrokeopacity","refentry"],["GmagickDraw::setstrokewidth","gmagickdraw.setstrokewidth","refentry"],["GmagickDraw::settextdecoration","gmagickdraw.settextdecoration","refentry"],["GmagickDraw::settextencoding","gmagickdraw.settextencoding","refentry"],["GmagickDraw","class.gmagickdraw","phpdoc:classref"],["","class.gmagickpixel","section"],["","class.gmagickpixel","section"],["GmagickPixel::__construct","gmagickpixel.construct","refentry"],["GmagickPixel::getcolor","gmagickpixel.getcolor","refentry"],["GmagickPixel::getcolorcount","gmagickpixel.getcolorcount","refentry"],["GmagickPixel::getcolorvalue","gmagickpixel.getcolorvalue","refentry"],["GmagickPixel::setcolor","gmagickpixel.setcolor","refentry"],["GmagickPixel::setcolorvalue","gmagickpixel.setcolorvalue","refentry"],["GmagickPixel","class.gmagickpixel","phpdoc:classref"],["Gmagick","book.gmagick","book"],["","intro.imagick","section"],["","intro.imagick","preface"],["","imagick.requirements","section"],["","imagick.installation","section"],["","imagick.configuration","varlistentry"],["","imagick.configuration","varlistentry"],["","imagick.configuration","section"],["","imagick.resources","section"],["","imagick.setup","chapter"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","varlistentry"],["","imagick.constants","variablelist"],["","imagick.constants","appendix"],["","imagick.examples-1","example"],["","imagick.examples-1","example"],["","imagick.examples-1","example"],["","imagick.examples-1","example"],["","imagick.examples-1","example"],["","imagick.examples-1","example"],["","imagick.examples-1","section"],["","imagick.examples","chapter"],["","class.imagick","section"],["","class.imagick","section"],["","class.imagick","section"],["","imagick.adaptiveblurimage","example"],["Imagick::adaptiveBlurImage","imagick.adaptiveblurimage","refentry"],["","imagick.adaptiveresizeimage","example"],["Imagick::adaptiveResizeImage","imagick.adaptiveresizeimage","refentry"],["","imagick.adaptivesharpenimage","example"],["Imagick::adaptiveSharpenImage","imagick.adaptivesharpenimage","refentry"],["Imagick::adaptiveThresholdImage","imagick.adaptivethresholdimage","refentry"],["Imagick::addImage","imagick.addimage","refentry"],["Imagick::addNoiseImage","imagick.addnoiseimage","refentry"],["Imagick::affineTransformImage","imagick.affinetransformimage","refentry"],["Imagick::animateImages","imagick.animateimages","refentry"],["","imagick.annotateimage","example"],["Imagick::annotateImage","imagick.annotateimage","refentry"],["","imagick.appendimages","example"],["Imagick::appendImages","imagick.appendimages","refentry"],["Imagick::averageImages","imagick.averageimages","refentry"],["Imagick::blackThresholdImage","imagick.blackthresholdimage","refentry"],["","imagick.blurimage","example"],["Imagick::blurImage","imagick.blurimage","refentry"],["Imagick::borderImage","imagick.borderimage","refentry"],["Imagick::charcoalImage","imagick.charcoalimage","refentry"],["","imagick.chopimage","example"],["Imagick::chopImage","imagick.chopimage","refentry"],["Imagick::clear","imagick.clear","refentry"],["Imagick::clipImage","imagick.clipimage","refentry"],["Imagick::clipPathImage","imagick.clippathimage","refentry"],["","imagick.clone","example"],["Imagick::clone","imagick.clone","refentry"],["","imagick.clutimage","example"],["Imagick::clutImage","imagick.clutimage","refentry"],["Imagick::coalesceImages","imagick.coalesceimages","refentry"],["Imagick::colorFloodfillImage","imagick.colorfloodfillimage","refentry"],["Imagick::colorizeImage","imagick.colorizeimage","refentry"],["Imagick::combineImages","imagick.combineimages","refentry"],["","imagick.commentimage","example"],["Imagick::commentImage","imagick.commentimage","refentry"],["Imagick::compareImageChannels","imagick.compareimagechannels","refentry"],["","imagick.compareimagelayers","example"],["Imagick::compareImageLayers","imagick.compareimagelayers","refentry"],["","imagick.compareimages","example"],["Imagick::compareImages","imagick.compareimages","refentry"],["Imagick::compositeImage","imagick.compositeimage","refentry"],["Imagick::__construct","imagick.construct","refentry"],["Imagick::contrastImage","imagick.contrastimage","refentry"],["Imagick::contrastStretchImage","imagick.contraststretchimage","refentry"],["Imagick::convolveImage","imagick.convolveimage","refentry"],["Imagick::cropImage","imagick.cropimage","refentry"],["Imagick::cropThumbnailImage","imagick.cropthumbnailimage","refentry"],["Imagick::current","imagick.current","refentry"],["Imagick::cycleColormapImage","imagick.cyclecolormapimage","refentry"],["Imagick::decipherImage","imagick.decipherimage","refentry"],["Imagick::deconstructImages","imagick.deconstructimages","refentry"],["Imagick::deleteImageArtifact","imagick.deleteimageartifact","refentry"],["Imagick::deskewImage","imagick.deskewimage","refentry"],["Imagick::despeckleImage","imagick.despeckleimage","refentry"],["Imagick::destroy","imagick.destroy","refentry"],["Imagick::displayImage","imagick.displayimage","refentry"],["Imagick::displayImages","imagick.displayimages","refentry"],["","imagick.distortimage","example"],["Imagick::distortImage","imagick.distortimage","refentry"],["Imagick::drawImage","imagick.drawimage","refentry"],["Imagick::edgeImage","imagick.edgeimage","refentry"],["Imagick::embossImage","imagick.embossimage","refentry"],["Imagick::encipherImage","imagick.encipherimage","refentry"],["Imagick::enhanceImage","imagick.enhanceimage","refentry"],["Imagick::equalizeImage","imagick.equalizeimage","refentry"],["","imagick.evaluateimage","example"],["Imagick::evaluateImage","imagick.evaluateimage","refentry"],["","imagick.exportimagepixels","example"],["Imagick::exportImagePixels","imagick.exportimagepixels","refentry"],["Imagick::extentImage","imagick.extentimage","refentry"],["Imagick::flattenImages","imagick.flattenimages","refentry"],["Imagick::flipImage","imagick.flipimage","refentry"],["","imagick.floodfillpaintimage","example"],["Imagick::floodFillPaintImage","imagick.floodfillpaintimage","refentry"],["Imagick::flopImage","imagick.flopimage","refentry"],["Imagick::frameImage","imagick.frameimage","refentry"],["Imagick::functionImage","imagick.functionimage","refentry"],["Imagick::fxImage","imagick.fximage","refentry"],["Imagick::gammaImage","imagick.gammaimage","refentry"],["Imagick::gaussianBlurImage","imagick.gaussianblurimage","refentry"],["Imagick::getColorspace","imagick.getcolorspace","refentry"],["Imagick::getCompression","imagick.getcompression","refentry"],["Imagick::getCompressionQuality","imagick.getcompressionquality","refentry"],["Imagick::getCopyright","imagick.getcopyright","refentry"],["Imagick::getFilename","imagick.getfilename","refentry"],["Imagick::getFont","imagick.getfont","refentry"],["Imagick::getFormat","imagick.getformat","refentry"],["Imagick::getGravity","imagick.getgravity","refentry"],["Imagick::getHomeURL","imagick.gethomeurl","refentry"],["Imagick::getImage","imagick.getimage","refentry"],["Imagick::getImageAlphaChannel","imagick.getimagealphachannel","refentry"],["Imagick::getImageArtifact","imagick.getimageartifact","refentry"],["Imagick::getImageBackgroundColor","imagick.getimagebackgroundcolor","refentry"],["Imagick::getImageBlob","imagick.getimageblob","refentry"],["Imagick::getImageBluePrimary","imagick.getimageblueprimary","refentry"],["Imagick::getImageBorderColor","imagick.getimagebordercolor","refentry"],["Imagick::getImageChannelDepth","imagick.getimagechanneldepth","refentry"],["Imagick::getImageChannelDistortion","imagick.getimagechanneldistortion","refentry"],["Imagick::getImageChannelDistortions","imagick.getimagechanneldistortions","refentry"],["Imagick::getImageChannelExtrema","imagick.getimagechannelextrema","refentry"],["Imagick::getImageChannelKurtosis","imagick.getimagechannelkurtosis","refentry"],["Imagick::getImageChannelMean","imagick.getimagechannelmean","refentry"],["Imagick::getImageChannelRange","imagick.getimagechannelrange","refentry"],["Imagick::getImageChannelStatistics","imagick.getimagechannelstatistics","refentry"],["Imagick::getImageClipMask","imagick.getimageclipmask","refentry"],["Imagick::getImageColormapColor","imagick.getimagecolormapcolor","refentry"],["Imagick::getImageColors","imagick.getimagecolors","refentry"],["Imagick::getImageColorspace","imagick.getimagecolorspace","refentry"],["Imagick::getImageCompose","imagick.getimagecompose","refentry"],["Imagick::getImageCompression","imagick.getimagecompression","refentry"],["Imagick::getImageCompressionQuality","imagick.getimagecompressionquality","refentry"],["Imagick::getImageDelay","imagick.getimagedelay","refentry"],["Imagick::getImageDepth","imagick.getimagedepth","refentry"],["Imagick::getImageDispose","imagick.getimagedispose","refentry"],["Imagick::getImageDistortion","imagick.getimagedistortion","refentry"],["Imagick::getImageExtrema","imagick.getimageextrema","refentry"],["Imagick::getImageFilename","imagick.getimagefilename","refentry"],["Imagick::getImageFormat","imagick.getimageformat","refentry"],["Imagick::getImageGamma","imagick.getimagegamma","refentry"],["Imagick::getImageGeometry","imagick.getimagegeometry","refentry"],["Imagick::getImageGravity","imagick.getimagegravity","refentry"],["Imagick::getImageGreenPrimary","imagick.getimagegreenprimary","refentry"],["Imagick::getImageHeight","imagick.getimageheight","refentry"],["Imagick::getImageHistogram","imagick.getimagehistogram","refentry"],["Imagick::getImageIndex","imagick.getimageindex","refentry"],["Imagick::getImageInterlaceScheme","imagick.getimageinterlacescheme","refentry"],["Imagick::getImageInterpolateMethod","imagick.getimageinterpolatemethod","refentry"],["Imagick::getImageIterations","imagick.getimageiterations","refentry"],["","imagick.getimagelength","example"],["Imagick::getImageLength","imagick.getimagelength","refentry"],["Imagick::getImageMagickLicense","imagick.getimagemagicklicense","refentry"],["Imagick::getImageMatte","imagick.getimagematte","refentry"],["Imagick::getImageMatteColor","imagick.getimagemattecolor","refentry"],["Imagick::getImageOrientation","imagick.getimageorientation","refentry"],["Imagick::getImagePage","imagick.getimagepage","refentry"],["Imagick::getImagePixelColor","imagick.getimagepixelcolor","refentry"],["Imagick::getImageProfile","imagick.getimageprofile","refentry"],["Imagick::getImageProfiles","imagick.getimageprofiles","refentry"],["","imagick.getimageproperties","example"],["Imagick::getImageProperties","imagick.getimageproperties","refentry"],["","imagick.getimageproperty","example"],["Imagick::getImageProperty","imagick.getimageproperty","refentry"],["Imagick::getImageRedPrimary","imagick.getimageredprimary","refentry"],["Imagick::getImageRegion","imagick.getimageregion","refentry"],["Imagick::getImageRenderingIntent","imagick.getimagerenderingintent","refentry"],["Imagick::getImageResolution","imagick.getimageresolution","refentry"],["Imagick::getImagesBlob","imagick.getimagesblob","refentry"],["Imagick::getImageScene","imagick.getimagescene","refentry"],["Imagick::getImageSignature","imagick.getimagesignature","refentry"],["Imagick::getImageSize","imagick.getimagesize","refentry"],["Imagick::getImageTicksPerSecond","imagick.getimagetickspersecond","refentry"],["Imagick::getImageTotalInkDensity","imagick.getimagetotalinkdensity","refentry"],["Imagick::getImageType","imagick.getimagetype","refentry"],["Imagick::getImageUnits","imagick.getimageunits","refentry"],["Imagick::getImageVirtualPixelMethod","imagick.getimagevirtualpixelmethod","refentry"],["Imagick::getImageWhitePoint","imagick.getimagewhitepoint","refentry"],["Imagick::getImageWidth","imagick.getimagewidth","refentry"],["Imagick::getInterlaceScheme","imagick.getinterlacescheme","refentry"],["","imagick.getiteratorindex","example"],["Imagick::getIteratorIndex","imagick.getiteratorindex","refentry"],["Imagick::getNumberImages","imagick.getnumberimages","refentry"],["Imagick::getOption","imagick.getoption","refentry"],["Imagick::getPackageName","imagick.getpackagename","refentry"],["Imagick::getPage","imagick.getpage","refentry"],["Imagick::getPixelIterator","imagick.getpixeliterator","refentry"],["Imagick::getPixelRegionIterator","imagick.getpixelregioniterator","refentry"],["Imagick::getPointSize","imagick.getpointsize","refentry"],["Imagick::getQuantumDepth","imagick.getquantumdepth","refentry"],["Imagick::getQuantumRange","imagick.getquantumrange","refentry"],["Imagick::getReleaseDate","imagick.getreleasedate","refentry"],["Imagick::getResource","imagick.getresource","refentry"],["Imagick::getResourceLimit","imagick.getresourcelimit","refentry"],["Imagick::getSamplingFactors","imagick.getsamplingfactors","refentry"],["Imagick::getSize","imagick.getsize","refentry"],["Imagick::getSizeOffset","imagick.getsizeoffset","refentry"],["Imagick::getVersion","imagick.getversion","refentry"],["Imagick::haldClutImage","imagick.haldclutimage","refentry"],["Imagick::hasNextImage","imagick.hasnextimage","refentry"],["Imagick::hasPreviousImage","imagick.haspreviousimage","refentry"],["","imagick.identifyimage","example"],["Imagick::identifyImage","imagick.identifyimage","refentry"],["Imagick::implodeImage","imagick.implodeimage","refentry"],["","imagick.importimagepixels","example"],["Imagick::importImagePixels","imagick.importimagepixels","refentry"],["Imagick::labelImage","imagick.labelimage","refentry"],["Imagick::levelImage","imagick.levelimage","refentry"],["Imagick::linearStretchImage","imagick.linearstretchimage","refentry"],["Imagick::liquidRescaleImage","imagick.liquidrescaleimage","refentry"],["Imagick::magnifyImage","imagick.magnifyimage","refentry"],["Imagick::mapImage","imagick.mapimage","refentry"],["Imagick::matteFloodfillImage","imagick.mattefloodfillimage","refentry"],["Imagick::medianFilterImage","imagick.medianfilterimage","refentry"],["Imagick::mergeImageLayers","imagick.mergeimagelayers","refentry"],["Imagick::minifyImage","imagick.minifyimage","refentry"],["Imagick::modulateImage","imagick.modulateimage","refentry"],["Imagick::montageImage","imagick.montageimage","refentry"],["Imagick::morphImages","imagick.morphimages","refentry"],["Imagick::mosaicImages","imagick.mosaicimages","refentry"],["Imagick::motionBlurImage","imagick.motionblurimage","refentry"],["Imagick::negateImage","imagick.negateimage","refentry"],["","imagick.newimage","example"],["Imagick::newImage","imagick.newimage","refentry"],["Imagick::newPseudoImage","imagick.newpseudoimage","refentry"],["Imagick::nextImage","imagick.nextimage","refentry"],["Imagick::normalizeImage","imagick.normalizeimage","refentry"],["Imagick::oilPaintImage","imagick.oilpaintimage","refentry"],["Imagick::opaquePaintImage","imagick.opaquepaintimage","refentry"],["","imagick.optimizeimagelayers","example"],["Imagick::optimizeImageLayers","imagick.optimizeimagelayers","refentry"],["Imagick::orderedPosterizeImage","imagick.orderedposterizeimage","refentry"],["Imagick::paintFloodfillImage","imagick.paintfloodfillimage","refentry"],["Imagick::paintOpaqueImage","imagick.paintopaqueimage","refentry"],["Imagick::paintTransparentImage","imagick.painttransparentimage","refentry"],["Imagick::pingImage","imagick.pingimage","refentry"],["","imagick.pingimageblob","example"],["Imagick::pingImageBlob","imagick.pingimageblob","refentry"],["","imagick.pingimagefile","example"],["Imagick::pingImageFile","imagick.pingimagefile","refentry"],["","imagick.polaroidimage","example"],["Imagick::polaroidImage","imagick.polaroidimage","refentry"],["Imagick::posterizeImage","imagick.posterizeimage","refentry"],["Imagick::previewImages","imagick.previewimages","refentry"],["Imagick::previousImage","imagick.previousimage","refentry"],["Imagick::profileImage","imagick.profileimage","refentry"],["Imagick::quantizeImage","imagick.quantizeimage","refentry"],["Imagick::quantizeImages","imagick.quantizeimages","refentry"],["","imagick.queryfontmetrics","example"],["Imagick::queryFontMetrics","imagick.queryfontmetrics","refentry"],["Imagick::queryFonts","imagick.queryfonts","refentry"],["Imagick::queryFormats","imagick.queryformats","refentry"],["Imagick::radialBlurImage","imagick.radialblurimage","refentry"],["Imagick::raiseImage","imagick.raiseimage","refentry"],["Imagick::randomThresholdImage","imagick.randomthresholdimage","refentry"],["Imagick::readImage","imagick.readimage","refentry"],["Imagick::readImageBlob","imagick.readimageblob","refentry"],["Imagick::readImageFile","imagick.readimagefile","refentry"],["Imagick::recolorImage","imagick.recolorimage","refentry"],["Imagick::reduceNoiseImage","imagick.reducenoiseimage","refentry"],["Imagick::remapImage","imagick.remapimage","refentry"],["Imagick::removeImage","imagick.removeimage","refentry"],["Imagick::removeImageProfile","imagick.removeimageprofile","refentry"],["Imagick::render","imagick.render","refentry"],["Imagick::resampleImage","imagick.resampleimage","refentry"],["Imagick::resetImagePage","imagick.resetimagepage","refentry"],["Imagick::resizeImage","imagick.resizeimage","refentry"],["Imagick::rollImage","imagick.rollimage","refentry"],["Imagick::rotateImage","imagick.rotateimage","refentry"],["","imagick.roundcorners","example"],["Imagick::roundCorners","imagick.roundcorners","refentry"],["Imagick::sampleImage","imagick.sampleimage","refentry"],["Imagick::scaleImage","imagick.scaleimage","refentry"],["Imagick::segmentImage","imagick.segmentimage","refentry"],["Imagick::separateImageChannel","imagick.separateimagechannel","refentry"],["Imagick::sepiaToneImage","imagick.sepiatoneimage","refentry"],["Imagick::setBackgroundColor","imagick.setbackgroundcolor","refentry"],["Imagick::setColorspace","imagick.setcolorspace","refentry"],["Imagick::setCompression","imagick.setcompression","refentry"],["Imagick::setCompressionQuality","imagick.setcompressionquality","refentry"],["Imagick::setFilename","imagick.setfilename","refentry"],["Imagick::setFirstIterator","imagick.setfirstiterator","refentry"],["","imagick.setfont","example"],["Imagick::setFont","imagick.setfont","refentry"],["Imagick::setFormat","imagick.setformat","refentry"],["Imagick::setGravity","imagick.setgravity","refentry"],["","imagick.setimage","example"],["Imagick::setImage","imagick.setimage","refentry"],["Imagick::setImageAlphaChannel","imagick.setimagealphachannel","refentry"],["Imagick::setImageArtifact","imagick.setimageartifact","refentry"],["Imagick::setImageBackgroundColor","imagick.setimagebackgroundcolor","refentry"],["Imagick::setImageBias","imagick.setimagebias","refentry"],["Imagick::setImageBluePrimary","imagick.setimageblueprimary","refentry"],["Imagick::setImageBorderColor","imagick.setimagebordercolor","refentry"],["Imagick::setImageChannelDepth","imagick.setimagechanneldepth","refentry"],["Imagick::setImageClipMask","imagick.setimageclipmask","refentry"],["Imagick::setImageColormapColor","imagick.setimagecolormapcolor","refentry"],["Imagick::setImageColorspace","imagick.setimagecolorspace","refentry"],["Imagick::setImageCompose","imagick.setimagecompose","refentry"],["Imagick::setImageCompression","imagick.setimagecompression","refentry"],["Imagick::setImageCompressionQuality","imagick.setimagecompressionquality","refentry"],["","imagick.setimagedelay","example"],["Imagick::setImageDelay","imagick.setimagedelay","refentry"],["Imagick::setImageDepth","imagick.setimagedepth","refentry"],["Imagick::setImageDispose","imagick.setimagedispose","refentry"],["Imagick::setImageExtent","imagick.setimageextent","refentry"],["Imagick::setImageFilename","imagick.setimagefilename","refentry"],["Imagick::setImageFormat","imagick.setimageformat","refentry"],["Imagick::setImageGamma","imagick.setimagegamma","refentry"],["Imagick::setImageGravity","imagick.setimagegravity","refentry"],["Imagick::setImageGreenPrimary","imagick.setimagegreenprimary","refentry"],["Imagick::setImageIndex","imagick.setimageindex","refentry"],["Imagick::setImageInterlaceScheme","imagick.setimageinterlacescheme","refentry"],["Imagick::setImageInterpolateMethod","imagick.setimageinterpolatemethod","refentry"],["","imagick.setimageiterations","example"],["Imagick::setImageIterations","imagick.setimageiterations","refentry"],["Imagick::setImageMatte","imagick.setimagematte","refentry"],["Imagick::setImageMatteColor","imagick.setimagemattecolor","refentry"],["","imagick.setimageopacity","example"],["Imagick::setImageOpacity","imagick.setimageopacity","refentry"],["Imagick::setImageOrientation","imagick.setimageorientation","refentry"],["Imagick::setImagePage","imagick.setimagepage","refentry"],["Imagick::setImageProfile","imagick.setimageprofile","refentry"],["","imagick.setimageproperty","example"],["Imagick::setImageProperty","imagick.setimageproperty","refentry"],["Imagick::setImageRedPrimary","imagick.setimageredprimary","refentry"],["Imagick::setImageRenderingIntent","imagick.setimagerenderingintent","refentry"],["Imagick::setImageResolution","imagick.setimageresolution","refentry"],["Imagick::setImageScene","imagick.setimagescene","refentry"],["","imagick.setimagetickspersecond","example"],["Imagick::setImageTicksPerSecond","imagick.setimagetickspersecond","refentry"],["Imagick::setImageType","imagick.setimagetype","refentry"],["Imagick::setImageUnits","imagick.setimageunits","refentry"],["Imagick::setImageVirtualPixelMethod","imagick.setimagevirtualpixelmethod","refentry"],["Imagick::setImageWhitePoint","imagick.setimagewhitepoint","refentry"],["Imagick::setInterlaceScheme","imagick.setinterlacescheme","refentry"],["","imagick.setiteratorindex","example"],["Imagick::setIteratorIndex","imagick.setiteratorindex","refentry"],["Imagick::setLastIterator","imagick.setlastiterator","refentry"],["Imagick::setOption","imagick.setoption","refentry"],["Imagick::setPage","imagick.setpage","refentry"],["","imagick.setpointsize","example"],["Imagick::setPointSize","imagick.setpointsize","refentry"],["Imagick::setResolution","imagick.setresolution","refentry"],["Imagick::setResourceLimit","imagick.setresourcelimit","refentry"],["Imagick::setSamplingFactors","imagick.setsamplingfactors","refentry"],["Imagick::setSize","imagick.setsize","refentry"],["Imagick::setSizeOffset","imagick.setsizeoffset","refentry"],["Imagick::setType","imagick.settype","refentry"],["Imagick::shadeImage","imagick.shadeimage","refentry"],["Imagick::shadowImage","imagick.shadowimage","refentry"],["Imagick::sharpenImage","imagick.sharpenimage","refentry"],["Imagick::shaveImage","imagick.shaveimage","refentry"],["Imagick::shearImage","imagick.shearimage","refentry"],["Imagick::sigmoidalContrastImage","imagick.sigmoidalcontrastimage","refentry"],["Imagick::sketchImage","imagick.sketchimage","refentry"],["Imagick::solarizeImage","imagick.solarizeimage","refentry"],["Imagick::sparseColorImage","imagick.sparsecolorimage","refentry"],["Imagick::spliceImage","imagick.spliceimage","refentry"],["Imagick::spreadImage","imagick.spreadimage","refentry"],["Imagick::steganoImage","imagick.steganoimage","refentry"],["Imagick::stereoImage","imagick.stereoimage","refentry"],["Imagick::stripImage","imagick.stripimage","refentry"],["Imagick::swirlImage","imagick.swirlimage","refentry"],["Imagick::textureImage","imagick.textureimage","refentry"],["Imagick::thresholdImage","imagick.thresholdimage","refentry"],["Imagick::thumbnailImage","imagick.thumbnailimage","refentry"],["Imagick::tintImage","imagick.tintimage","refentry"],["","imagick.transformimage","example"],["Imagick::transformImage","imagick.transformimage","refentry"],["Imagick::transparentPaintImage","imagick.transparentpaintimage","refentry"],["Imagick::transposeImage","imagick.transposeimage","refentry"],["Imagick::transverseImage","imagick.transverseimage","refentry"],["","imagick.trimimage","example"],["Imagick::trimImage","imagick.trimimage","refentry"],["Imagick::uniqueImageColors","imagick.uniqueimagecolors","refentry"],["Imagick::unsharpMaskImage","imagick.unsharpmaskimage","refentry"],["Imagick::valid","imagick.valid","refentry"],["Imagick::vignetteImage","imagick.vignetteimage","refentry"],["Imagick::waveImage","imagick.waveimage","refentry"],["Imagick::whiteThresholdImage","imagick.whitethresholdimage","refentry"],["Imagick::writeImage","imagick.writeimage","refentry"],["Imagick::writeImageFile","imagick.writeimagefile","refentry"],["Imagick::writeImages","imagick.writeimages","refentry"],["Imagick::writeImagesFile","imagick.writeimagesfile","refentry"],["Imagick","class.imagick","phpdoc:classref"],["","class.imagickdraw","section"],["ImagickDraw::affine","imagickdraw.affine","refentry"],["ImagickDraw::annotation","imagickdraw.annotation","refentry"],["ImagickDraw::arc","imagickdraw.arc","refentry"],["ImagickDraw::bezier","imagickdraw.bezier","refentry"],["ImagickDraw::circle","imagickdraw.circle","refentry"],["ImagickDraw::clear","imagickdraw.clear","refentry"],["ImagickDraw::clone","imagickdraw.clone","refentry"],["ImagickDraw::color","imagickdraw.color","refentry"],["ImagickDraw::comment","imagickdraw.comment","refentry"],["ImagickDraw::composite","imagickdraw.composite","refentry"],["ImagickDraw::__construct","imagickdraw.construct","refentry"],["ImagickDraw::destroy","imagickdraw.destroy","refentry"],["ImagickDraw::ellipse","imagickdraw.ellipse","refentry"],["ImagickDraw::getClipPath","imagickdraw.getclippath","refentry"],["ImagickDraw::getClipRule","imagickdraw.getcliprule","refentry"],["ImagickDraw::getClipUnits","imagickdraw.getclipunits","refentry"],["ImagickDraw::getFillColor","imagickdraw.getfillcolor","refentry"],["ImagickDraw::getFillOpacity","imagickdraw.getfillopacity","refentry"],["ImagickDraw::getFillRule","imagickdraw.getfillrule","refentry"],["ImagickDraw::getFont","imagickdraw.getfont","refentry"],["ImagickDraw::getFontFamily","imagickdraw.getfontfamily","refentry"],["ImagickDraw::getFontSize","imagickdraw.getfontsize","refentry"],["ImagickDraw::getFontStyle","imagickdraw.getfontstyle","refentry"],["ImagickDraw::getFontWeight","imagickdraw.getfontweight","refentry"],["ImagickDraw::getGravity","imagickdraw.getgravity","refentry"],["ImagickDraw::getStrokeAntialias","imagickdraw.getstrokeantialias","refentry"],["ImagickDraw::getStrokeColor","imagickdraw.getstrokecolor","refentry"],["ImagickDraw::getStrokeDashArray","imagickdraw.getstrokedasharray","refentry"],["ImagickDraw::getStrokeDashOffset","imagickdraw.getstrokedashoffset","refentry"],["ImagickDraw::getStrokeLineCap","imagickdraw.getstrokelinecap","refentry"],["ImagickDraw::getStrokeLineJoin","imagickdraw.getstrokelinejoin","refentry"],["ImagickDraw::getStrokeMiterLimit","imagickdraw.getstrokemiterlimit","refentry"],["ImagickDraw::getStrokeOpacity","imagickdraw.getstrokeopacity","refentry"],["ImagickDraw::getStrokeWidth","imagickdraw.getstrokewidth","refentry"],["ImagickDraw::getTextAlignment","imagickdraw.gettextalignment","refentry"],["ImagickDraw::getTextAntialias","imagickdraw.gettextantialias","refentry"],["ImagickDraw::getTextDecoration","imagickdraw.gettextdecoration","refentry"],["ImagickDraw::getTextEncoding","imagickdraw.gettextencoding","refentry"],["ImagickDraw::getTextUnderColor","imagickdraw.gettextundercolor","refentry"],["ImagickDraw::getVectorGraphics","imagickdraw.getvectorgraphics","refentry"],["ImagickDraw::line","imagickdraw.line","refentry"],["ImagickDraw::matte","imagickdraw.matte","refentry"],["ImagickDraw::pathClose","imagickdraw.pathclose","refentry"],["ImagickDraw::pathCurveToAbsolute","imagickdraw.pathcurvetoabsolute","refentry"],["ImagickDraw::pathCurveToQuadraticBezierAbsolute","imagickdraw.pathcurvetoquadraticbezierabsolute","refentry"],["ImagickDraw::pathCurveToQuadraticBezierRelative","imagickdraw.pathcurvetoquadraticbezierrelative","refentry"],["ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute","imagickdraw.pathcurvetoquadraticbeziersmoothabsolute","refentry"],["ImagickDraw::pathCurveToQuadraticBezierSmoothRelative","imagickdraw.pathcurvetoquadraticbeziersmoothrelative","refentry"],["ImagickDraw::pathCurveToRelative","imagickdraw.pathcurvetorelative","refentry"],["ImagickDraw::pathCurveToSmoothAbsolute","imagickdraw.pathcurvetosmoothabsolute","refentry"],["ImagickDraw::pathCurveToSmoothRelative","imagickdraw.pathcurvetosmoothrelative","refentry"],["ImagickDraw::pathEllipticArcAbsolute","imagickdraw.pathellipticarcabsolute","refentry"],["ImagickDraw::pathEllipticArcRelative","imagickdraw.pathellipticarcrelative","refentry"],["ImagickDraw::pathFinish","imagickdraw.pathfinish","refentry"],["ImagickDraw::pathLineToAbsolute","imagickdraw.pathlinetoabsolute","refentry"],["ImagickDraw::pathLineToHorizontalAbsolute","imagickdraw.pathlinetohorizontalabsolute","refentry"],["ImagickDraw::pathLineToHorizontalRelative","imagickdraw.pathlinetohorizontalrelative","refentry"],["ImagickDraw::pathLineToRelative","imagickdraw.pathlinetorelative","refentry"],["ImagickDraw::pathLineToVerticalAbsolute","imagickdraw.pathlinetoverticalabsolute","refentry"],["ImagickDraw::pathLineToVerticalRelative","imagickdraw.pathlinetoverticalrelative","refentry"],["ImagickDraw::pathMoveToAbsolute","imagickdraw.pathmovetoabsolute","refentry"],["ImagickDraw::pathMoveToRelative","imagickdraw.pathmovetorelative","refentry"],["ImagickDraw::pathStart","imagickdraw.pathstart","refentry"],["ImagickDraw::point","imagickdraw.point","refentry"],["ImagickDraw::polygon","imagickdraw.polygon","refentry"],["ImagickDraw::polyline","imagickdraw.polyline","refentry"],["ImagickDraw::pop","imagickdraw.pop","refentry"],["ImagickDraw::popClipPath","imagickdraw.popclippath","refentry"],["ImagickDraw::popDefs","imagickdraw.popdefs","refentry"],["ImagickDraw::popPattern","imagickdraw.poppattern","refentry"],["ImagickDraw::push","imagickdraw.push","refentry"],["ImagickDraw::pushClipPath","imagickdraw.pushclippath","refentry"],["ImagickDraw::pushDefs","imagickdraw.pushdefs","refentry"],["ImagickDraw::pushPattern","imagickdraw.pushpattern","refentry"],["ImagickDraw::rectangle","imagickdraw.rectangle","refentry"],["ImagickDraw::render","imagickdraw.render","refentry"],["ImagickDraw::rotate","imagickdraw.rotate","refentry"],["ImagickDraw::roundRectangle","imagickdraw.roundrectangle","refentry"],["ImagickDraw::scale","imagickdraw.scale","refentry"],["ImagickDraw::setClipPath","imagickdraw.setclippath","refentry"],["ImagickDraw::setClipRule","imagickdraw.setcliprule","refentry"],["ImagickDraw::setClipUnits","imagickdraw.setclipunits","refentry"],["ImagickDraw::setFillAlpha","imagickdraw.setfillalpha","refentry"],["ImagickDraw::setFillColor","imagickdraw.setfillcolor","refentry"],["ImagickDraw::setFillOpacity","imagickdraw.setfillopacity","refentry"],["ImagickDraw::setFillPatternURL","imagickdraw.setfillpatternurl","refentry"],["ImagickDraw::setFillRule","imagickdraw.setfillrule","refentry"],["ImagickDraw::setFont","imagickdraw.setfont","refentry"],["ImagickDraw::setFontFamily","imagickdraw.setfontfamily","refentry"],["ImagickDraw::setFontSize","imagickdraw.setfontsize","refentry"],["ImagickDraw::setFontStretch","imagickdraw.setfontstretch","refentry"],["ImagickDraw::setFontStyle","imagickdraw.setfontstyle","refentry"],["ImagickDraw::setFontWeight","imagickdraw.setfontweight","refentry"],["ImagickDraw::setGravity","imagickdraw.setgravity","refentry"],["ImagickDraw::setStrokeAlpha","imagickdraw.setstrokealpha","refentry"],["ImagickDraw::setStrokeAntialias","imagickdraw.setstrokeantialias","refentry"],["ImagickDraw::setStrokeColor","imagickdraw.setstrokecolor","refentry"],["ImagickDraw::setStrokeDashArray","imagickdraw.setstrokedasharray","refentry"],["ImagickDraw::setStrokeDashOffset","imagickdraw.setstrokedashoffset","refentry"],["ImagickDraw::setStrokeLineCap","imagickdraw.setstrokelinecap","refentry"],["ImagickDraw::setStrokeLineJoin","imagickdraw.setstrokelinejoin","refentry"],["ImagickDraw::setStrokeMiterLimit","imagickdraw.setstrokemiterlimit","refentry"],["ImagickDraw::setStrokeOpacity","imagickdraw.setstrokeopacity","refentry"],["ImagickDraw::setStrokePatternURL","imagickdraw.setstrokepatternurl","refentry"],["ImagickDraw::setStrokeWidth","imagickdraw.setstrokewidth","refentry"],["ImagickDraw::setTextAlignment","imagickdraw.settextalignment","refentry"],["ImagickDraw::setTextAntialias","imagickdraw.settextantialias","refentry"],["ImagickDraw::setTextDecoration","imagickdraw.settextdecoration","refentry"],["ImagickDraw::setTextEncoding","imagickdraw.settextencoding","refentry"],["ImagickDraw::setTextUnderColor","imagickdraw.settextundercolor","refentry"],["ImagickDraw::setVectorGraphics","imagickdraw.setvectorgraphics","refentry"],["ImagickDraw::setViewbox","imagickdraw.setviewbox","refentry"],["ImagickDraw::skewX","imagickdraw.skewx","refentry"],["ImagickDraw::skewY","imagickdraw.skewy","refentry"],["ImagickDraw::translate","imagickdraw.translate","refentry"],["ImagickDraw","class.imagickdraw","phpdoc:classref"],["","class.imagickpixel","section"],["ImagickPixel::clear","imagickpixel.clear","refentry"],["ImagickPixel::__construct","imagickpixel.construct","refentry"],["ImagickPixel::destroy","imagickpixel.destroy","refentry"],["","imagickpixel.getcolor","example"],["ImagickPixel::getColor","imagickpixel.getcolor","refentry"],["","imagickpixel.getcolorasstring","example"],["ImagickPixel::getColorAsString","imagickpixel.getcolorasstring","refentry"],["ImagickPixel::getColorCount","imagickpixel.getcolorcount","refentry"],["","imagickpixel.getcolorvalue","example"],["ImagickPixel::getColorValue","imagickpixel.getcolorvalue","refentry"],["","imagickpixel.gethsl","example"],["ImagickPixel::getHSL","imagickpixel.gethsl","refentry"],["ImagickPixel::isPixelSimilar","imagickpixel.ispixelsimilar","refentry"],["ImagickPixel::isSimilar","imagickpixel.issimilar","refentry"],["ImagickPixel::setColor","imagickpixel.setcolor","refentry"],["","imagickpixel.setcolorvalue","example"],["ImagickPixel::setColorValue","imagickpixel.setcolorvalue","refentry"],["","imagickpixel.sethsl","example"],["ImagickPixel::setHSL","imagickpixel.sethsl","refentry"],["ImagickPixel","class.imagickpixel","phpdoc:classref"],["","class.imagickpixeliterator","section"],["ImagickPixelIterator::clear","imagickpixeliterator.clear","refentry"],["ImagickPixelIterator::__construct","imagickpixeliterator.construct","refentry"],["ImagickPixelIterator::destroy","imagickpixeliterator.destroy","refentry"],["ImagickPixelIterator::getCurrentIteratorRow","imagickpixeliterator.getcurrentiteratorrow","refentry"],["ImagickPixelIterator::getIteratorRow","imagickpixeliterator.getiteratorrow","refentry"],["ImagickPixelIterator::getNextIteratorRow","imagickpixeliterator.getnextiteratorrow","refentry"],["ImagickPixelIterator::getPreviousIteratorRow","imagickpixeliterator.getpreviousiteratorrow","refentry"],["ImagickPixelIterator::newPixelIterator","imagickpixeliterator.newpixeliterator","refentry"],["ImagickPixelIterator::newPixelRegionIterator","imagickpixeliterator.newpixelregioniterator","refentry"],["ImagickPixelIterator::resetIterator","imagickpixeliterator.resetiterator","refentry"],["ImagickPixelIterator::setIteratorFirstRow","imagickpixeliterator.setiteratorfirstrow","refentry"],["ImagickPixelIterator::setIteratorLastRow","imagickpixeliterator.setiteratorlastrow","refentry"],["ImagickPixelIterator::setIteratorRow","imagickpixeliterator.setiteratorrow","refentry"],["ImagickPixelIterator::syncIterator","imagickpixeliterator.synciterator","refentry"],["ImagickPixelIterator","class.imagickpixeliterator","phpdoc:classref"],["ImageMagick","book.imagick","book"],["","refs.utilspec.image","set"],["","intro.cyrus","preface"],["","cyrus.requirements","section"],["","cyrus.installation","section"],["","cyrus.configuration","section"],["","cyrus.resources","section"],["","cyrus.setup","chapter"],["","cyrus.constants","varlistentry"],["","cyrus.constants","varlistentry"],["","cyrus.constants","varlistentry"],["","cyrus.constants","varlistentry"],["","cyrus.constants","appendix"],["cyrus_authenticate","function.cyrus-authenticate","refentry"],["cyrus_bind","function.cyrus-bind","refentry"],["cyrus_close","function.cyrus-close","refentry"],["cyrus_connect","function.cyrus-connect","refentry"],["cyrus_query","function.cyrus-query","refentry"],["cyrus_unbind","function.cyrus-unbind","refentry"],["","ref.cyrus","reference"],["Cyrus","book.cyrus","book"],["","intro.imap","preface"],["","imap.requirements","section"],["","imap.installation","section"],["","imap.configuration","section"],["","imap.resources","section"],["","imap.setup","chapter"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","varlistentry"],["","imap.constants","appendix"],["imap_8bit","function.imap-8bit","refentry"],["imap_alerts","function.imap-alerts","refentry"],["","function.imap-append","example"],["imap_append","function.imap-append","refentry"],["imap_base64","function.imap-base64","refentry"],["imap_binary","function.imap-binary","refentry"],["imap_body","function.imap-body","refentry"],["imap_bodystruct","function.imap-bodystruct","refentry"],["","function.imap-check","example"],["imap_check","function.imap-check","refentry"],["imap_clearflag_full","function.imap-clearflag-full","refentry"],["imap_close","function.imap-close","refentry"],["imap_create","function.imap-create","refentry"],["","function.imap-createmailbox","example"],["imap_createmailbox","function.imap-createmailbox","refentry"],["","function.imap-delete","example"],["imap_delete","function.imap-delete","refentry"],["imap_deletemailbox","function.imap-deletemailbox","refentry"],["imap_errors","function.imap-errors","refentry"],["imap_expunge","function.imap-expunge","refentry"],["","function.imap-fetch-overview","example"],["imap_fetch_overview","function.imap-fetch-overview","refentry"],["imap_fetchbody","function.imap-fetchbody","refentry"],["imap_fetchheader","function.imap-fetchheader","refentry"],["imap_fetchmime","function.imap-fetchmime","refentry"],["imap_fetchstructure","function.imap-fetchstructure","refentry"],["imap_fetchtext","function.imap-fetchtext","refentry"],["","function.imap-gc","example"],["imap_gc","function.imap-gc","refentry"],["","function.imap-get-quota","example"],["","function.imap-get-quota","example"],["imap_get_quota","function.imap-get-quota","refentry"],["","function.imap-get-quotaroot","example"],["imap_get_quotaroot","function.imap-get-quotaroot","refentry"],["","function.imap-getacl","example"],["imap_getacl","function.imap-getacl","refentry"],["","function.imap-getmailboxes","example"],["imap_getmailboxes","function.imap-getmailboxes","refentry"],["imap_getsubscribed","function.imap-getsubscribed","refentry"],["imap_header","function.imap-header","refentry"],["imap_headerinfo","function.imap-headerinfo","refentry"],["imap_headers","function.imap-headers","refentry"],["imap_last_error","function.imap-last-error","refentry"],["","function.imap-list","example"],["imap_list","function.imap-list","refentry"],["imap_listmailbox","function.imap-listmailbox","refentry"],["imap_listscan","function.imap-listscan","refentry"],["imap_listsubscribed","function.imap-listsubscribed","refentry"],["imap_lsub","function.imap-lsub","refentry"],["","function.imap-mail-compose","example"],["imap_mail_compose","function.imap-mail-compose","refentry"],["imap_mail_copy","function.imap-mail-copy","refentry"],["imap_mail_move","function.imap-mail-move","refentry"],["imap_mail","function.imap-mail","refentry"],["","function.imap-mailboxmsginfo","example"],["imap_mailboxmsginfo","function.imap-mailboxmsginfo","refentry"],["","function.imap-mime-header-decode","example"],["imap_mime_header_decode","function.imap-mime-header-decode","refentry"],["imap_msgno","function.imap-msgno","refentry"],["imap_num_msg","function.imap-num-msg","refentry"],["imap_num_recent","function.imap-num-recent","refentry"],["","function.imap-open","example"],["","function.imap-open","example"],["imap_open","function.imap-open","refentry"],["","function.imap-ping","example"],["imap_ping","function.imap-ping","refentry"],["imap_qprint","function.imap-qprint","refentry"],["imap_rename","function.imap-rename","refentry"],["imap_renamemailbox","function.imap-renamemailbox","refentry"],["","function.imap-reopen","example"],["imap_reopen","function.imap-reopen","refentry"],["","function.imap-rfc822-parse-adrlist","example"],["imap_rfc822_parse_adrlist","function.imap-rfc822-parse-adrlist","refentry"],["imap_rfc822_parse_headers","function.imap-rfc822-parse-headers","refentry"],["","function.imap-rfc822-write-address","example"],["imap_rfc822_write_address","function.imap-rfc822-write-address","refentry"],["imap_savebody","function.imap-savebody","refentry"],["imap_scan","function.imap-scan","refentry"],["imap_scanmailbox","function.imap-scanmailbox","refentry"],["","function.imap-search","example"],["imap_search","function.imap-search","refentry"],["","function.imap-set-quota","example"],["imap_set_quota","function.imap-set-quota","refentry"],["imap_setacl","function.imap-setacl","refentry"],["","function.imap-setflag-full","example"],["imap_setflag_full","function.imap-setflag-full","refentry"],["imap_sort","function.imap-sort","refentry"],["","function.imap-status","example"],["imap_status","function.imap-status","refentry"],["imap_subscribe","function.imap-subscribe","refentry"],["","function.imap-thread","example"],["imap_thread","function.imap-thread","refentry"],["","function.imap-timeout","example"],["imap_timeout","function.imap-timeout","refentry"],["imap_uid","function.imap-uid","refentry"],["imap_undelete","function.imap-undelete","refentry"],["imap_unsubscribe","function.imap-unsubscribe","refentry"],["imap_utf7_decode","function.imap-utf7-decode","refentry"],["imap_utf7_encode","function.imap-utf7-encode","refentry"],["imap_utf8","function.imap-utf8","refentry"],["","ref.imap","reference"],["IMAP","book.imap","book"],["","intro.mail","preface"],["","mail.requirements","section"],["","mail.installation","section"],["","mail.configuration","varlistentry"],["","mail.configuration","varlistentry"],["","mail.configuration","varlistentry"],["","mail.configuration","varlistentry"],["","mail.configuration","varlistentry"],["","mail.configuration","varlistentry"],["","mail.configuration","section"],["","mail.resources","section"],["","mail.setup","chapter"],["","mail.constants","appendix"],["","function.ezmlm-hash","example"],["ezmlm_hash","function.ezmlm-hash","refentry"],["","function.mail","example"],["","function.mail","example"],["","function.mail","example"],["","function.mail","example"],["mail","function.mail","refentry"],["","ref.mail","reference"],["","book.mail","book"],["","intro.mailparse","preface"],["","mailparse.requirements","section"],["","mailparse.installation","section"],["","mailparse.configuration","section"],["","mailparse.resources","section"],["","mailparse.setup","chapter"],["","mailparse.constants","varlistentry"],["","mailparse.constants","varlistentry"],["","mailparse.constants","varlistentry"],["","mailparse.constants","appendix"],["","function.mailparse-determine-best-xfer-encoding","example"],["mailparse_determine_best_xfer_encoding","function.mailparse-determine-best-xfer-encoding","refentry"],["mailparse_msg_create","function.mailparse-msg-create","refentry"],["mailparse_msg_extract_part_file","function.mailparse-msg-extract-part-file","refentry"],["mailparse_msg_extract_part","function.mailparse-msg-extract-part","refentry"],["mailparse_msg_extract_whole_part_file","function.mailparse-msg-extract-whole-part-file","refentry"],["mailparse_msg_free","function.mailparse-msg-free","refentry"],["mailparse_msg_get_part_data","function.mailparse-msg-get-part-data","refentry"],["mailparse_msg_get_part","function.mailparse-msg-get-part","refentry"],["mailparse_msg_get_structure","function.mailparse-msg-get-structure","refentry"],["mailparse_msg_parse_file","function.mailparse-msg-parse-file","refentry"],["mailparse_msg_parse","function.mailparse-msg-parse","refentry"],["","function.mailparse-rfc822-parse-addresses","example"],["mailparse_rfc822_parse_addresses","function.mailparse-rfc822-parse-addresses","refentry"],["","function.mailparse-stream-encode","example"],["mailparse_stream_encode","function.mailparse-stream-encode","refentry"],["","function.mailparse-uudecode-all","example"],["mailparse_uudecode_all","function.mailparse-uudecode-all","refentry"],["","ref.mailparse","reference"],["","book.mailparse","book"],["","intro.vpopmail","preface"],["","vpopmail.requirements","section"],["","vpopmail.installation","section"],["","vpopmail.configuration","section"],["","vpopmail.resources","section"],["","vpopmail.setup","chapter"],["","vpopmail.constants","appendix"],["vpopmail_add_alias_domain_ex","function.vpopmail-add-alias-domain-ex","refentry"],["vpopmail_add_alias_domain","function.vpopmail-add-alias-domain","refentry"],["vpopmail_add_domain_ex","function.vpopmail-add-domain-ex","refentry"],["vpopmail_add_domain","function.vpopmail-add-domain","refentry"],["vpopmail_add_user","function.vpopmail-add-user","refentry"],["vpopmail_alias_add","function.vpopmail-alias-add","refentry"],["vpopmail_alias_del_domain","function.vpopmail-alias-del-domain","refentry"],["vpopmail_alias_del","function.vpopmail-alias-del","refentry"],["vpopmail_alias_get_all","function.vpopmail-alias-get-all","refentry"],["vpopmail_alias_get","function.vpopmail-alias-get","refentry"],["vpopmail_auth_user","function.vpopmail-auth-user","refentry"],["vpopmail_del_domain_ex","function.vpopmail-del-domain-ex","refentry"],["vpopmail_del_domain","function.vpopmail-del-domain","refentry"],["vpopmail_del_user","function.vpopmail-del-user","refentry"],["vpopmail_error","function.vpopmail-error","refentry"],["vpopmail_passwd","function.vpopmail-passwd","refentry"],["vpopmail_set_user_quota","function.vpopmail-set-user-quota","refentry"],["","ref.vpopmail","reference"],["","book.vpopmail","book"],["","refs.remote.mail","set"],["","intro.bc","preface"],["","bc.requirements","section"],["","bc.installation","section"],["","bc.configuration","varlistentry"],["","bc.configuration","section"],["","bc.resources","section"],["","bc.setup","chapter"],["","bc.constants","appendix"],["","function.bcadd","example"],["bcadd","function.bcadd","refentry"],["","function.bccomp","example"],["bccomp","function.bccomp","refentry"],["","function.bcdiv","example"],["bcdiv","function.bcdiv","refentry"],["","function.bcmod","example"],["bcmod","function.bcmod","refentry"],["","function.bcmul","example"],["bcmul","function.bcmul","refentry"],["","function.bcpow","example"],["","function.bcpow","example"],["bcpow","function.bcpow","refentry"],["bcpowmod","function.bcpowmod","refentry"],["","function.bcscale","example"],["bcscale","function.bcscale","refentry"],["","function.bcsqrt","example"],["bcsqrt","function.bcsqrt","refentry"],["","function.bcsub","example"],["bcsub","function.bcsub","refentry"],["","ref.bc","reference"],["BC Math","book.bc","book"],["","intro.gmp","preface"],["","gmp.requirements","section"],["","gmp.installation","section"],["","gmp.configuration","section"],["","gmp.resources","section"],["","gmp.setup","chapter"],["","gmp.constants","varlistentry"],["","gmp.constants","varlistentry"],["","gmp.constants","varlistentry"],["","gmp.constants","varlistentry"],["","gmp.constants","appendix"],["","gmp.examples","example"],["","gmp.examples","chapter"],["","ref.gmp","section"],["","function.gmp-abs","example"],["gmp_abs","function.gmp-abs","refentry"],["","function.gmp-add","example"],["gmp_add","function.gmp-add","refentry"],["","function.gmp-and","example"],["gmp_and","function.gmp-and","refentry"],["","function.gmp-clrbit","example"],["gmp_clrbit","function.gmp-clrbit","refentry"],["","function.gmp-cmp","example"],["gmp_cmp","function.gmp-cmp","refentry"],["","function.gmp-com","example"],["gmp_com","function.gmp-com","refentry"],["","function.gmp-div-q","example"],["gmp_div_q","function.gmp-div-q","refentry"],["","function.gmp-div-qr","example"],["gmp_div_qr","function.gmp-div-qr","refentry"],["","function.gmp-div-r","example"],["gmp_div_r","function.gmp-div-r","refentry"],["gmp_div","function.gmp-div","refentry"],["","function.gmp-divexact","example"],["gmp_divexact","function.gmp-divexact","refentry"],["","function.gmp-fact","example"],["gmp_fact","function.gmp-fact","refentry"],["","function.gmp-gcd","example"],["gmp_gcd","function.gmp-gcd","refentry"],["","function.gmp-gcdext","example"],["gmp_gcdext","function.gmp-gcdext","refentry"],["","function.gmp-hamdist","example"],["gmp_hamdist","function.gmp-hamdist","refentry"],["","function.gmp-init","example"],["gmp_init","function.gmp-init","refentry"],["","function.gmp-intval","example"],["gmp_intval","function.gmp-intval","refentry"],["","function.gmp-invert","example"],["gmp_invert","function.gmp-invert","refentry"],["","function.gmp-jacobi","example"],["gmp_jacobi","function.gmp-jacobi","refentry"],["","function.gmp-legendre","example"],["gmp_legendre","function.gmp-legendre","refentry"],["","function.gmp-mod","example"],["gmp_mod","function.gmp-mod","refentry"],["","function.gmp-mul","example"],["gmp_mul","function.gmp-mul","refentry"],["","function.gmp-neg","example"],["gmp_neg","function.gmp-neg","refentry"],["","function.gmp-nextprime","example"],["gmp_nextprime","function.gmp-nextprime","refentry"],["","function.gmp-or","example"],["gmp_or","function.gmp-or","refentry"],["","function.gmp-perfect-square","example"],["gmp_perfect_square","function.gmp-perfect-square","refentry"],["","function.gmp-popcount","example"],["gmp_popcount","function.gmp-popcount","refentry"],["","function.gmp-pow","example"],["gmp_pow","function.gmp-pow","refentry"],["","function.gmp-powm","example"],["gmp_powm","function.gmp-powm","refentry"],["","function.gmp-prob-prime","example"],["gmp_prob_prime","function.gmp-prob-prime","refentry"],["","function.gmp-random","example"],["gmp_random","function.gmp-random","refentry"],["","function.gmp-scan0","example"],["gmp_scan0","function.gmp-scan0","refentry"],["","function.gmp-scan1","example"],["gmp_scan1","function.gmp-scan1","refentry"],["","function.gmp-setbit","example"],["","function.gmp-setbit","example"],["","function.gmp-setbit","example"],["gmp_setbit","function.gmp-setbit","refentry"],["","function.gmp-sign","example"],["gmp_sign","function.gmp-sign","refentry"],["","function.gmp-sqrt","example"],["gmp_sqrt","function.gmp-sqrt","refentry"],["","function.gmp-sqrtrem","example"],["gmp_sqrtrem","function.gmp-sqrtrem","refentry"],["","function.gmp-strval","example"],["gmp_strval","function.gmp-strval","refentry"],["","function.gmp-sub","example"],["gmp_sub","function.gmp-sub","refentry"],["","function.gmp-testbit","example"],["gmp_testbit","function.gmp-testbit","refentry"],["","function.gmp-xor","example"],["gmp_xor","function.gmp-xor","refentry"],["","ref.gmp","reference"],["GMP","book.gmp","book"],["","intro.lapack","preface"],["","lapack.requirements","section"],["","lapack.installation","section"],["","lapack.configuration","section"],["","lapack.resources","section"],["","lapack.setup","chapter"],["","lapack.constants","appendix"],["","class.lapack","section"],["","class.lapack","section"],["","lapack.eigenvalues","example"],["Lapack::eigenValues","lapack.eigenvalues","refentry"],["Lapack::identity","lapack.identity","refentry"],["","lapack.leastsquaresbyfactorisation","example"],["Lapack::leastSquaresByFactorisation","lapack.leastsquaresbyfactorisation","refentry"],["","lapack.leastsquaresbysvd","example"],["Lapack::leastSquaresBySVD","lapack.leastsquaresbysvd","refentry"],["","lapack.pseudoinverse","example"],["Lapack::pseudoInverse","lapack.pseudoinverse","refentry"],["","lapack.singularvalues","example"],["Lapack::singularValues","lapack.singularvalues","refentry"],["","lapack.solvelinearequation","example"],["Lapack::solveLinearEquation","lapack.solvelinearequation","refentry"],["Lapack","class.lapack","phpdoc:classref"],["","class.lapackexception","section"],["","class.lapackexception","section"],["LapackException","class.lapackexception","phpdoc:classref"],["Lapack","book.lapack","book"],["","intro.math","preface"],["","math.requirements","section"],["","math.installation","section"],["","math.configuration","section"],["","math.resources","section"],["","math.setup","chapter"],["","math.constants","appendix"],["","function.abs","example"],["abs","function.abs","refentry"],["acos","function.acos","refentry"],["acosh","function.acosh","refentry"],["asin","function.asin","refentry"],["asinh","function.asinh","refentry"],["atan2","function.atan2","refentry"],["atan","function.atan","refentry"],["atanh","function.atanh","refentry"],["","function.base-convert","example"],["base_convert","function.base-convert","refentry"],["","function.bindec","example"],["","function.bindec","example"],["bindec","function.bindec","refentry"],["","function.ceil","example"],["ceil","function.ceil","refentry"],["","function.cos","example"],["cos","function.cos","refentry"],["cosh","function.cosh","refentry"],["","function.decbin","example"],["decbin","function.decbin","refentry"],["","function.dechex","example"],["","function.dechex","example"],["dechex","function.dechex","refentry"],["","function.decoct","example"],["decoct","function.decoct","refentry"],["","function.deg2rad","example"],["deg2rad","function.deg2rad","refentry"],["","function.exp","example"],["exp","function.exp","refentry"],["expm1","function.expm1","refentry"],["","function.floor","example"],["floor","function.floor","refentry"],["","function.fmod","example"],["fmod","function.fmod","refentry"],["getrandmax","function.getrandmax","refentry"],["","function.hexdec","example"],["hexdec","function.hexdec","refentry"],["hypot","function.hypot","refentry"],["is_finite","function.is-finite","refentry"],["is_infinite","function.is-infinite","refentry"],["","function.is-nan","example"],["is_nan","function.is-nan","refentry"],["lcg_value","function.lcg-value","refentry"],["log10","function.log10","refentry"],["log1p","function.log1p","refentry"],["log","function.log","refentry"],["","function.max","example"],["max","function.max","refentry"],["","function.min","example"],["","function.min","example"],["min","function.min","refentry"],["","function.mt-getrandmax","example"],["mt_getrandmax","function.mt-getrandmax","refentry"],["","function.mt-rand","example"],["mt_rand","function.mt-rand","refentry"],["","function.mt-srand","example"],["mt_srand","function.mt-srand","refentry"],["","function.octdec","example"],["octdec","function.octdec","refentry"],["","function.pi","example"],["pi","function.pi","refentry"],["","function.pow","example"],["pow","function.pow","refentry"],["","function.rad2deg","example"],["rad2deg","function.rad2deg","refentry"],["","function.rand","example"],["rand","function.rand","refentry"],["","function.round","example"],["","function.round","example"],["","function.round","example"],["round","function.round","refentry"],["","function.sin","example"],["sin","function.sin","refentry"],["sinh","function.sinh","refentry"],["","function.sqrt","example"],["sqrt","function.sqrt","refentry"],["","function.srand","example"],["srand","function.srand","refentry"],["","function.tan","example"],["tan","function.tan","refentry"],["tanh","function.tanh","refentry"],["","ref.math","reference"],["Math","book.math","book"],["","intro.stats","preface"],["","stats.requirements","section"],["","stats.installation","section"],["","stats.configuration","section"],["","stats.resources","section"],["","stats.setup","chapter"],["","stats.constants","appendix"],["stats_absolute_deviation","function.stats-absolute-deviation","refentry"],["stats_cdf_beta","function.stats-cdf-beta","refentry"],["stats_cdf_binomial","function.stats-cdf-binomial","refentry"],["stats_cdf_cauchy","function.stats-cdf-cauchy","refentry"],["stats_cdf_chisquare","function.stats-cdf-chisquare","refentry"],["stats_cdf_exponential","function.stats-cdf-exponential","refentry"],["stats_cdf_f","function.stats-cdf-f","refentry"],["stats_cdf_gamma","function.stats-cdf-gamma","refentry"],["stats_cdf_laplace","function.stats-cdf-laplace","refentry"],["stats_cdf_logistic","function.stats-cdf-logistic","refentry"],["stats_cdf_negative_binomial","function.stats-cdf-negative-binomial","refentry"],["stats_cdf_noncentral_chisquare","function.stats-cdf-noncentral-chisquare","refentry"],["stats_cdf_noncentral_f","function.stats-cdf-noncentral-f","refentry"],["stats_cdf_poisson","function.stats-cdf-poisson","refentry"],["stats_cdf_t","function.stats-cdf-t","refentry"],["stats_cdf_uniform","function.stats-cdf-uniform","refentry"],["stats_cdf_weibull","function.stats-cdf-weibull","refentry"],["stats_covariance","function.stats-covariance","refentry"],["stats_den_uniform","function.stats-den-uniform","refentry"],["stats_dens_beta","function.stats-dens-beta","refentry"],["stats_dens_cauchy","function.stats-dens-cauchy","refentry"],["stats_dens_chisquare","function.stats-dens-chisquare","refentry"],["stats_dens_exponential","function.stats-dens-exponential","refentry"],["stats_dens_f","function.stats-dens-f","refentry"],["stats_dens_gamma","function.stats-dens-gamma","refentry"],["stats_dens_laplace","function.stats-dens-laplace","refentry"],["stats_dens_logistic","function.stats-dens-logistic","refentry"],["stats_dens_negative_binomial","function.stats-dens-negative-binomial","refentry"],["stats_dens_normal","function.stats-dens-normal","refentry"],["stats_dens_pmf_binomial","function.stats-dens-pmf-binomial","refentry"],["stats_dens_pmf_hypergeometric","function.stats-dens-pmf-hypergeometric","refentry"],["stats_dens_pmf_poisson","function.stats-dens-pmf-poisson","refentry"],["stats_dens_t","function.stats-dens-t","refentry"],["stats_dens_weibull","function.stats-dens-weibull","refentry"],["stats_harmonic_mean","function.stats-harmonic-mean","refentry"],["stats_kurtosis","function.stats-kurtosis","refentry"],["stats_rand_gen_beta","function.stats-rand-gen-beta","refentry"],["stats_rand_gen_chisquare","function.stats-rand-gen-chisquare","refentry"],["stats_rand_gen_exponential","function.stats-rand-gen-exponential","refentry"],["stats_rand_gen_f","function.stats-rand-gen-f","refentry"],["stats_rand_gen_funiform","function.stats-rand-gen-funiform","refentry"],["stats_rand_gen_gamma","function.stats-rand-gen-gamma","refentry"],["stats_rand_gen_ibinomial_negative","function.stats-rand-gen-ibinomial-negative","refentry"],["stats_rand_gen_ibinomial","function.stats-rand-gen-ibinomial","refentry"],["stats_rand_gen_int","function.stats-rand-gen-int","refentry"],["stats_rand_gen_ipoisson","function.stats-rand-gen-ipoisson","refentry"],["stats_rand_gen_iuniform","function.stats-rand-gen-iuniform","refentry"],["stats_rand_gen_noncenral_chisquare","function.stats-rand-gen-noncenral-chisquare","refentry"],["stats_rand_gen_noncentral_f","function.stats-rand-gen-noncentral-f","refentry"],["stats_rand_gen_noncentral_t","function.stats-rand-gen-noncentral-t","refentry"],["stats_rand_gen_normal","function.stats-rand-gen-normal","refentry"],["stats_rand_gen_t","function.stats-rand-gen-t","refentry"],["stats_rand_get_seeds","function.stats-rand-get-seeds","refentry"],["stats_rand_phrase_to_seeds","function.stats-rand-phrase-to-seeds","refentry"],["stats_rand_ranf","function.stats-rand-ranf","refentry"],["stats_rand_setall","function.stats-rand-setall","refentry"],["stats_skew","function.stats-skew","refentry"],["stats_standard_deviation","function.stats-standard-deviation","refentry"],["stats_stat_binomial_coef","function.stats-stat-binomial-coef","refentry"],["stats_stat_correlation","function.stats-stat-correlation","refentry"],["stats_stat_gennch","function.stats-stat-gennch","refentry"],["stats_stat_independent_t","function.stats-stat-independent-t","refentry"],["stats_stat_innerproduct","function.stats-stat-innerproduct","refentry"],["stats_stat_noncentral_t","function.stats-stat-noncentral-t","refentry"],["stats_stat_paired_t","function.stats-stat-paired-t","refentry"],["stats_stat_percentile","function.stats-stat-percentile","refentry"],["stats_stat_powersum","function.stats-stat-powersum","refentry"],["stats_variance","function.stats-variance","refentry"],["","ref.stats","reference"],["","book.stats","book"],["","intro.trader","preface"],["","trader.requirements","section"],["","trader.installation","section"],["","trader.configuration","varlistentry"],["","trader.configuration","varlistentry"],["","trader.configuration","section"],["","trader.setup","chapter"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","varlistentry"],["","trader.constants","appendix"],["trader_acos","function.trader-acos","refentry"],["trader_ad","function.trader-ad","refentry"],["trader_add","function.trader-add","refentry"],["trader_adosc","function.trader-adosc","refentry"],["trader_adx","function.trader-adx","refentry"],["trader_adxr","function.trader-adxr","refentry"],["trader_apo","function.trader-apo","refentry"],["trader_aroon","function.trader-aroon","refentry"],["trader_aroonosc","function.trader-aroonosc","refentry"],["trader_asin","function.trader-asin","refentry"],["trader_atan","function.trader-atan","refentry"],["trader_atr","function.trader-atr","refentry"],["trader_avgprice","function.trader-avgprice","refentry"],["trader_bbands","function.trader-bbands","refentry"],["trader_beta","function.trader-beta","refentry"],["trader_bop","function.trader-bop","refentry"],["trader_cci","function.trader-cci","refentry"],["trader_cdl2crows","function.trader-cdl2crows","refentry"],["trader_cdl3blackcrows","function.trader-cdl3blackcrows","refentry"],["trader_cdl3inside","function.trader-cdl3inside","refentry"],["trader_cdl3linestrike","function.trader-cdl3linestrike","refentry"],["trader_cdl3outside","function.trader-cdl3outside","refentry"],["trader_cdl3starsinsouth","function.trader-cdl3starsinsouth","refentry"],["trader_cdl3whitesoldiers","function.trader-cdl3whitesoldiers","refentry"],["trader_cdlabandonedbaby","function.trader-cdlabandonedbaby","refentry"],["trader_cdladvanceblock","function.trader-cdladvanceblock","refentry"],["trader_cdlbelthold","function.trader-cdlbelthold","refentry"],["trader_cdlbreakaway","function.trader-cdlbreakaway","refentry"],["trader_cdlclosingmarubozu","function.trader-cdlclosingmarubozu","refentry"],["trader_cdlconcealbabyswall","function.trader-cdlconcealbabyswall","refentry"],["trader_cdlcounterattack","function.trader-cdlcounterattack","refentry"],["trader_cdldarkcloudcover","function.trader-cdldarkcloudcover","refentry"],["trader_cdldoji","function.trader-cdldoji","refentry"],["trader_cdldojistar","function.trader-cdldojistar","refentry"],["trader_cdldragonflydoji","function.trader-cdldragonflydoji","refentry"],["trader_cdlengulfing","function.trader-cdlengulfing","refentry"],["trader_cdleveningdojistar","function.trader-cdleveningdojistar","refentry"],["trader_cdleveningstar","function.trader-cdleveningstar","refentry"],["trader_cdlgapsidesidewhite","function.trader-cdlgapsidesidewhite","refentry"],["trader_cdlgravestonedoji","function.trader-cdlgravestonedoji","refentry"],["trader_cdlhammer","function.trader-cdlhammer","refentry"],["trader_cdlhangingman","function.trader-cdlhangingman","refentry"],["trader_cdlharami","function.trader-cdlharami","refentry"],["trader_cdlharamicross","function.trader-cdlharamicross","refentry"],["trader_cdlhighwave","function.trader-cdlhighwave","refentry"],["trader_cdlhikkake","function.trader-cdlhikkake","refentry"],["trader_cdlhikkakemod","function.trader-cdlhikkakemod","refentry"],["trader_cdlhomingpigeon","function.trader-cdlhomingpigeon","refentry"],["trader_cdlidentical3crows","function.trader-cdlidentical3crows","refentry"],["trader_cdlinneck","function.trader-cdlinneck","refentry"],["trader_cdlinvertedhammer","function.trader-cdlinvertedhammer","refentry"],["trader_cdlkicking","function.trader-cdlkicking","refentry"],["trader_cdlkickingbylength","function.trader-cdlkickingbylength","refentry"],["trader_cdlladderbottom","function.trader-cdlladderbottom","refentry"],["trader_cdllongleggeddoji","function.trader-cdllongleggeddoji","refentry"],["trader_cdllongline","function.trader-cdllongline","refentry"],["trader_cdlmarubozu","function.trader-cdlmarubozu","refentry"],["trader_cdlmatchinglow","function.trader-cdlmatchinglow","refentry"],["trader_cdlmathold","function.trader-cdlmathold","refentry"],["trader_cdlmorningdojistar","function.trader-cdlmorningdojistar","refentry"],["trader_cdlmorningstar","function.trader-cdlmorningstar","refentry"],["trader_cdlonneck","function.trader-cdlonneck","refentry"],["trader_cdlpiercing","function.trader-cdlpiercing","refentry"],["trader_cdlrickshawman","function.trader-cdlrickshawman","refentry"],["trader_cdlrisefall3methods","function.trader-cdlrisefall3methods","refentry"],["trader_cdlseparatinglines","function.trader-cdlseparatinglines","refentry"],["trader_cdlshootingstar","function.trader-cdlshootingstar","refentry"],["trader_cdlshortline","function.trader-cdlshortline","refentry"],["trader_cdlspinningtop","function.trader-cdlspinningtop","refentry"],["trader_cdlstalledpattern","function.trader-cdlstalledpattern","refentry"],["trader_cdlsticksandwich","function.trader-cdlsticksandwich","refentry"],["trader_cdltakuri","function.trader-cdltakuri","refentry"],["trader_cdltasukigap","function.trader-cdltasukigap","refentry"],["trader_cdlthrusting","function.trader-cdlthrusting","refentry"],["trader_cdltristar","function.trader-cdltristar","refentry"],["trader_cdlunique3river","function.trader-cdlunique3river","refentry"],["trader_cdlupsidegap2crows","function.trader-cdlupsidegap2crows","refentry"],["trader_cdlxsidegap3methods","function.trader-cdlxsidegap3methods","refentry"],["trader_ceil","function.trader-ceil","refentry"],["trader_cmo","function.trader-cmo","refentry"],["trader_correl","function.trader-correl","refentry"],["trader_cos","function.trader-cos","refentry"],["trader_cosh","function.trader-cosh","refentry"],["trader_dema","function.trader-dema","refentry"],["trader_div","function.trader-div","refentry"],["trader_dx","function.trader-dx","refentry"],["trader_ema","function.trader-ema","refentry"],["trader_errno","function.trader-errno","refentry"],["trader_exp","function.trader-exp","refentry"],["trader_floor","function.trader-floor","refentry"],["trader_get_compat","function.trader-get-compat","refentry"],["trader_get_unstable_period","function.trader-get-unstable-period","refentry"],["trader_ht_dcperiod","function.trader-ht-dcperiod","refentry"],["trader_ht_dcphase","function.trader-ht-dcphase","refentry"],["trader_ht_phasor","function.trader-ht-phasor","refentry"],["trader_ht_sine","function.trader-ht-sine","refentry"],["trader_ht_trendline","function.trader-ht-trendline","refentry"],["trader_ht_trendmode","function.trader-ht-trendmode","refentry"],["trader_kama","function.trader-kama","refentry"],["trader_linearreg_angle","function.trader-linearreg-angle","refentry"],["trader_linearreg_intercept","function.trader-linearreg-intercept","refentry"],["trader_linearreg_slope","function.trader-linearreg-slope","refentry"],["trader_linearreg","function.trader-linearreg","refentry"],["trader_ln","function.trader-ln","refentry"],["trader_log10","function.trader-log10","refentry"],["trader_ma","function.trader-ma","refentry"],["trader_macd","function.trader-macd","refentry"],["trader_macdext","function.trader-macdext","refentry"],["trader_macdfix","function.trader-macdfix","refentry"],["trader_mama","function.trader-mama","refentry"],["trader_mavp","function.trader-mavp","refentry"],["trader_max","function.trader-max","refentry"],["trader_maxindex","function.trader-maxindex","refentry"],["trader_medprice","function.trader-medprice","refentry"],["trader_mfi","function.trader-mfi","refentry"],["trader_midpoint","function.trader-midpoint","refentry"],["trader_midprice","function.trader-midprice","refentry"],["trader_min","function.trader-min","refentry"],["trader_minindex","function.trader-minindex","refentry"],["trader_minmax","function.trader-minmax","refentry"],["trader_minmaxindex","function.trader-minmaxindex","refentry"],["trader_minus_di","function.trader-minus-di","refentry"],["trader_minus_dm","function.trader-minus-dm","refentry"],["trader_mom","function.trader-mom","refentry"],["trader_mult","function.trader-mult","refentry"],["trader_natr","function.trader-natr","refentry"],["trader_obv","function.trader-obv","refentry"],["trader_plus_di","function.trader-plus-di","refentry"],["trader_plus_dm","function.trader-plus-dm","refentry"],["trader_ppo","function.trader-ppo","refentry"],["trader_roc","function.trader-roc","refentry"],["trader_rocp","function.trader-rocp","refentry"],["trader_rocr100","function.trader-rocr100","refentry"],["trader_rocr","function.trader-rocr","refentry"],["trader_rsi","function.trader-rsi","refentry"],["trader_sar","function.trader-sar","refentry"],["trader_sarext","function.trader-sarext","refentry"],["trader_set_compat","function.trader-set-compat","refentry"],["trader_set_unstable_period","function.trader-set-unstable-period","refentry"],["trader_sin","function.trader-sin","refentry"],["trader_sinh","function.trader-sinh","refentry"],["trader_sma","function.trader-sma","refentry"],["trader_sqrt","function.trader-sqrt","refentry"],["trader_stddev","function.trader-stddev","refentry"],["trader_stoch","function.trader-stoch","refentry"],["trader_stochf","function.trader-stochf","refentry"],["trader_stochrsi","function.trader-stochrsi","refentry"],["trader_sub","function.trader-sub","refentry"],["trader_sum","function.trader-sum","refentry"],["trader_t3","function.trader-t3","refentry"],["trader_tan","function.trader-tan","refentry"],["trader_tanh","function.trader-tanh","refentry"],["trader_tema","function.trader-tema","refentry"],["trader_trange","function.trader-trange","refentry"],["trader_trima","function.trader-trima","refentry"],["trader_trix","function.trader-trix","refentry"],["trader_tsf","function.trader-tsf","refentry"],["trader_typprice","function.trader-typprice","refentry"],["trader_ultosc","function.trader-ultosc","refentry"],["trader_var","function.trader-var","refentry"],["trader_wclprice","function.trader-wclprice","refentry"],["trader_willr","function.trader-willr","refentry"],["trader_wma","function.trader-wma","refentry"],["","ref.trader","reference"],["Trader","book.trader","book"],["","refs.math","set"],["","intro.fdf","preface"],["","fdf.requirements","section"],["","fdf.installation","section"],["","fdf.configuration","section"],["","fdf.resources","section"],["","fdf.setup","chapter"],["","fdf.constants","varlistentry"],["","fdf.constants","varlistentry"],["","fdf.constants","varlistentry"],["","fdf.constants","varlistentry"],["","fdf.constants","varlistentry"],["","fdf.constants","varlistentry"],["","fdf.constants","varlistentry"],["","fdf.constants","varlistentry"],["","fdf.constants","varlistentry"],["","fdf.constants","varlistentry"],["","fdf.constants","varlistentry"],["","fdf.constants","varlistentry"],["","fdf.constants","varlistentry"],["","fdf.constants","varlistentry"],["","fdf.constants","varlistentry"],["","fdf.constants","varlistentry"],["","fdf.constants","varlistentry"],["","fdf.constants","varlistentry"],["","fdf.constants","varlistentry"],["","fdf.constants","varlistentry"],["","fdf.constants","varlistentry"],["","fdf.constants","varlistentry"],["","fdf.constants","varlistentry"],["","fdf.constants","varlistentry"],["","fdf.constants","varlistentry"],["","fdf.constants","varlistentry"],["","fdf.constants","varlistentry"],["","fdf.constants","appendix"],["","fdf.examples","example"],["","fdf.examples","chapter"],["","function.fdf-add-doc-javascript","example"],["fdf_add_doc_javascript","function.fdf-add-doc-javascript","refentry"],["fdf_add_template","function.fdf-add-template","refentry"],["fdf_close","function.fdf-close","refentry"],["","function.fdf-create","example"],["fdf_create","function.fdf-create","refentry"],["fdf_enum_values","function.fdf-enum-values","refentry"],["fdf_errno","function.fdf-errno","refentry"],["fdf_error","function.fdf-error","refentry"],["fdf_get_ap","function.fdf-get-ap","refentry"],["","function.fdf-get-attachment","example"],["fdf_get_attachment","function.fdf-get-attachment","refentry"],["fdf_get_encoding","function.fdf-get-encoding","refentry"],["fdf_get_file","function.fdf-get-file","refentry"],["fdf_get_flags","function.fdf-get-flags","refentry"],["fdf_get_opt","function.fdf-get-opt","refentry"],["fdf_get_status","function.fdf-get-status","refentry"],["fdf_get_value","function.fdf-get-value","refentry"],["fdf_get_version","function.fdf-get-version","refentry"],["fdf_header","function.fdf-header","refentry"],["","function.fdf-next-field-name","example"],["fdf_next_field_name","function.fdf-next-field-name","refentry"],["","function.fdf-open-string","example"],["fdf_open_string","function.fdf-open-string","refentry"],["","function.fdf-open","example"],["fdf_open","function.fdf-open","refentry"],["fdf_remove_item","function.fdf-remove-item","refentry"],["","function.fdf-save-string","example"],["fdf_save_string","function.fdf-save-string","refentry"],["fdf_save","function.fdf-save","refentry"],["fdf_set_ap","function.fdf-set-ap","refentry"],["fdf_set_encoding","function.fdf-set-encoding","refentry"],["","function.fdf-set-file","example"],["fdf_set_file","function.fdf-set-file","refentry"],["fdf_set_flags","function.fdf-set-flags","refentry"],["fdf_set_javascript_action","function.fdf-set-javascript-action","refentry"],["fdf_set_on_import_javascript","function.fdf-set-on-import-javascript","refentry"],["fdf_set_opt","function.fdf-set-opt","refentry"],["fdf_set_status","function.fdf-set-status","refentry"],["fdf_set_submit_form_action","function.fdf-set-submit-form-action","refentry"],["fdf_set_target_frame","function.fdf-set-target-frame","refentry"],["fdf_set_value","function.fdf-set-value","refentry"],["fdf_set_version","function.fdf-set-version","refentry"],["","ref.fdf","reference"],["FDF","book.fdf","book"],["","intro.gnupg","preface"],["","gnupg.requirements","section"],["","gnupg.installation","section"],["","gnupg.configuration","section"],["","gnupg.resources","section"],["","gnupg.setup","chapter"],["","gnupg.constants","varlistentry"],["","gnupg.constants","varlistentry"],["","gnupg.constants","varlistentry"],["","gnupg.constants","varlistentry"],["","gnupg.constants","varlistentry"],["","gnupg.constants","varlistentry"],["","gnupg.constants","varlistentry"],["","gnupg.constants","varlistentry"],["","gnupg.constants","varlistentry"],["","gnupg.constants","varlistentry"],["","gnupg.constants","varlistentry"],["","gnupg.constants","varlistentry"],["","gnupg.constants","varlistentry"],["","gnupg.constants","varlistentry"],["","gnupg.constants","varlistentry"],["","gnupg.constants","varlistentry"],["","gnupg.constants","varlistentry"],["","gnupg.constants","varlistentry"],["","gnupg.constants","varlistentry"],["","gnupg.constants","varlistentry"],["","gnupg.constants","varlistentry"],["","gnupg.constants","varlistentry"],["","gnupg.constants","varlistentry"],["","gnupg.constants","varlistentry"],["","gnupg.constants","varlistentry"],["","gnupg.constants","appendix"],["","gnupg.examples-clearsign","example"],["","gnupg.examples-clearsign","example"],["","gnupg.examples-clearsign","example"],["","gnupg.examples-clearsign","section"],["","gnupg.examples","chapter"],["","function.gnupg-adddecryptkey","example"],["","function.gnupg-adddecryptkey","example"],["gnupg_adddecryptkey","function.gnupg-adddecryptkey","refentry"],["","function.gnupg-addencryptkey","example"],["","function.gnupg-addencryptkey","example"],["gnupg_addencryptkey","function.gnupg-addencryptkey","refentry"],["","function.gnupg-addsignkey","example"],["","function.gnupg-addsignkey","example"],["gnupg_addsignkey","function.gnupg-addsignkey","refentry"],["","function.gnupg-cleardecryptkeys","example"],["","function.gnupg-cleardecryptkeys","example"],["gnupg_cleardecryptkeys","function.gnupg-cleardecryptkeys","refentry"],["","function.gnupg-clearencryptkeys","example"],["","function.gnupg-clearencryptkeys","example"],["gnupg_clearencryptkeys","function.gnupg-clearencryptkeys","refentry"],["","function.gnupg-clearsignkeys","example"],["","function.gnupg-clearsignkeys","example"],["gnupg_clearsignkeys","function.gnupg-clearsignkeys","refentry"],["","function.gnupg-decrypt","example"],["","function.gnupg-decrypt","example"],["gnupg_decrypt","function.gnupg-decrypt","refentry"],["","function.gnupg-decryptverify","example"],["","function.gnupg-decryptverify","example"],["gnupg_decryptverify","function.gnupg-decryptverify","refentry"],["","function.gnupg-encrypt","example"],["","function.gnupg-encrypt","example"],["gnupg_encrypt","function.gnupg-encrypt","refentry"],["","function.gnupg-encryptsign","example"],["","function.gnupg-encryptsign","example"],["gnupg_encryptsign","function.gnupg-encryptsign","refentry"],["","function.gnupg-export","example"],["","function.gnupg-export","example"],["gnupg_export","function.gnupg-export","refentry"],["","function.gnupg-geterror","example"],["","function.gnupg-geterror","example"],["gnupg_geterror","function.gnupg-geterror","refentry"],["","function.gnupg-getprotocol","example"],["","function.gnupg-getprotocol","example"],["gnupg_getprotocol","function.gnupg-getprotocol","refentry"],["","function.gnupg-import","example"],["","function.gnupg-import","example"],["gnupg_import","function.gnupg-import","refentry"],["","function.gnupg-init","example"],["","function.gnupg-init","example"],["gnupg_init","function.gnupg-init","refentry"],["","function.gnupg-keyinfo","example"],["","function.gnupg-keyinfo","example"],["gnupg_keyinfo","function.gnupg-keyinfo","refentry"],["","function.gnupg-setarmor","example"],["","function.gnupg-setarmor","example"],["gnupg_setarmor","function.gnupg-setarmor","refentry"],["","function.gnupg-seterrormode","example"],["","function.gnupg-seterrormode","example"],["gnupg_seterrormode","function.gnupg-seterrormode","refentry"],["","function.gnupg-setsignmode","example"],["","function.gnupg-setsignmode","example"],["gnupg_setsignmode","function.gnupg-setsignmode","refentry"],["","function.gnupg-sign","example"],["","function.gnupg-sign","example"],["gnupg_sign","function.gnupg-sign","refentry"],["","function.gnupg-verify","example"],["","function.gnupg-verify","example"],["gnupg_verify","function.gnupg-verify","refentry"],["","ref.gnupg","reference"],["GnuPG","book.gnupg","book"],["","intro.haru","preface"],["","haru.requirements","section"],["","haru.installation","section"],["","haru.configuration","section"],["","haru.resources","section"],["","haru.setup","chapter"],["","haru.constants","appendix"],["","haru.examples-basics","example"],["","haru.examples-basics","section"],["","haru.examples","chapter"],["","haru.builtin.fonts","section"],["","haru.builtin.encodings","section"],["","haru.builtin","chapter"],["","class.haruexception","section"],["","class.haruexception","section"],["HaruException","class.haruexception","phpdoc:exceptionref"],["","class.harudoc","section"],["","class.harudoc","section"],["","class.harudoc","section"],["HaruDoc::addPage","harudoc.addpage","refentry"],["HaruDoc::addPageLabel","harudoc.addpagelabel","refentry"],["HaruDoc::__construct","harudoc.construct","refentry"],["HaruDoc::createOutline","harudoc.createoutline","refentry"],["HaruDoc::getCurrentEncoder","harudoc.getcurrentencoder","refentry"],["HaruDoc::getCurrentPage","harudoc.getcurrentpage","refentry"],["HaruDoc::getEncoder","harudoc.getencoder","refentry"],["HaruDoc::getFont","harudoc.getfont","refentry"],["HaruDoc::getInfoAttr","harudoc.getinfoattr","refentry"],["HaruDoc::getPageLayout","harudoc.getpagelayout","refentry"],["HaruDoc::getPageMode","harudoc.getpagemode","refentry"],["HaruDoc::getStreamSize","harudoc.getstreamsize","refentry"],["HaruDoc::insertPage","harudoc.insertpage","refentry"],["HaruDoc::loadJPEG","harudoc.loadjpeg","refentry"],["HaruDoc::loadPNG","harudoc.loadpng","refentry"],["HaruDoc::loadRaw","harudoc.loadraw","refentry"],["HaruDoc::loadTTC","harudoc.loadttc","refentry"],["HaruDoc::loadTTF","harudoc.loadttf","refentry"],["HaruDoc::loadType1","harudoc.loadtype1","refentry"],["HaruDoc::output","harudoc.output","refentry"],["HaruDoc::readFromStream","harudoc.readfromstream","refentry"],["HaruDoc::resetError","harudoc.reseterror","refentry"],["HaruDoc::resetStream","harudoc.resetstream","refentry"],["HaruDoc::save","harudoc.save","refentry"],["HaruDoc::saveToStream","harudoc.savetostream","refentry"],["HaruDoc::setCompressionMode","harudoc.setcompressionmode","refentry"],["HaruDoc::setCurrentEncoder","harudoc.setcurrentencoder","refentry"],["HaruDoc::setEncryptionMode","harudoc.setencryptionmode","refentry"],["HaruDoc::setInfoAttr","harudoc.setinfoattr","refentry"],["HaruDoc::setInfoDateAttr","harudoc.setinfodateattr","refentry"],["HaruDoc::setOpenAction","harudoc.setopenaction","refentry"],["HaruDoc::setPageLayout","harudoc.setpagelayout","refentry"],["HaruDoc::setPageMode","harudoc.setpagemode","refentry"],["HaruDoc::setPagesConfiguration","harudoc.setpagesconfiguration","refentry"],["HaruDoc::setPassword","harudoc.setpassword","refentry"],["HaruDoc::setPermission","harudoc.setpermission","refentry"],["HaruDoc::useCNSEncodings","harudoc.usecnsencodings","refentry"],["HaruDoc::useCNSFonts","harudoc.usecnsfonts","refentry"],["HaruDoc::useCNTEncodings","harudoc.usecntencodings","refentry"],["HaruDoc::useCNTFonts","harudoc.usecntfonts","refentry"],["HaruDoc::useJPEncodings","harudoc.usejpencodings","refentry"],["HaruDoc::useJPFonts","harudoc.usejpfonts","refentry"],["HaruDoc::useKREncodings","harudoc.usekrencodings","refentry"],["HaruDoc::useKRFonts","harudoc.usekrfonts","refentry"],["HaruDoc","class.harudoc","phpdoc:classref"],["","class.harupage","section"],["","class.harupage","section"],["","class.harupage","section"],["HaruPage::arc","harupage.arc","refentry"],["HaruPage::beginText","harupage.begintext","refentry"],["HaruPage::circle","harupage.circle","refentry"],["HaruPage::closePath","harupage.closepath","refentry"],["HaruPage::concat","harupage.concat","refentry"],["HaruPage::createDestination","harupage.createdestination","refentry"],["HaruPage::createLinkAnnotation","harupage.createlinkannotation","refentry"],["HaruPage::createTextAnnotation","harupage.createtextannotation","refentry"],["HaruPage::createURLAnnotation","harupage.createurlannotation","refentry"],["HaruPage::curveTo2","harupage.curveto2","refentry"],["HaruPage::curveTo3","harupage.curveto3","refentry"],["HaruPage::curveTo","harupage.curveto","refentry"],["HaruPage::drawImage","harupage.drawimage","refentry"],["HaruPage::ellipse","harupage.ellipse","refentry"],["HaruPage::endPath","harupage.endpath","refentry"],["HaruPage::endText","harupage.endtext","refentry"],["HaruPage::eofill","harupage.eofill","refentry"],["HaruPage::eoFillStroke","harupage.eofillstroke","refentry"],["HaruPage::fill","harupage.fill","refentry"],["HaruPage::fillStroke","harupage.fillstroke","refentry"],["HaruPage::getCharSpace","harupage.getcharspace","refentry"],["HaruPage::getCMYKFill","harupage.getcmykfill","refentry"],["HaruPage::getCMYKStroke","harupage.getcmykstroke","refentry"],["HaruPage::getCurrentFont","harupage.getcurrentfont","refentry"],["HaruPage::getCurrentFontSize","harupage.getcurrentfontsize","refentry"],["HaruPage::getCurrentPos","harupage.getcurrentpos","refentry"],["HaruPage::getCurrentTextPos","harupage.getcurrenttextpos","refentry"],["HaruPage::getDash","harupage.getdash","refentry"],["HaruPage::getFillingColorSpace","harupage.getfillingcolorspace","refentry"],["HaruPage::getFlatness","harupage.getflatness","refentry"],["HaruPage::getGMode","harupage.getgmode","refentry"],["HaruPage::getGrayFill","harupage.getgrayfill","refentry"],["HaruPage::getGrayStroke","harupage.getgraystroke","refentry"],["HaruPage::getHeight","harupage.getheight","refentry"],["HaruPage::getHorizontalScaling","harupage.gethorizontalscaling","refentry"],["HaruPage::getLineCap","harupage.getlinecap","refentry"],["HaruPage::getLineJoin","harupage.getlinejoin","refentry"],["HaruPage::getLineWidth","harupage.getlinewidth","refentry"],["HaruPage::getMiterLimit","harupage.getmiterlimit","refentry"],["HaruPage::getRGBFill","harupage.getrgbfill","refentry"],["HaruPage::getRGBStroke","harupage.getrgbstroke","refentry"],["HaruPage::getStrokingColorSpace","harupage.getstrokingcolorspace","refentry"],["HaruPage::getTextLeading","harupage.gettextleading","refentry"],["HaruPage::getTextMatrix","harupage.gettextmatrix","refentry"],["HaruPage::getTextRenderingMode","harupage.gettextrenderingmode","refentry"],["HaruPage::getTextRise","harupage.gettextrise","refentry"],["HaruPage::getTextWidth","harupage.gettextwidth","refentry"],["HaruPage::getTransMatrix","harupage.gettransmatrix","refentry"],["HaruPage::getWidth","harupage.getwidth","refentry"],["HaruPage::getWordSpace","harupage.getwordspace","refentry"],["HaruPage::lineTo","harupage.lineto","refentry"],["HaruPage::measureText","harupage.measuretext","refentry"],["HaruPage::moveTextPos","harupage.movetextpos","refentry"],["HaruPage::moveTo","harupage.moveto","refentry"],["HaruPage::moveToNextLine","harupage.movetonextline","refentry"],["HaruPage::rectangle","harupage.rectangle","refentry"],["HaruPage::setCharSpace","harupage.setcharspace","refentry"],["HaruPage::setCMYKFill","harupage.setcmykfill","refentry"],["HaruPage::setCMYKStroke","harupage.setcmykstroke","refentry"],["HaruPage::setDash","harupage.setdash","refentry"],["HaruPage::setFlatness","harupage.setflatness","refentry"],["HaruPage::setFontAndSize","harupage.setfontandsize","refentry"],["HaruPage::setGrayFill","harupage.setgrayfill","refentry"],["HaruPage::setGrayStroke","harupage.setgraystroke","refentry"],["HaruPage::setHeight","harupage.setheight","refentry"],["HaruPage::setHorizontalScaling","harupage.sethorizontalscaling","refentry"],["HaruPage::setLineCap","harupage.setlinecap","refentry"],["HaruPage::setLineJoin","harupage.setlinejoin","refentry"],["HaruPage::setLineWidth","harupage.setlinewidth","refentry"],["HaruPage::setMiterLimit","harupage.setmiterlimit","refentry"],["HaruPage::setRGBFill","harupage.setrgbfill","refentry"],["HaruPage::setRGBStroke","harupage.setrgbstroke","refentry"],["HaruPage::setRotate","harupage.setrotate","refentry"],["HaruPage::setSize","harupage.setsize","refentry"],["HaruPage::setSlideShow","harupage.setslideshow","refentry"],["HaruPage::setTextLeading","harupage.settextleading","refentry"],["HaruPage::setTextMatrix","harupage.settextmatrix","refentry"],["HaruPage::setTextRenderingMode","harupage.settextrenderingmode","refentry"],["HaruPage::setTextRise","harupage.settextrise","refentry"],["HaruPage::setWidth","harupage.setwidth","refentry"],["HaruPage::setWordSpace","harupage.setwordspace","refentry"],["HaruPage::showText","harupage.showtext","refentry"],["HaruPage::showTextNextLine","harupage.showtextnextline","refentry"],["HaruPage::stroke","harupage.stroke","refentry"],["HaruPage::textOut","harupage.textout","refentry"],["HaruPage::textRect","harupage.textrect","refentry"],["HaruPage","class.harupage","phpdoc:classref"],["","class.harufont","section"],["","class.harufont","section"],["HaruFont::getAscent","harufont.getascent","refentry"],["HaruFont::getCapHeight","harufont.getcapheight","refentry"],["HaruFont::getDescent","harufont.getdescent","refentry"],["HaruFont::getEncodingName","harufont.getencodingname","refentry"],["HaruFont::getFontName","harufont.getfontname","refentry"],["HaruFont::getTextWidth","harufont.gettextwidth","refentry"],["HaruFont::getUnicodeWidth","harufont.getunicodewidth","refentry"],["HaruFont::getXHeight","harufont.getxheight","refentry"],["HaruFont::measureText","harufont.measuretext","refentry"],["HaruFont","class.harufont","phpdoc:classref"],["","class.haruimage","section"],["","class.haruimage","section"],["HaruImage::getBitsPerComponent","haruimage.getbitspercomponent","refentry"],["HaruImage::getColorSpace","haruimage.getcolorspace","refentry"],["HaruImage::getHeight","haruimage.getheight","refentry"],["HaruImage::getSize","haruimage.getsize","refentry"],["HaruImage::getWidth","haruimage.getwidth","refentry"],["HaruImage::setColorMask","haruimage.setcolormask","refentry"],["HaruImage::setMaskImage","haruimage.setmaskimage","refentry"],["HaruImage","class.haruimage","phpdoc:classref"],["","class.haruencoder","section"],["","class.haruencoder","section"],["","class.haruencoder","section"],["HaruEncoder::getByteType","haruencoder.getbytetype","refentry"],["HaruEncoder::getType","haruencoder.gettype","refentry"],["HaruEncoder::getUnicode","haruencoder.getunicode","refentry"],["HaruEncoder::getWritingMode","haruencoder.getwritingmode","refentry"],["HaruEncoder","class.haruencoder","phpdoc:classref"],["","class.haruoutline","section"],["","class.haruoutline","section"],["HaruOutline::setDestination","haruoutline.setdestination","refentry"],["HaruOutline::setOpened","haruoutline.setopened","refentry"],["HaruOutline","class.haruoutline","phpdoc:classref"],["","class.haruannotation","section"],["","class.haruannotation","section"],["","class.haruannotation","section"],["HaruAnnotation::setBorderStyle","haruannotation.setborderstyle","refentry"],["HaruAnnotation::setHighlightMode","haruannotation.sethighlightmode","refentry"],["HaruAnnotation::setIcon","haruannotation.seticon","refentry"],["HaruAnnotation::setOpened","haruannotation.setopened","refentry"],["HaruAnnotation","class.haruannotation","phpdoc:classref"],["","class.harudestination","section"],["","class.harudestination","section"],["HaruDestination::setFit","harudestination.setfit","refentry"],["HaruDestination::setFitB","harudestination.setfitb","refentry"],["HaruDestination::setFitBH","harudestination.setfitbh","refentry"],["HaruDestination::setFitBV","harudestination.setfitbv","refentry"],["HaruDestination::setFitH","harudestination.setfith","refentry"],["HaruDestination::setFitR","harudestination.setfitr","refentry"],["HaruDestination::setFitV","harudestination.setfitv","refentry"],["HaruDestination::setXYZ","harudestination.setxyz","refentry"],["HaruDestination","class.harudestination","phpdoc:classref"],["haru","book.haru","book"],["","intro.ming","preface"],["","ming.requirements","section"],["","ming.install","section"],["","ming.configuration","section"],["","ming.resources","section"],["","ming.setup","chapter"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","varlistentry"],["","ming.constants","appendix"],["","ming.examples.swfaction","example"],["","ming.examples.swfaction","example"],["","ming.examples.swfaction","example"],["","ming.examples.swfaction","section"],["","ming.examples.swfsprite-basic","example"],["","ming.examples.swfsprite-basic","section"],["","ming.examples","chapter"],["ming_keypress","function.ming-keypress","refentry"],["ming_setcubicthreshold","function.ming-setcubicthreshold","refentry"],["ming_setscale","function.ming-setscale","refentry"],["ming_setswfcompression","function.ming-setswfcompression","refentry"],["ming_useconstants","function.ming-useconstants","refentry"],["","function.ming-useswfversion","example"],["ming_useswfversion","function.ming-useswfversion","refentry"],["","ref.ming","reference"],["","class.swfaction","section"],["","class.swfaction","section"],["SWFAction::__construct","swfaction.construct","refentry"],["SWFAction","class.swfaction","phpdoc:classref"],["","class.swfbitmap","section"],["","class.swfbitmap","section"],["","swfbitmap.construct","example"],["","swfbitmap.construct","example"],["SWFBitmap::__construct","swfbitmap.construct","refentry"],["SWFBitmap::getHeight","swfbitmap.getheight","refentry"],["SWFBitmap::getWidth","swfbitmap.getwidth","refentry"],["SWFBitmap","class.swfbitmap","phpdoc:classref"],["","class.swfbutton","section"],["","class.swfbutton","section"],["SWFButton::addAction","swfbutton.addaction","refentry"],["SWFButton::addASound","swfbutton.addasound","refentry"],["SWFButton::addShape","swfbutton.addshape","refentry"],["","swfbutton.construct","example"],["","swfbutton.construct","example"],["SWFButton::__construct","swfbutton.construct","refentry"],["SWFButton::setAction","swfbutton.setaction","refentry"],["SWFButton::setDown","swfbutton.setdown","refentry"],["SWFButton::setHit","swfbutton.sethit","refentry"],["SWFButton::setMenu","swfbutton.setmenu","refentry"],["SWFButton::setOver","swfbutton.setover","refentry"],["SWFButton::setUp","swfbutton.setup","refentry"],["SWFButton","class.swfbutton","phpdoc:classref"],["","class.swfdisplayitem","section"],["","class.swfdisplayitem","section"],["SWFDisplayItem::addAction","swfdisplayitem.addaction","refentry"],["SWFDisplayItem::addColor","swfdisplayitem.addcolor","refentry"],["SWFDisplayItem::endMask","swfdisplayitem.endmask","refentry"],["SWFDisplayItem::getRot","swfdisplayitem.getrot","refentry"],["SWFDisplayItem::getX","swfdisplayitem.getx","refentry"],["SWFDisplayItem::getXScale","swfdisplayitem.getxscale","refentry"],["SWFDisplayItem::getXSkew","swfdisplayitem.getxskew","refentry"],["SWFDisplayItem::getY","swfdisplayitem.gety","refentry"],["SWFDisplayItem::getYScale","swfdisplayitem.getyscale","refentry"],["SWFDisplayItem::getYSkew","swfdisplayitem.getyskew","refentry"],["SWFDisplayItem::move","swfdisplayitem.move","refentry"],["SWFDisplayItem::moveTo","swfdisplayitem.moveto","refentry"],["","swfdisplayitem.multcolor","example"],["SWFDisplayItem::multColor","swfdisplayitem.multcolor","refentry"],["SWFDisplayItem::remove","swfdisplayitem.remove","refentry"],["SWFDisplayItem::rotate","swfdisplayitem.rotate","refentry"],["","swfdisplayitem.rotateto","example"],["SWFDisplayItem::rotateTo","swfdisplayitem.rotateto","refentry"],["SWFDisplayItem::scale","swfdisplayitem.scale","refentry"],["SWFDisplayItem::scaleTo","swfdisplayitem.scaleto","refentry"],["SWFDisplayItem::setDepth","swfdisplayitem.setdepth","refentry"],["SWFDisplayItem::setMaskLevel","swfdisplayitem.setmasklevel","refentry"],["SWFDisplayItem::setMatrix","swfdisplayitem.setmatrix","refentry"],["SWFDisplayItem::setName","swfdisplayitem.setname","refentry"],["","swfdisplayitem.setratio","example"],["SWFDisplayItem::setRatio","swfdisplayitem.setratio","refentry"],["SWFDisplayItem::skewX","swfdisplayitem.skewx","refentry"],["SWFDisplayItem::skewXTo","swfdisplayitem.skewxto","refentry"],["SWFDisplayItem::skewY","swfdisplayitem.skewy","refentry"],["SWFDisplayItem::skewYTo","swfdisplayitem.skewyto","refentry"],["SWFDisplayItem","class.swfdisplayitem","phpdoc:classref"],["","class.swffill","section"],["","class.swffill","section"],["SWFFill::moveTo","swffill.moveto","refentry"],["SWFFill::rotateTo","swffill.rotateto","refentry"],["SWFFill::scaleTo","swffill.scaleto","refentry"],["SWFFill::skewXTo","swffill.skewxto","refentry"],["SWFFill::skewYTo","swffill.skewyto","refentry"],["SWFFill","class.swffill","phpdoc:classref"],["","class.swffont","section"],["","class.swffont","section"],["SWFFont::__construct","swffont.construct","refentry"],["SWFFont::getAscent","swffont.getascent","refentry"],["SWFFont::getDescent","swffont.getdescent","refentry"],["SWFFont::getLeading","swffont.getleading","refentry"],["SWFFont::getShape","swffont.getshape","refentry"],["SWFFont::getUTF8Width","swffont.getutf8width","refentry"],["SWFFont::getWidth","swffont.getwidth","refentry"],["SWFFont","class.swffont","phpdoc:classref"],["","class.swffontchar","section"],["","class.swffontchar","section"],["SWFFontChar::addChars","swffontchar.addchars","refentry"],["SWFFontChar::addUTF8Chars","swffontchar.addutf8chars","refentry"],["SWFFontChar","class.swffontchar","phpdoc:classref"],["","class.swfgradient","section"],["","class.swfgradient","section"],["SWFGradient::addEntry","swfgradient.addentry","refentry"],["","swfgradient.construct","example"],["SWFGradient::__construct","swfgradient.construct","refentry"],["SWFGradient","class.swfgradient","phpdoc:classref"],["","class.swfmorph","section"],["","class.swfmorph","section"],["","swfmorph.construct","example"],["SWFMorph::__construct","swfmorph.construct","refentry"],["SWFMorph::getShape1","swfmorph.getshape1","refentry"],["SWFMorph::getShape2","swfmorph.getshape2","refentry"],["SWFMorph","class.swfmorph","phpdoc:classref"],["","class.swfmovie","section"],["","class.swfmovie","section"],["SWFMovie::add","swfmovie.add","refentry"],["SWFMovie::addExport","swfmovie.addexport","refentry"],["SWFMovie::addFont","swfmovie.addfont","refentry"],["SWFMovie::__construct","swfmovie.construct","refentry"],["SWFMovie::importChar","swfmovie.importchar","refentry"],["SWFMovie::importFont","swfmovie.importfont","refentry"],["SWFMovie::labelFrame","swfmovie.labelframe","refentry"],["SWFMovie::nextFrame","swfmovie.nextframe","refentry"],["","swfmovie.output","example"],["SWFMovie::output","swfmovie.output","refentry"],["SWFMovie::remove","swfmovie.remove","refentry"],["SWFMovie::save","swfmovie.save","refentry"],["SWFMovie::saveToFile","swfmovie.savetofile","refentry"],["SWFMovie::setbackground","swfmovie.setbackground","refentry"],["SWFMovie::setDimension","swfmovie.setdimension","refentry"],["SWFMovie::setFrames","swfmovie.setframes","refentry"],["SWFMovie::setRate","swfmovie.setrate","refentry"],["SWFMovie::startSound","swfmovie.startsound","refentry"],["SWFMovie::stopSound","swfmovie.stopsound","refentry"],["","swfmovie.streammp3","example"],["SWFMovie::streamMP3","swfmovie.streammp3","refentry"],["SWFMovie::writeExports","swfmovie.writeexports","refentry"],["SWFMovie","class.swfmovie","phpdoc:classref"],["","class.swfprebuiltclip","section"],["","class.swfprebuiltclip","section"],["SWFPrebuiltClip::__construct","swfprebuiltclip.construct","refentry"],["SWFPrebuiltClip","class.swfprebuiltclip","phpdoc:classref"],["","class.swfshape","section"],["","class.swfshape","section"],["","swfshape.addfill","example"],["SWFShape::addFill","swfshape.addfill","refentry"],["","swfshape.construct","example"],["SWFShape::__construct","swfshape.construct","refentry"],["SWFShape::drawArc","swfshape.drawarc","refentry"],["SWFShape::drawCircle","swfshape.drawcircle","refentry"],["SWFShape::drawCubic","swfshape.drawcubic","refentry"],["SWFShape::drawCubicTo","swfshape.drawcubicto","refentry"],["SWFShape::drawCurve","swfshape.drawcurve","refentry"],["SWFShape::drawCurveTo","swfshape.drawcurveto","refentry"],["SWFShape::drawGlyph","swfshape.drawglyph","refentry"],["SWFShape::drawLine","swfshape.drawline","refentry"],["SWFShape::drawLineTo","swfshape.drawlineto","refentry"],["SWFShape::movePen","swfshape.movepen","refentry"],["SWFShape::movePenTo","swfshape.movepento","refentry"],["SWFShape::setLeftFill","swfshape.setleftfill","refentry"],["","swfshape.setline","example"],["SWFShape::setLine","swfshape.setline","refentry"],["SWFShape::setRightFill","swfshape.setrightfill","refentry"],["SWFShape","class.swfshape","phpdoc:classref"],["","class.swfsound","section"],["","class.swfsound","section"],["SWFSound::__construct","swfsound.construct","refentry"],["SWFSound","class.swfsound","phpdoc:classref"],["","class.swfsoundinstance","section"],["","class.swfsoundinstance","section"],["SWFSoundInstance::loopCount","swfsoundinstance.loopcount","refentry"],["SWFSoundInstance::loopInPoint","swfsoundinstance.loopinpoint","refentry"],["SWFSoundInstance::loopOutPoint","swfsoundinstance.loopoutpoint","refentry"],["SWFSoundInstance::noMultiple","swfsoundinstance.nomultiple","refentry"],["SWFSoundInstance","class.swfsoundinstance","phpdoc:classref"],["","class.swfsprite","section"],["","class.swfsprite","section"],["SWFSprite::add","swfsprite.add","refentry"],["SWFSprite::__construct","swfsprite.construct","refentry"],["SWFSprite::labelFrame","swfsprite.labelframe","refentry"],["SWFSprite::nextFrame","swfsprite.nextframe","refentry"],["SWFSprite::remove","swfsprite.remove","refentry"],["SWFSprite::setFrames","swfsprite.setframes","refentry"],["SWFSprite::startSound","swfsprite.startsound","refentry"],["SWFSprite::stopSound","swfsprite.stopsound","refentry"],["SWFSprite","class.swfsprite","phpdoc:classref"],["","class.swftext","section"],["","class.swftext","section"],["SWFText::addString","swftext.addstring","refentry"],["SWFText::addUTF8String","swftext.addutf8string","refentry"],["","swftext.construct","example"],["SWFText::__construct","swftext.construct","refentry"],["SWFText::getAscent","swftext.getascent","refentry"],["SWFText::getDescent","swftext.getdescent","refentry"],["SWFText::getLeading","swftext.getleading","refentry"],["SWFText::getUTF8Width","swftext.getutf8width","refentry"],["SWFText::getWidth","swftext.getwidth","refentry"],["SWFText::moveTo","swftext.moveto","refentry"],["SWFText::setColor","swftext.setcolor","refentry"],["SWFText::setFont","swftext.setfont","refentry"],["SWFText::setHeight","swftext.setheight","refentry"],["SWFText::setSpacing","swftext.setspacing","refentry"],["SWFText","class.swftext","phpdoc:classref"],["","class.swftextfield","section"],["","class.swftextfield","section"],["SWFTextField::addChars","swftextfield.addchars","refentry"],["SWFTextField::addString","swftextfield.addstring","refentry"],["SWFTextField::align","swftextfield.align","refentry"],["SWFTextField::__construct","swftextfield.construct","refentry"],["SWFTextField::setBounds","swftextfield.setbounds","refentry"],["SWFTextField::setColor","swftextfield.setcolor","refentry"],["SWFTextField::setFont","swftextfield.setfont","refentry"],["SWFTextField::setHeight","swftextfield.setheight","refentry"],["SWFTextField::setIndentation","swftextfield.setindentation","refentry"],["SWFTextField::setLeftMargin","swftextfield.setleftmargin","refentry"],["SWFTextField::setLineSpacing","swftextfield.setlinespacing","refentry"],["SWFTextField::setMargins","swftextfield.setmargins","refentry"],["SWFTextField::setName","swftextfield.setname","refentry"],["SWFTextField::setPadding","swftextfield.setpadding","refentry"],["SWFTextField::setRightMargin","swftextfield.setrightmargin","refentry"],["SWFTextField","class.swftextfield","phpdoc:classref"],["","class.swfvideostream","section"],["","class.swfvideostream","section"],["SWFVideoStream::__construct","swfvideostream.construct","refentry"],["SWFVideoStream::getNumFrames","swfvideostream.getnumframes","refentry"],["SWFVideoStream::setDimension","swfvideostream.setdimension","refentry"],["SWFVideoStream","class.swfvideostream","phpdoc:classref"],["Ming","book.ming","book"],["","intro.pdf","preface"],["","pdf.requirements","section"],["","pdf.installation","section"],["","pdf.configuration","section"],["","pdf.resources","section"],["","pdf.setup","chapter"],["","pdf.constants","appendix"],["","pdf.examples-basic","example"],["","pdf.examples-basic","example"],["","pdf.examples-basic","section"],["","pdf.examples","chapter"],["","ref.pdf","partintro"],["PDF_activate_item","function.pdf-activate-item","refentry"],["PDF_add_annotation","function.pdf-add-annotation","refentry"],["PDF_add_bookmark","function.pdf-add-bookmark","refentry"],["PDF_add_launchlink","function.pdf-add-launchlink","refentry"],["PDF_add_locallink","function.pdf-add-locallink","refentry"],["PDF_add_nameddest","function.pdf-add-nameddest","refentry"],["PDF_add_note","function.pdf-add-note","refentry"],["PDF_add_outline","function.pdf-add-outline","refentry"],["PDF_add_pdflink","function.pdf-add-pdflink","refentry"],["PDF_add_table_cell","function.pdf-add-table-cell","refentry"],["PDF_add_textflow","function.pdf-add-textflow","refentry"],["PDF_add_thumbnail","function.pdf-add-thumbnail","refentry"],["PDF_add_weblink","function.pdf-add-weblink","refentry"],["PDF_arc","function.pdf-arc","refentry"],["PDF_arcn","function.pdf-arcn","refentry"],["PDF_attach_file","function.pdf-attach-file","refentry"],["PDF_begin_document","function.pdf-begin-document","refentry"],["PDF_begin_font","function.pdf-begin-font","refentry"],["PDF_begin_glyph","function.pdf-begin-glyph","refentry"],["PDF_begin_item","function.pdf-begin-item","refentry"],["PDF_begin_layer","function.pdf-begin-layer","refentry"],["PDF_begin_page_ext","function.pdf-begin-page-ext","refentry"],["PDF_begin_page","function.pdf-begin-page","refentry"],["PDF_begin_pattern","function.pdf-begin-pattern","refentry"],["PDF_begin_template_ext","function.pdf-begin-template-ext","refentry"],["PDF_begin_template","function.pdf-begin-template","refentry"],["PDF_circle","function.pdf-circle","refentry"],["PDF_clip","function.pdf-clip","refentry"],["PDF_close_image","function.pdf-close-image","refentry"],["PDF_close_pdi_page","function.pdf-close-pdi-page","refentry"],["PDF_close_pdi","function.pdf-close-pdi","refentry"],["PDF_close","function.pdf-close","refentry"],["PDF_closepath_fill_stroke","function.pdf-closepath-fill-stroke","refentry"],["PDF_closepath_stroke","function.pdf-closepath-stroke","refentry"],["PDF_closepath","function.pdf-closepath","refentry"],["PDF_concat","function.pdf-concat","refentry"],["PDF_continue_text","function.pdf-continue-text","refentry"],["PDF_create_3dview","function.pdf-create-3dview","refentry"],["PDF_create_action","function.pdf-create-action","refentry"],["PDF_create_annotation","function.pdf-create-annotation","refentry"],["PDF_create_bookmark","function.pdf-create-bookmark","refentry"],["PDF_create_field","function.pdf-create-field","refentry"],["PDF_create_fieldgroup","function.pdf-create-fieldgroup","refentry"],["PDF_create_gstate","function.pdf-create-gstate","refentry"],["PDF_create_pvf","function.pdf-create-pvf","refentry"],["PDF_create_textflow","function.pdf-create-textflow","refentry"],["PDF_curveto","function.pdf-curveto","refentry"],["PDF_define_layer","function.pdf-define-layer","refentry"],["PDF_delete_pvf","function.pdf-delete-pvf","refentry"],["PDF_delete_table","function.pdf-delete-table","refentry"],["PDF_delete_textflow","function.pdf-delete-textflow","refentry"],["PDF_delete","function.pdf-delete","refentry"],["PDF_encoding_set_char","function.pdf-encoding-set-char","refentry"],["PDF_end_document","function.pdf-end-document","refentry"],["PDF_end_font","function.pdf-end-font","refentry"],["PDF_end_glyph","function.pdf-end-glyph","refentry"],["PDF_end_item","function.pdf-end-item","refentry"],["PDF_end_layer","function.pdf-end-layer","refentry"],["PDF_end_page_ext","function.pdf-end-page-ext","refentry"],["PDF_end_page","function.pdf-end-page","refentry"],["PDF_end_pattern","function.pdf-end-pattern","refentry"],["PDF_end_template","function.pdf-end-template","refentry"],["PDF_endpath","function.pdf-endpath","refentry"],["PDF_fill_imageblock","function.pdf-fill-imageblock","refentry"],["PDF_fill_pdfblock","function.pdf-fill-pdfblock","refentry"],["PDF_fill_stroke","function.pdf-fill-stroke","refentry"],["PDF_fill_textblock","function.pdf-fill-textblock","refentry"],["PDF_fill","function.pdf-fill","refentry"],["PDF_findfont","function.pdf-findfont","refentry"],["PDF_fit_image","function.pdf-fit-image","refentry"],["PDF_fit_pdi_page","function.pdf-fit-pdi-page","refentry"],["PDF_fit_table","function.pdf-fit-table","refentry"],["PDF_fit_textflow","function.pdf-fit-textflow","refentry"],["PDF_fit_textline","function.pdf-fit-textline","refentry"],["PDF_get_apiname","function.pdf-get-apiname","refentry"],["PDF_get_buffer","function.pdf-get-buffer","refentry"],["PDF_get_errmsg","function.pdf-get-errmsg","refentry"],["PDF_get_errnum","function.pdf-get-errnum","refentry"],["PDF_get_font","function.pdf-get-font","refentry"],["PDF_get_fontname","function.pdf-get-fontname","refentry"],["PDF_get_fontsize","function.pdf-get-fontsize","refentry"],["PDF_get_image_height","function.pdf-get-image-height","refentry"],["PDF_get_image_width","function.pdf-get-image-width","refentry"],["PDF_get_majorversion","function.pdf-get-majorversion","refentry"],["PDF_get_minorversion","function.pdf-get-minorversion","refentry"],["PDF_get_parameter","function.pdf-get-parameter","refentry"],["PDF_get_pdi_parameter","function.pdf-get-pdi-parameter","refentry"],["PDF_get_pdi_value","function.pdf-get-pdi-value","refentry"],["PDF_get_value","function.pdf-get-value","refentry"],["PDF_info_font","function.pdf-info-font","refentry"],["PDF_info_matchbox","function.pdf-info-matchbox","refentry"],["PDF_info_table","function.pdf-info-table","refentry"],["PDF_info_textflow","function.pdf-info-textflow","refentry"],["PDF_info_textline","function.pdf-info-textline","refentry"],["PDF_initgraphics","function.pdf-initgraphics","refentry"],["PDF_lineto","function.pdf-lineto","refentry"],["PDF_load_3ddata","function.pdf-load-3ddata","refentry"],["PDF_load_font","function.pdf-load-font","refentry"],["PDF_load_iccprofile","function.pdf-load-iccprofile","refentry"],["PDF_load_image","function.pdf-load-image","refentry"],["PDF_makespotcolor","function.pdf-makespotcolor","refentry"],["PDF_moveto","function.pdf-moveto","refentry"],["PDF_new","function.pdf-new","refentry"],["PDF_open_ccitt","function.pdf-open-ccitt","refentry"],["PDF_open_file","function.pdf-open-file","refentry"],["PDF_open_gif","function.pdf-open-gif","refentry"],["PDF_open_image_file","function.pdf-open-image-file","refentry"],["PDF_open_image","function.pdf-open-image","refentry"],["PDF_open_jpeg","function.pdf-open-jpeg","refentry"],["PDF_open_memory_image","function.pdf-open-memory-image","refentry"],["PDF_open_pdi_document","function.pdf-open-pdi-document","refentry"],["PDF_open_pdi_page","function.pdf-open-pdi-page","refentry"],["PDF_open_pdi","function.pdf-open-pdi","refentry"],["PDF_open_tiff","function.pdf-open-tiff","refentry"],["PDF_pcos_get_number","function.pdf-pcos-get-number","refentry"],["PDF_pcos_get_stream","function.pdf-pcos-get-stream","refentry"],["PDF_pcos_get_string","function.pdf-pcos-get-string","refentry"],["PDF_place_image","function.pdf-place-image","refentry"],["PDF_place_pdi_page","function.pdf-place-pdi-page","refentry"],["PDF_process_pdi","function.pdf-process-pdi","refentry"],["PDF_rect","function.pdf-rect","refentry"],["PDF_restore","function.pdf-restore","refentry"],["PDF_resume_page","function.pdf-resume-page","refentry"],["PDF_rotate","function.pdf-rotate","refentry"],["PDF_save","function.pdf-save","refentry"],["PDF_scale","function.pdf-scale","refentry"],["PDF_set_border_color","function.pdf-set-border-color","refentry"],["PDF_set_border_dash","function.pdf-set-border-dash","refentry"],["PDF_set_border_style","function.pdf-set-border-style","refentry"],["PDF_set_char_spacing","function.pdf-set-char-spacing","refentry"],["PDF_set_duration","function.pdf-set-duration","refentry"],["PDF_set_gstate","function.pdf-set-gstate","refentry"],["PDF_set_horiz_scaling","function.pdf-set-horiz-scaling","refentry"],["PDF_set_info_author","function.pdf-set-info-author","refentry"],["PDF_set_info_creator","function.pdf-set-info-creator","refentry"],["PDF_set_info_keywords","function.pdf-set-info-keywords","refentry"],["PDF_set_info_subject","function.pdf-set-info-subject","refentry"],["PDF_set_info_title","function.pdf-set-info-title","refentry"],["PDF_set_info","function.pdf-set-info","refentry"],["PDF_set_layer_dependency","function.pdf-set-layer-dependency","refentry"],["PDF_set_leading","function.pdf-set-leading","refentry"],["PDF_set_parameter","function.pdf-set-parameter","refentry"],["PDF_set_text_matrix","function.pdf-set-text-matrix","refentry"],["PDF_set_text_pos","function.pdf-set-text-pos","refentry"],["PDF_set_text_rendering","function.pdf-set-text-rendering","refentry"],["PDF_set_text_rise","function.pdf-set-text-rise","refentry"],["PDF_set_value","function.pdf-set-value","refentry"],["PDF_set_word_spacing","function.pdf-set-word-spacing","refentry"],["PDF_setcolor","function.pdf-setcolor","refentry"],["PDF_setdash","function.pdf-setdash","refentry"],["PDF_setdashpattern","function.pdf-setdashpattern","refentry"],["PDF_setflat","function.pdf-setflat","refentry"],["PDF_setfont","function.pdf-setfont","refentry"],["PDF_setgray_fill","function.pdf-setgray-fill","refentry"],["PDF_setgray_stroke","function.pdf-setgray-stroke","refentry"],["PDF_setgray","function.pdf-setgray","refentry"],["PDF_setlinecap","function.pdf-setlinecap","refentry"],["PDF_setlinejoin","function.pdf-setlinejoin","refentry"],["PDF_setlinewidth","function.pdf-setlinewidth","refentry"],["PDF_setmatrix","function.pdf-setmatrix","refentry"],["PDF_setmiterlimit","function.pdf-setmiterlimit","refentry"],["PDF_setpolydash","function.pdf-setpolydash","refentry"],["PDF_setrgbcolor_fill","function.pdf-setrgbcolor-fill","refentry"],["PDF_setrgbcolor_stroke","function.pdf-setrgbcolor-stroke","refentry"],["PDF_setrgbcolor","function.pdf-setrgbcolor","refentry"],["PDF_shading_pattern","function.pdf-shading-pattern","refentry"],["PDF_shading","function.pdf-shading","refentry"],["PDF_shfill","function.pdf-shfill","refentry"],["PDF_show_boxed","function.pdf-show-boxed","refentry"],["PDF_show_xy","function.pdf-show-xy","refentry"],["PDF_show","function.pdf-show","refentry"],["PDF_skew","function.pdf-skew","refentry"],["PDF_stringwidth","function.pdf-stringwidth","refentry"],["PDF_stroke","function.pdf-stroke","refentry"],["PDF_suspend_page","function.pdf-suspend-page","refentry"],["PDF_translate","function.pdf-translate","refentry"],["PDF_utf16_to_utf8","function.pdf-utf16-to-utf8","refentry"],["PDF_utf32_to_utf16","function.pdf-utf32-to-utf16","refentry"],["PDF_utf8_to_utf16","function.pdf-utf8-to-utf16","refentry"],["","ref.pdf","reference"],["","book.pdf","book"],["","intro.ps","preface"],["","ps.requirements","section"],["","ps.installation","section"],["","ps.configuration","section"],["","ps.resources","section"],["","ps.setup","chapter"],["","ps.constants","table"],["","ps.constants","table"],["","ps.constants","appendix"],["","ref.ps","section"],["ps_add_bookmark","function.ps-add-bookmark","refentry"],["ps_add_launchlink","function.ps-add-launchlink","refentry"],["ps_add_locallink","function.ps-add-locallink","refentry"],["ps_add_note","function.ps-add-note","refentry"],["ps_add_pdflink","function.ps-add-pdflink","refentry"],["ps_add_weblink","function.ps-add-weblink","refentry"],["ps_arc","function.ps-arc","refentry"],["ps_arcn","function.ps-arcn","refentry"],["ps_begin_page","function.ps-begin-page","refentry"],["","function.ps-begin-pattern","example"],["ps_begin_pattern","function.ps-begin-pattern","refentry"],["","function.ps-begin-template","example"],["ps_begin_template","function.ps-begin-template","refentry"],["ps_circle","function.ps-circle","refentry"],["ps_clip","function.ps-clip","refentry"],["ps_close_image","function.ps-close-image","refentry"],["ps_close","function.ps-close","refentry"],["ps_closepath_stroke","function.ps-closepath-stroke","refentry"],["ps_closepath","function.ps-closepath","refentry"],["ps_continue_text","function.ps-continue-text","refentry"],["ps_curveto","function.ps-curveto","refentry"],["ps_delete","function.ps-delete","refentry"],["ps_end_page","function.ps-end-page","refentry"],["ps_end_pattern","function.ps-end-pattern","refentry"],["ps_end_template","function.ps-end-template","refentry"],["ps_fill_stroke","function.ps-fill-stroke","refentry"],["ps_fill","function.ps-fill","refentry"],["ps_findfont","function.ps-findfont","refentry"],["ps_get_buffer","function.ps-get-buffer","refentry"],["ps_get_parameter","function.ps-get-parameter","refentry"],["ps_get_value","function.ps-get-value","refentry"],["","function.ps-hyphenate","example"],["ps_hyphenate","function.ps-hyphenate","refentry"],["ps_include_file","function.ps-include-file","refentry"],["","function.ps-lineto","example"],["ps_lineto","function.ps-lineto","refentry"],["","function.ps-makespotcolor","example"],["ps_makespotcolor","function.ps-makespotcolor","refentry"],["ps_moveto","function.ps-moveto","refentry"],["ps_new","function.ps-new","refentry"],["ps_open_file","function.ps-open-file","refentry"],["ps_open_image_file","function.ps-open-image-file","refentry"],["ps_open_image","function.ps-open-image","refentry"],["ps_open_memory_image","function.ps-open-memory-image","refentry"],["ps_place_image","function.ps-place-image","refentry"],["ps_rect","function.ps-rect","refentry"],["ps_restore","function.ps-restore","refentry"],["","function.ps-rotate","example"],["ps_rotate","function.ps-rotate","refentry"],["ps_save","function.ps-save","refentry"],["ps_scale","function.ps-scale","refentry"],["ps_set_border_color","function.ps-set-border-color","refentry"],["ps_set_border_dash","function.ps-set-border-dash","refentry"],["ps_set_border_style","function.ps-set-border-style","refentry"],["ps_set_info","function.ps-set-info","refentry"],["ps_set_parameter","function.ps-set-parameter","refentry"],["","function.ps-set-text-pos","example"],["ps_set_text_pos","function.ps-set-text-pos","refentry"],["ps_set_value","function.ps-set-value","refentry"],["ps_setcolor","function.ps-setcolor","refentry"],["ps_setdash","function.ps-setdash","refentry"],["ps_setflat","function.ps-setflat","refentry"],["ps_setfont","function.ps-setfont","refentry"],["ps_setgray","function.ps-setgray","refentry"],["ps_setlinecap","function.ps-setlinecap","refentry"],["ps_setlinejoin","function.ps-setlinejoin","refentry"],["ps_setlinewidth","function.ps-setlinewidth","refentry"],["ps_setmiterlimit","function.ps-setmiterlimit","refentry"],["ps_setoverprintmode","function.ps-setoverprintmode","refentry"],["","function.ps-setpolydash","example"],["ps_setpolydash","function.ps-setpolydash","refentry"],["ps_shading_pattern","function.ps-shading-pattern","refentry"],["ps_shading","function.ps-shading","refentry"],["ps_shfill","function.ps-shfill","refentry"],["ps_show_boxed","function.ps-show-boxed","refentry"],["ps_show_xy2","function.ps-show-xy2","refentry"],["ps_show_xy","function.ps-show-xy","refentry"],["ps_show2","function.ps-show2","refentry"],["ps_show","function.ps-show","refentry"],["ps_string_geometry","function.ps-string-geometry","refentry"],["ps_stringwidth","function.ps-stringwidth","refentry"],["ps_stroke","function.ps-stroke","refentry"],["ps_symbol_name","function.ps-symbol-name","refentry"],["ps_symbol_width","function.ps-symbol-width","refentry"],["ps_symbol","function.ps-symbol","refentry"],["","function.ps-translate","example"],["ps_translate","function.ps-translate","refentry"],["","ref.ps","reference"],["PS","book.ps","book"],["","intro.rpmreader","preface"],["","rpmreader.requirements","section"],["","rpmreader.installation","section"],["","rpmreader.configuration","section"],["","rpmreader.resources","section"],["","rpmreader.setup","chapter"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","varlistentry"],["","rpmreader.constants","appendix"],["","rpmreader.examples-basic","example"],["","rpmreader.examples-basic","section"],["","rpmreader.examples","chapter"],["","function.rpm-close","example"],["rpm_close","function.rpm-close","refentry"],["","function.rpm-get-tag","example"],["rpm_get_tag","function.rpm-get-tag","refentry"],["","function.rpm-is-valid","example"],["rpm_is_valid","function.rpm-is-valid","refentry"],["","function.rpm-open","example"],["rpm_open","function.rpm-open","refentry"],["","function.rpm-version","example"],["rpm_version","function.rpm-version","refentry"],["","ref.rpmreader","reference"],["RPM Reader","book.rpmreader","book"],["","intro.swf","preface"],["","swf.requirements","section"],["","swf.installation","section"],["","swf.configuration","section"],["","swf.resources","section"],["","swf.setup","chapter"],["","swf.constants","varlistentry"],["","swf.constants","varlistentry"],["","swf.constants","varlistentry"],["","swf.constants","varlistentry"],["","swf.constants","varlistentry"],["","swf.constants","varlistentry"],["","swf.constants","varlistentry"],["","swf.constants","varlistentry"],["","swf.constants","varlistentry"],["","swf.constants","varlistentry"],["","swf.constants","varlistentry"],["","swf.constants","varlistentry"],["","swf.constants","varlistentry"],["","swf.constants","varlistentry"],["","swf.constants","varlistentry"],["","swf.constants","varlistentry"],["","swf.constants","varlistentry"],["","swf.constants","varlistentry"],["","swf.constants","varlistentry"],["","swf.constants","varlistentry"],["","swf.constants","appendix"],["","swf.examples-basic","example"],["","swf.examples-basic","section"],["","swf.examples","chapter"],["swf_actiongeturl","function.swf-actiongeturl","refentry"],["swf_actiongotoframe","function.swf-actiongotoframe","refentry"],["swf_actiongotolabel","function.swf-actiongotolabel","refentry"],["swf_actionnextframe","function.swf-actionnextframe","refentry"],["swf_actionplay","function.swf-actionplay","refentry"],["swf_actionprevframe","function.swf-actionprevframe","refentry"],["swf_actionsettarget","function.swf-actionsettarget","refentry"],["swf_actionstop","function.swf-actionstop","refentry"],["swf_actiontogglequality","function.swf-actiontogglequality","refentry"],["swf_actionwaitforframe","function.swf-actionwaitforframe","refentry"],["","function.swf-addbuttonrecord","example"],["swf_addbuttonrecord","function.swf-addbuttonrecord","refentry"],["swf_addcolor","function.swf-addcolor","refentry"],["","function.swf-closefile","example"],["swf_closefile","function.swf-closefile","refentry"],["swf_definebitmap","function.swf-definebitmap","refentry"],["swf_definefont","function.swf-definefont","refentry"],["swf_defineline","function.swf-defineline","refentry"],["swf_definepoly","function.swf-definepoly","refentry"],["swf_definerect","function.swf-definerect","refentry"],["","function.swf-definetext","example"],["swf_definetext","function.swf-definetext","refentry"],["swf_endbutton","function.swf-endbutton","refentry"],["swf_enddoaction","function.swf-enddoaction","refentry"],["swf_endshape","function.swf-endshape","refentry"],["swf_endsymbol","function.swf-endsymbol","refentry"],["swf_fontsize","function.swf-fontsize","refentry"],["swf_fontslant","function.swf-fontslant","refentry"],["swf_fonttracking","function.swf-fonttracking","refentry"],["swf_getbitmapinfo","function.swf-getbitmapinfo","refentry"],["swf_getfontinfo","function.swf-getfontinfo","refentry"],["swf_getframe","function.swf-getframe","refentry"],["swf_labelframe","function.swf-labelframe","refentry"],["","function.swf-lookat","example"],["swf_lookat","function.swf-lookat","refentry"],["swf_modifyobject","function.swf-modifyobject","refentry"],["swf_mulcolor","function.swf-mulcolor","refentry"],["swf_nextid","function.swf-nextid","refentry"],["swf_oncondition","function.swf-oncondition","refentry"],["swf_openfile","function.swf-openfile","refentry"],["swf_ortho2","function.swf-ortho2","refentry"],["swf_ortho","function.swf-ortho","refentry"],["swf_perspective","function.swf-perspective","refentry"],["swf_placeobject","function.swf-placeobject","refentry"],["swf_polarview","function.swf-polarview","refentry"],["swf_popmatrix","function.swf-popmatrix","refentry"],["swf_posround","function.swf-posround","refentry"],["swf_pushmatrix","function.swf-pushmatrix","refentry"],["swf_removeobject","function.swf-removeobject","refentry"],["swf_rotate","function.swf-rotate","refentry"],["swf_scale","function.swf-scale","refentry"],["swf_setfont","function.swf-setfont","refentry"],["swf_setframe","function.swf-setframe","refentry"],["swf_shapearc","function.swf-shapearc","refentry"],["swf_shapecurveto3","function.swf-shapecurveto3","refentry"],["swf_shapecurveto","function.swf-shapecurveto","refentry"],["swf_shapefillbitmapclip","function.swf-shapefillbitmapclip","refentry"],["swf_shapefillbitmaptile","function.swf-shapefillbitmaptile","refentry"],["swf_shapefilloff","function.swf-shapefilloff","refentry"],["swf_shapefillsolid","function.swf-shapefillsolid","refentry"],["swf_shapelinesolid","function.swf-shapelinesolid","refentry"],["swf_shapelineto","function.swf-shapelineto","refentry"],["swf_shapemoveto","function.swf-shapemoveto","refentry"],["swf_showframe","function.swf-showframe","refentry"],["swf_startbutton","function.swf-startbutton","refentry"],["swf_startdoaction","function.swf-startdoaction","refentry"],["swf_startshape","function.swf-startshape","refentry"],["swf_startsymbol","function.swf-startsymbol","refentry"],["swf_textwidth","function.swf-textwidth","refentry"],["swf_translate","function.swf-translate","refentry"],["swf_viewport","function.swf-viewport","refentry"],["","ref.swf","reference"],["SWF","book.swf","book"],["","refs.utilspec.nontext","set"],["","intro.eio","example"],["","intro.eio","example"],["","intro.eio","example"],["","intro.eio","example"],["","intro.eio","preface"],["","eio.requirements","section"],["","eio.installation","section"],["","eio.configuration","section"],["","eio.resources","section"],["","eio.setup","chapter"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","varlistentry"],["","eio.constants","appendix"],["","eio.examples","example"],["","eio.examples","example"],["","eio.examples","example"],["","eio.examples","example"],["","eio.examples","example"],["","eio.examples","chapter"],["eio_busy","function.eio-busy","refentry"],["","function.eio-cancel","example"],["eio_cancel","function.eio-cancel","refentry"],["eio_chmod","function.eio-chmod","refentry"],["eio_chown","function.eio-chown","refentry"],["eio_close","function.eio-close","refentry"],["","function.eio-custom","example"],["eio_custom","function.eio-custom","refentry"],["eio_dup2","function.eio-dup2","refentry"],["","function.eio-event-loop","example"],["eio_event_loop","function.eio-event-loop","refentry"],["eio_fallocate","function.eio-fallocate","refentry"],["eio_fchmod","function.eio-fchmod","refentry"],["eio_fchown","function.eio-fchown","refentry"],["eio_fdatasync","function.eio-fdatasync","refentry"],["","function.eio-fstat","example"],["eio_fstat","function.eio-fstat","refentry"],["eio_fstatvfs","function.eio-fstatvfs","refentry"],["eio_fsync","function.eio-fsync","refentry"],["eio_ftruncate","function.eio-ftruncate","refentry"],["eio_futime","function.eio-futime","refentry"],["","function.eio-get-event-stream","example"],["eio_get_event_stream","function.eio-get-event-stream","refentry"],["eio_get_last_error","function.eio-get-last-error","refentry"],["","function.eio-grp-add","example"],["eio_grp_add","function.eio-grp-add","refentry"],["eio_grp_cancel","function.eio-grp-cancel","refentry"],["eio_grp_limit","function.eio-grp-limit","refentry"],["","function.eio-grp","example"],["eio_grp","function.eio-grp","refentry"],["eio_init","function.eio-init","refentry"],["","function.eio-link","example"],["eio_link","function.eio-link","refentry"],["","function.eio-lstat","example"],["eio_lstat","function.eio-lstat","refentry"],["","function.eio-mkdir","example"],["eio_mkdir","function.eio-mkdir","refentry"],["","function.eio-mknod","example"],["eio_mknod","function.eio-mknod","refentry"],["eio_nop","function.eio-nop","refentry"],["eio_npending","function.eio-npending","refentry"],["eio_nready","function.eio-nready","refentry"],["","function.eio-nreqs","example"],["eio_nreqs","function.eio-nreqs","refentry"],["eio_nthreads","function.eio-nthreads","refentry"],["","function.eio-open","example"],["eio_open","function.eio-open","refentry"],["","function.eio-poll","example"],["eio_poll","function.eio-poll","refentry"],["","function.eio-read","example"],["eio_read","function.eio-read","refentry"],["eio_readahead","function.eio-readahead","refentry"],["","function.eio-readdir","example"],["eio_readdir","function.eio-readdir","refentry"],["","function.eio-readlink","example"],["eio_readlink","function.eio-readlink","refentry"],["","function.eio-realpath","example"],["eio_realpath","function.eio-realpath","refentry"],["","function.eio-rename","example"],["eio_rename","function.eio-rename","refentry"],["","function.eio-rmdir","example"],["eio_rmdir","function.eio-rmdir","refentry"],["eio_seek","function.eio-seek","refentry"],["eio_sendfile","function.eio-sendfile","refentry"],["eio_set_max_idle","function.eio-set-max-idle","refentry"],["eio_set_max_parallel","function.eio-set-max-parallel","refentry"],["eio_set_max_poll_reqs","function.eio-set-max-poll-reqs","refentry"],["eio_set_max_poll_time","function.eio-set-max-poll-time","refentry"],["eio_set_min_parallel","function.eio-set-min-parallel","refentry"],["","function.eio-stat","example"],["eio_stat","function.eio-stat","refentry"],["","function.eio-statvfs","example"],["eio_statvfs","function.eio-statvfs","refentry"],["","function.eio-symlink","example"],["eio_symlink","function.eio-symlink","refentry"],["eio_sync_file_range","function.eio-sync-file-range","refentry"],["eio_sync","function.eio-sync","refentry"],["eio_syncfs","function.eio-syncfs","refentry"],["eio_truncate","function.eio-truncate","refentry"],["eio_unlink","function.eio-unlink","refentry"],["eio_utime","function.eio-utime","refentry"],["eio_write","function.eio-write","refentry"],["","ref.eio","reference"],["Eio","book.eio","book"],["","intro.ev","preface"],["","ev.requirements","section"],["","ev.installation","section"],["","ev.configuration","section"],["","ev.resources","section"],["","ev.setup","chapter"],["","ev.global.constants","appendix"],["","ev.examples","example"],["","ev.examples","example"],["","ev.examples","example"],["","ev.examples","example"],["","ev.examples","example"],["","ev.examples","example"],["","ev.examples","example"],["","ev.examples","example"],["","ev.examples","example"],["","ev.examples","example"],["","ev.examples","example"],["","ev.examples","example"],["","ev.examples","chapter"],["","ev.watchers","chapter"],["","ev.watcher-callbacks","chapter"],["","ev.periodic-modes","example"],["","ev.periodic-modes","chapter"],["","class.ev","section"],["","class.ev","section"],["","class.ev","varlistentry"],["","class.ev","varlistentry"],["","class.ev","varlistentry"],["","class.ev","varlistentry"],["","class.ev","varlistentry"],["","class.ev","varlistentry"],["","class.ev","para"],["","class.ev","varlistentry"],["","class.ev","varlistentry"],["","class.ev","para"],["","class.ev","varlistentry"],["","class.ev","varlistentry"],["","class.ev","varlistentry"],["","class.ev","para"],["","class.ev","varlistentry"],["","class.ev","varlistentry"],["","class.ev","para"],["","class.ev","varlistentry"],["","class.ev","varlistentry"],["","class.ev","varlistentry"],["","class.ev","varlistentry"],["","class.ev","varlistentry"],["","class.ev","varlistentry"],["","class.ev","varlistentry"],["","class.ev","varlistentry"],["","class.ev","varlistentry"],["","class.ev","varlistentry"],["","class.ev","varlistentry"],["","class.ev","varlistentry"],["","class.ev","varlistentry"],["","class.ev","para"],["","class.ev","varlistentry"],["","class.ev","varlistentry"],["","class.ev","varlistentry"],["","class.ev","varlistentry"],["","class.ev","varlistentry"],["","class.ev","varlistentry"],["","class.ev","varlistentry"],["","class.ev","varlistentry"],["","class.ev","para"],["","class.ev","section"],["Ev::backend","ev.backend","refentry"],["Ev::depth","ev.depth","refentry"],["","ev.embeddablebackends","example"],["Ev::embeddableBackends","ev.embeddablebackends","refentry"],["Ev::feedSignal","ev.feedsignal","refentry"],["Ev::feedSignalEvent","ev.feedsignalevent","refentry"],["Ev::iteration","ev.iteration","refentry"],["Ev::now","ev.now","refentry"],["Ev::nowUpdate","ev.nowupdate","refentry"],["","ev.recommendedbackends","example"],["Ev::recommendedBackends","ev.recommendedbackends","refentry"],["Ev::resume","ev.resume","refentry"],["Ev::run","ev.run","refentry"],["Ev::sleep","ev.sleep","refentry"],["Ev::stop","ev.stop","refentry"],["","ev.supportedbackends","example"],["Ev::supportedBackends","ev.supportedbackends","refentry"],["Ev::suspend","ev.suspend","refentry"],["Ev::time","ev.time","refentry"],["Ev::verify","ev.verify","refentry"],["Ev","class.ev","phpdoc:classref"],["","class.evcheck","section"],["","class.evcheck","section"],["EvCheck::__construct","evcheck.construct","refentry"],["EvCheck::createStopped","evcheck.createstopped","refentry"],["EvCheck","class.evcheck","phpdoc:classref"],["","class.evchild","section"],["","class.evchild","section"],["","class.evchild","varlistentry"],["","class.evchild","varlistentry"],["","class.evchild","varlistentry"],["","class.evchild","section"],["EvChild::__construct","evchild.construct","refentry"],["EvChild::createStopped","evchild.createstopped","refentry"],["EvChild::set","evchild.set","refentry"],["EvChild","class.evchild","phpdoc:classref"],["","class.evembed","section"],["","class.evembed","section"],["","class.evembed","varlistentry"],["","class.evembed","varlistentry"],["","class.evembed","varlistentry"],["","class.evembed","varlistentry"],["","class.evembed","varlistentry"],["","class.evembed","section"],["","evembed.construct","example"],["EvEmbed::__construct","evembed.construct","refentry"],["EvEmbed::createStopped","evembed.createstopped","refentry"],["EvEmbed::set","evembed.set","refentry"],["EvEmbed::sweep","evembed.sweep","refentry"],["EvEmbed","class.evembed","phpdoc:classref"],["","class.evfork","section"],["","class.evfork","section"],["EvFork::__construct","evfork.construct","refentry"],["EvFork::createStopped","evfork.createstopped","refentry"],["EvFork","class.evfork","phpdoc:classref"],["","class.evidle","section"],["","class.evidle","section"],["EvIdle::__construct","evidle.construct","refentry"],["EvIdle::createStopped","evidle.createstopped","refentry"],["EvIdle","class.evidle","phpdoc:classref"],["","class.evio","section"],["","class.evio","section"],["","class.evio","varlistentry"],["","class.evio","varlistentry"],["","class.evio","section"],["EvIo::__construct","evio.construct","refentry"],["EvIo::createStopped","evio.createstopped","refentry"],["EvIo::set","evio.set","refentry"],["EvIo","class.evio","phpdoc:classref"],["","class.evloop","section"],["","class.evloop","section"],["","class.evloop","varlistentry"],["","class.evloop","varlistentry"],["","class.evloop","varlistentry"],["","class.evloop","varlistentry"],["","class.evloop","varlistentry"],["","class.evloop","varlistentry"],["","class.evloop","varlistentry"],["","class.evloop","varlistentry"],["","class.evloop","section"],["EvLoop::backend","evloop.backend","refentry"],["EvLoop::check","evloop.check","refentry"],["EvLoop::child","evloop.child","refentry"],["EvLoop::__construct","evloop.construct","refentry"],["EvLoop::defaultLoop","evloop.defaultloop","refentry"],["EvLoop::embed","evloop.embed","refentry"],["EvLoop::fork","evloop.fork","refentry"],["EvLoop::idle","evloop.idle","refentry"],["EvLoop::invokePending","evloop.invokepending","refentry"],["EvLoop::io","evloop.io","refentry"],["EvLoop::loopFork","evloop.loopfork","refentry"],["EvLoop::now","evloop.now","refentry"],["EvLoop::nowUpdate","evloop.nowupdate","refentry"],["EvLoop::periodic","evloop.periodic","refentry"],["EvLoop::prepare","evloop.prepare","refentry"],["EvLoop::resume","evloop.resume","refentry"],["EvLoop::run","evloop.run","refentry"],["EvLoop::signal","evloop.signal","refentry"],["EvLoop::stat","evloop.stat","refentry"],["EvLoop::stop","evloop.stop","refentry"],["EvLoop::suspend","evloop.suspend","refentry"],["EvLoop::timer","evloop.timer","refentry"],["EvLoop::verify","evloop.verify","refentry"],["EvLoop","class.evloop","phpdoc:classref"],["","class.evperiodic","section"],["","class.evperiodic","section"],["","class.evperiodic","varlistentry"],["","class.evperiodic","varlistentry"],["","class.evperiodic","section"],["EvPeriodic::again","evperiodic.again","refentry"],["EvPeriodic::at","evperiodic.at","refentry"],["","evperiodic.construct","example"],["","evperiodic.construct","example"],["","evperiodic.construct","example"],["EvPeriodic::__construct","evperiodic.construct","refentry"],["EvPeriodic::createStopped","evperiodic.createstopped","refentry"],["EvPeriodic::set","evperiodic.set","refentry"],["EvPeriodic","class.evperiodic","phpdoc:classref"],["","class.evprepare","section"],["","class.evprepare","section"],["EvPrepare::__construct","evprepare.construct","refentry"],["EvPrepare::createStopped","evprepare.createstopped","refentry"],["EvPrepare","class.evprepare","phpdoc:classref"],["","class.evsignal","section"],["","class.evsignal","section"],["","class.evsignal","varlistentry"],["","class.evsignal","section"],["","evsignal.construct","example"],["EvSignal::__construct","evsignal.construct","refentry"],["EvSignal::createStopped","evsignal.createstopped","refentry"],["EvSignal::set","evsignal.set","refentry"],["EvSignal","class.evsignal","phpdoc:classref"],["","class.evstat","section"],["","class.evstat","section"],["","class.evstat","varlistentry"],["","class.evstat","varlistentry"],["","class.evstat","section"],["","evstat.attr","example"],["EvStat::attr","evstat.attr","refentry"],["","evstat.construct","example"],["EvStat::__construct","evstat.construct","refentry"],["EvStat::createStopped","evstat.createstopped","refentry"],["EvStat::prev","evstat.prev","refentry"],["EvStat::set","evstat.set","refentry"],["EvStat::stat","evstat.stat","refentry"],["EvStat","class.evstat","phpdoc:classref"],["","class.evtimer","section"],["","class.evtimer","section"],["","class.evtimer","varlistentry"],["","class.evtimer","varlistentry"],["","class.evtimer","section"],["EvTimer::again","evtimer.again","refentry"],["","evtimer.construct","example"],["EvTimer::__construct","evtimer.construct","refentry"],["","evtimer.createstopped","example"],["EvTimer::createStopped","evtimer.createstopped","refentry"],["EvTimer::set","evtimer.set","refentry"],["EvTimer","class.evtimer","phpdoc:classref"],["","class.evwatcher","section"],["","class.evwatcher","section"],["","class.evwatcher","varlistentry"],["","class.evwatcher","varlistentry"],["","class.evwatcher","varlistentry"],["","class.evwatcher","varlistentry"],["","class.evwatcher","section"],["EvWatcher::clear","evwatcher.clear","refentry"],["EvWatcher::__construct","evwatcher.construct","refentry"],["EvWatcher::feed","evwatcher.feed","refentry"],["EvWatcher::getLoop","evwatcher.getloop","refentry"],["EvWatcher::invoke","evwatcher.invoke","refentry"],["","evwatcher.keepalive","example"],["EvWatcher::keepalive","evwatcher.keepalive","refentry"],["EvWatcher::setCallback","evwatcher.setcallback","refentry"],["EvWatcher::start","evwatcher.start","refentry"],["EvWatcher::stop","evwatcher.stop","refentry"],["EvWatcher","class.evwatcher","phpdoc:classref"],["Ev","book.ev","book"],["","intro.expect","preface"],["","expect.requirements","section"],["","expect.installation","section"],["","expect.configuration","varlistentry"],["","expect.configuration","varlistentry"],["","expect.configuration","varlistentry"],["","expect.configuration","varlistentry"],["","expect.configuration","section"],["","expect.resources","section"],["","expect.setup","chapter"],["","expect.constants","varlistentry"],["","expect.constants","varlistentry"],["","expect.constants","varlistentry"],["","expect.constants","varlistentry"],["","expect.constants","varlistentry"],["","expect.constants","varlistentry"],["","expect.constants","appendix"],["","expect.examples-usage","example"],["","expect.examples-usage","example"],["","expect.examples-usage","section"],["","expect.examples","chapter"],["","function.expect-expectl","example"],["expect_expectl","function.expect-expectl","refentry"],["","function.expect-popen","example"],["expect_popen","function.expect-popen","refentry"],["","ref.expect","reference"],["","book.expect","book"],["","intro.libevent","preface"],["","libevent.requirements","section"],["","libevent.installation","section"],["","libevent.configuration","section"],["","libevent.resources","section"],["","libevent.setup","chapter"],["","libevent.constants","varlistentry"],["","libevent.constants","varlistentry"],["","libevent.constants","varlistentry"],["","libevent.constants","varlistentry"],["","libevent.constants","varlistentry"],["","libevent.constants","varlistentry"],["","libevent.constants","varlistentry"],["","libevent.constants","appendix"],["","libevent.examples","example"],["","libevent.examples","example"],["","libevent.examples","chapter"],["event_add","function.event-add","refentry"],["event_base_free","function.event-base-free","refentry"],["event_base_loop","function.event-base-loop","refentry"],["event_base_loopbreak","function.event-base-loopbreak","refentry"],["event_base_loopexit","function.event-base-loopexit","refentry"],["event_base_new","function.event-base-new","refentry"],["event_base_priority_init","function.event-base-priority-init","refentry"],["event_base_set","function.event-base-set","refentry"],["event_buffer_base_set","function.event-buffer-base-set","refentry"],["event_buffer_disable","function.event-buffer-disable","refentry"],["event_buffer_enable","function.event-buffer-enable","refentry"],["event_buffer_fd_set","function.event-buffer-fd-set","refentry"],["event_buffer_free","function.event-buffer-free","refentry"],["event_buffer_new","function.event-buffer-new","refentry"],["event_buffer_priority_set","function.event-buffer-priority-set","refentry"],["event_buffer_read","function.event-buffer-read","refentry"],["event_buffer_set_callback","function.event-buffer-set-callback","refentry"],["event_buffer_timeout_set","function.event-buffer-timeout-set","refentry"],["event_buffer_watermark_set","function.event-buffer-watermark-set","refentry"],["event_buffer_write","function.event-buffer-write","refentry"],["event_del","function.event-del","refentry"],["event_free","function.event-free","refentry"],["event_new","function.event-new","refentry"],["event_set","function.event-set","refentry"],["","ref.libevent","reference"],["Libevent","book.libevent","book"],["","intro.pcntl","preface"],["","pcntl.requirements","section"],["","pcntl.installation","section"],["","pcntl.configuration","section"],["","pcntl.resources","section"],["","pcntl.setup","chapter"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","varlistentry"],["","pcntl.constants","appendix"],["","pcntl.example","example"],["","pcntl.example","section"],["","pcntl.examples","chapter"],["","ref.pcntl","partintro"],["pcntl_alarm","function.pcntl-alarm","refentry"],["pcntl_errno","function.pcntl-errno","refentry"],["pcntl_exec","function.pcntl-exec","refentry"],["","function.pcntl-fork","example"],["pcntl_fork","function.pcntl-fork","refentry"],["pcntl_get_last_error","function.pcntl-get-last-error","refentry"],["pcntl_getpriority","function.pcntl-getpriority","refentry"],["pcntl_setpriority","function.pcntl-setpriority","refentry"],["","function.pcntl-signal-dispatch","example"],["pcntl_signal_dispatch","function.pcntl-signal-dispatch","refentry"],["","function.pcntl-signal","example"],["pcntl_signal","function.pcntl-signal","refentry"],["","function.pcntl-sigprocmask","example"],["pcntl_sigprocmask","function.pcntl-sigprocmask","refentry"],["pcntl_sigtimedwait","function.pcntl-sigtimedwait","refentry"],["","function.pcntl-sigwaitinfo","example"],["pcntl_sigwaitinfo","function.pcntl-sigwaitinfo","refentry"],["pcntl_strerror","function.pcntl-strerror","refentry"],["pcntl_wait","function.pcntl-wait","refentry"],["pcntl_waitpid","function.pcntl-waitpid","refentry"],["pcntl_wexitstatus","function.pcntl-wexitstatus","refentry"],["pcntl_wifexited","function.pcntl-wifexited","refentry"],["pcntl_wifsignaled","function.pcntl-wifsignaled","refentry"],["pcntl_wifstopped","function.pcntl-wifstopped","refentry"],["pcntl_wstopsig","function.pcntl-wstopsig","refentry"],["pcntl_wtermsig","function.pcntl-wtermsig","refentry"],["","ref.pcntl","reference"],["PCNTL","book.pcntl","book"],["","intro.posix","preface"],["","posix.requirements","section"],["","posix.installation","section"],["","posix.configuration","section"],["","posix.resources","section"],["","posix.setup","chapter"],["","posix.constants","varlistentry"],["","posix.constants","varlistentry"],["","posix.constants","varlistentry"],["","posix.constants","varlistentry"],["","posix.constants","varlistentry"],["","posix.constants","varlistentry"],["","posix.constants","varlistentry"],["","posix.constants","varlistentry"],["","posix.constants","varlistentry"],["","posix.constants","appendix"],["","ref.posix","partintro"],["","function.posix-access","example"],["posix_access","function.posix-access","refentry"],["","function.posix-ctermid","example"],["posix_ctermid","function.posix-ctermid","refentry"],["posix_errno","function.posix-errno","refentry"],["","function.posix-get-last-error","example"],["posix_get_last_error","function.posix-get-last-error","refentry"],["","function.posix-getcwd","example"],["posix_getcwd","function.posix-getcwd","refentry"],["","function.posix-getegid","example"],["posix_getegid","function.posix-getegid","refentry"],["","function.posix-geteuid","example"],["posix_geteuid","function.posix-geteuid","refentry"],["","function.posix-getgid","example"],["posix_getgid","function.posix-getgid","refentry"],["","function.posix-getgrgid","example"],["posix_getgrgid","function.posix-getgrgid","refentry"],["","function.posix-getgrnam","example"],["posix_getgrnam","function.posix-getgrnam","refentry"],["","function.posix-getgroups","example"],["posix_getgroups","function.posix-getgroups","refentry"],["","function.posix-getlogin","example"],["posix_getlogin","function.posix-getlogin","refentry"],["","function.posix-getpgid","example"],["posix_getpgid","function.posix-getpgid","refentry"],["posix_getpgrp","function.posix-getpgrp","refentry"],["","function.posix-getpid","example"],["posix_getpid","function.posix-getpid","refentry"],["","function.posix-getppid","example"],["posix_getppid","function.posix-getppid","refentry"],["","function.posix-getpwnam","example"],["posix_getpwnam","function.posix-getpwnam","refentry"],["","function.posix-getpwuid","example"],["posix_getpwuid","function.posix-getpwuid","refentry"],["","function.posix-getrlimit","example"],["posix_getrlimit","function.posix-getrlimit","refentry"],["","function.posix-getsid","example"],["posix_getsid","function.posix-getsid","refentry"],["","function.posix-getuid","example"],["posix_getuid","function.posix-getuid","refentry"],["posix_initgroups","function.posix-initgroups","refentry"],["posix_isatty","function.posix-isatty","refentry"],["posix_kill","function.posix-kill","refentry"],["posix_mkfifo","function.posix-mkfifo","refentry"],["","function.posix-mknod","example"],["posix_mknod","function.posix-mknod","refentry"],["","function.posix-setegid","example"],["posix_setegid","function.posix-setegid","refentry"],["posix_seteuid","function.posix-seteuid","refentry"],["","function.posix-setgid","example"],["posix_setgid","function.posix-setgid","refentry"],["posix_setpgid","function.posix-setpgid","refentry"],["posix_setsid","function.posix-setsid","refentry"],["","function.posix-setuid","example"],["posix_setuid","function.posix-setuid","refentry"],["","function.posix-strerror","example"],["posix_strerror","function.posix-strerror","refentry"],["","function.posix-times","example"],["posix_times","function.posix-times","refentry"],["posix_ttyname","function.posix-ttyname","refentry"],["","function.posix-uname","example"],["posix_uname","function.posix-uname","refentry"],["","ref.posix","reference"],["","book.posix","book"],["","intro.exec","preface"],["","exec.requirements","section"],["","exec.installation","section"],["","exec.configuration","section"],["","exec.resources","section"],["","exec.setup","chapter"],["","exec.constants","appendix"],["","ref.exec","section"],["","ref.exec","section"],["","function.escapeshellarg","example"],["escapeshellarg","function.escapeshellarg","refentry"],["","function.escapeshellcmd","example"],["escapeshellcmd","function.escapeshellcmd","refentry"],["","function.exec","example"],["exec","function.exec","refentry"],["passthru","function.passthru","refentry"],["proc_close","function.proc-close","refentry"],["proc_get_status","function.proc-get-status","refentry"],["proc_nice","function.proc-nice","refentry"],["","function.proc-open","example"],["proc_open","function.proc-open","refentry"],["proc_terminate","function.proc-terminate","refentry"],["","function.shell-exec","example"],["shell_exec","function.shell-exec","refentry"],["","function.system","example"],["system","function.system","refentry"],["","ref.exec","reference"],["Program execution","book.exec","book"],["","intro.pthreads","preface"],["","pthreads.requirements","section"],["","pthreads.installation","section"],["","pthreads.configuration","section"],["","pthreads.resources","section"],["","pthreads.setup","chapter"],["","pthreads.constants","varlistentry"],["","pthreads.constants","varlistentry"],["","pthreads.constants","varlistentry"],["","pthreads.constants","varlistentry"],["","pthreads.constants","varlistentry"],["","pthreads.constants","varlistentry"],["","pthreads.constants","varlistentry"],["","pthreads.constants","appendix"],["","class.thread","section"],["","class.thread","section"],["Thread::chunk","thread.chunk","refentry"],["","thread.getcreatorid","example"],["Thread::getCreatorId","thread.getcreatorid","refentry"],["","thread.getthreadid","example"],["Thread::getThreadId","thread.getthreadid","refentry"],["","thread.isjoined","example"],["Thread::isJoined","thread.isjoined","refentry"],["","thread.isrunning","example"],["Thread::isRunning","thread.isrunning","refentry"],["","thread.isstarted","example"],["Thread::isStarted","thread.isstarted","refentry"],["","thread.isterminated","example"],["Thread::isTerminated","thread.isterminated","refentry"],["","thread.iswaiting","example"],["Thread::isWaiting","thread.iswaiting","refentry"],["","thread.join","example"],["Thread::join","thread.join","refentry"],["","thread.lock","example"],["Thread::lock","thread.lock","refentry"],["Thread::merge","thread.merge","refentry"],["","thread.notify","example"],["Thread::notify","thread.notify","refentry"],["Thread::pop","thread.pop","refentry"],["Thread::run","thread.run","refentry"],["Thread::shift","thread.shift","refentry"],["","thread.start","example"],["Thread::start","thread.start","refentry"],["","thread.synchronized","example"],["Thread::synchronized","thread.synchronized","refentry"],["","thread.unlock","example"],["Thread::unlock","thread.unlock","refentry"],["","thread.wait","example"],["Thread::wait","thread.wait","refentry"],["Thread","class.thread","phpdoc:classref"],["","class.worker","section"],["","class.worker","section"],["Worker::chunk","worker.chunk","refentry"],["","worker.getcreatorid","example"],["Worker::getCreatorId","worker.getcreatorid","refentry"],["","worker.getstacked","example"],["Worker::getStacked","worker.getstacked","refentry"],["","worker.getthreadid","example"],["Worker::getThreadId","worker.getthreadid","refentry"],["","worker.isshutdown","example"],["Worker::isShutdown","worker.isshutdown","refentry"],["","worker.isworking","example"],["Worker::isWorking","worker.isworking","refentry"],["Worker::merge","worker.merge","refentry"],["Worker::pop","worker.pop","refentry"],["Worker::run","worker.run","refentry"],["Worker::shift","worker.shift","refentry"],["","worker.shutdown","example"],["Worker::shutdown","worker.shutdown","refentry"],["","worker.stack","example"],["Worker::stack","worker.stack","refentry"],["","worker.start","example"],["Worker::start","worker.start","refentry"],["","worker.unstack","example"],["Worker::unstack","worker.unstack","refentry"],["Worker","class.worker","phpdoc:classref"],["","class.stackable","section"],["","class.stackable","section"],["Stackable::chunk","stackable.chunk","refentry"],["","stackable.isrunning","example"],["Stackable::isRunning","stackable.isrunning","refentry"],["","stackable.isterminated","example"],["Stackable::isTerminated","stackable.isterminated","refentry"],["","stackable.iswaiting","example"],["Stackable::isWaiting","stackable.iswaiting","refentry"],["Stackable::lock","stackable.lock","refentry"],["Stackable::merge","stackable.merge","refentry"],["Stackable::notify","stackable.notify","refentry"],["Stackable::pop","stackable.pop","refentry"],["Stackable::run","stackable.run","refentry"],["Stackable::shift","stackable.shift","refentry"],["","stackable.synchronized","example"],["Stackable::synchronized","stackable.synchronized","refentry"],["","stackable.unlock","example"],["Stackable::unlock","stackable.unlock","refentry"],["","stackable.wait","example"],["Stackable::wait","stackable.wait","refentry"],["Stackable","class.stackable","phpdoc:classref"],["","pthreads.modifiers","example"],["","pthreads.modifiers","example"],["Modifiers","pthreads.modifiers","chapter"],["","class.mutex","section"],["","class.mutex","section"],["","mutex.create","example"],["Mutex::create","mutex.create","refentry"],["","mutex.destroy","example"],["Mutex::destroy","mutex.destroy","refentry"],["","mutex.lock","example"],["Mutex::lock","mutex.lock","refentry"],["","mutex.trylock","example"],["Mutex::trylock","mutex.trylock","refentry"],["","mutex.unlock","example"],["Mutex::unlock","mutex.unlock","refentry"],["Mutex","class.mutex","phpdoc:classref"],["","class.cond","section"],["","class.cond","section"],["","cond.broadcast","example"],["Cond::broadcast","cond.broadcast","refentry"],["","cond.create","example"],["Cond::create","cond.create","refentry"],["","cond.destroy","example"],["Cond::destroy","cond.destroy","refentry"],["","cond.signal","example"],["Cond::signal","cond.signal","refentry"],["","cond.wait","example"],["Cond::wait","cond.wait","refentry"],["Cond","class.cond","phpdoc:classref"],["pthreads","book.pthreads","book"],["","intro.sem","preface"],["","sem.requirements","section"],["","sem.installation","section"],["","sem.configuration","varlistentry"],["","sem.configuration","section"],["","sem.resources","section"],["","sem.setup","chapter"],["","sem.constants","appendix"],["ftok","function.ftok","refentry"],["msg_get_queue","function.msg-get-queue","refentry"],["msg_queue_exists","function.msg-queue-exists","refentry"],["msg_receive","function.msg-receive","refentry"],["msg_remove_queue","function.msg-remove-queue","refentry"],["msg_send","function.msg-send","refentry"],["msg_set_queue","function.msg-set-queue","refentry"],["msg_stat_queue","function.msg-stat-queue","refentry"],["sem_acquire","function.sem-acquire","refentry"],["sem_get","function.sem-get","refentry"],["sem_release","function.sem-release","refentry"],["sem_remove","function.sem-remove","refentry"],["","function.shm-attach","example"],["shm_attach","function.shm-attach","refentry"],["shm_detach","function.shm-detach","refentry"],["shm_get_var","function.shm-get-var","refentry"],["shm_has_var","function.shm-has-var","refentry"],["shm_put_var","function.shm-put-var","refentry"],["shm_remove_var","function.shm-remove-var","refentry"],["shm_remove","function.shm-remove","refentry"],["","ref.sem","reference"],["Semaphore","book.sem","book"],["","intro.shmop","preface"],["","shmop.requirements","section"],["","shmop.installation","section"],["","shmop.configuration","section"],["","shmop.resources","section"],["","shmop.setup","chapter"],["","shmop.constants","appendix"],["","shmop.examples-basic","example"],["","shmop.examples-basic","section"],["","shmop.examples","chapter"],["","function.shmop-close","example"],["shmop_close","function.shmop-close","refentry"],["","function.shmop-delete","example"],["shmop_delete","function.shmop-delete","refentry"],["","function.shmop-open","example"],["shmop_open","function.shmop-open","refentry"],["","function.shmop-read","example"],["shmop_read","function.shmop-read","refentry"],["","function.shmop-size","example"],["shmop_size","function.shmop-size","refentry"],["","function.shmop-write","example"],["shmop_write","function.shmop-write","refentry"],["","ref.shmop","reference"],["","book.shmop","book"],["","refs.fileprocess.process","set"],["","intro.geoip","preface"],["","geoip.requirements","section"],["","geoip.installation","section"],["","geoip.configuration","section"],["","geoip.resources","section"],["","geoip.setup","chapter"],["","geoip.constants","varlistentry"],["","geoip.constants","varlistentry"],["","geoip.constants","varlistentry"],["","geoip.constants","varlistentry"],["","geoip.constants","varlistentry"],["","geoip.constants","varlistentry"],["","geoip.constants","varlistentry"],["","geoip.constants","varlistentry"],["","geoip.constants","varlistentry"],["","geoip.constants","varlistentry"],["","geoip.constants","varlistentry"],["","geoip.constants","varlistentry"],["","geoip.constants","varlistentry"],["","geoip.constants","varlistentry"],["","geoip.constants","varlistentry"],["","geoip.constants","appendix"],["","function.geoip-continent-code-by-name","example"],["geoip_continent_code_by_name","function.geoip-continent-code-by-name","refentry"],["","function.geoip-country-code-by-name","example"],["geoip_country_code_by_name","function.geoip-country-code-by-name","refentry"],["","function.geoip-country-code3-by-name","example"],["geoip_country_code3_by_name","function.geoip-country-code3-by-name","refentry"],["","function.geoip-country-name-by-name","example"],["geoip_country_name_by_name","function.geoip-country-name-by-name","refentry"],["","function.geoip-database-info","example"],["geoip_database_info","function.geoip-database-info","refentry"],["","function.geoip-db-avail","example"],["geoip_db_avail","function.geoip-db-avail","refentry"],["","function.geoip-db-filename","example"],["geoip_db_filename","function.geoip-db-filename","refentry"],["","function.geoip-db-get-all-info","example"],["","function.geoip-db-get-all-info","example"],["geoip_db_get_all_info","function.geoip-db-get-all-info","refentry"],["","function.geoip-id-by-name","example"],["geoip_id_by_name","function.geoip-id-by-name","refentry"],["","function.geoip-isp-by-name","example"],["geoip_isp_by_name","function.geoip-isp-by-name","refentry"],["","function.geoip-org-by-name","example"],["geoip_org_by_name","function.geoip-org-by-name","refentry"],["","function.geoip-record-by-name","example"],["geoip_record_by_name","function.geoip-record-by-name","refentry"],["","function.geoip-region-by-name","example"],["geoip_region_by_name","function.geoip-region-by-name","refentry"],["","function.geoip-region-name-by-code","example"],["","function.geoip-region-name-by-code","example"],["geoip_region_name_by_code","function.geoip-region-name-by-code","refentry"],["","function.geoip-time-zone-by-country-and-region","example"],["","function.geoip-time-zone-by-country-and-region","example"],["geoip_time_zone_by_country_and_region","function.geoip-time-zone-by-country-and-region","refentry"],["","ref.geoip","reference"],["GeoIP","book.geoip","book"],["","intro.fann","preface"],["","fann.setup","chapter"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","variablelist"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","variablelist"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","variablelist"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","variablelist"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","variablelist"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","varlistentry"],["","fann.constants","variablelist"],["","fann.constants","appendix"],["","fann.examples-1","example"],["","fann.examples-1","example"],["","fann.examples-1","section"],["","fann.examples","chapter"],["fann_cascadetrain_on_data","function.fann-cascadetrain-on-data","refentry"],["fann_cascadetrain_on_file","function.fann-cascadetrain-on-file","refentry"],["fann_clear_scaling_params","function.fann-clear-scaling-params","refentry"],["fann_copy","function.fann-copy","refentry"],["fann_create_from_file","function.fann-create-from-file","refentry"],["fann_create_shortcut_array","function.fann-create-shortcut-array","refentry"],["fann_create_shortcut","function.fann-create-shortcut","refentry"],["fann_create_sparse_array","function.fann-create-sparse-array","refentry"],["fann_create_sparse","function.fann-create-sparse","refentry"],["fann_create_standard_array","function.fann-create-standard-array","refentry"],["fann_create_standard","function.fann-create-standard","refentry"],["","function.fann-create-train-from-callback","example"],["fann_create_train_from_callback","function.fann-create-train-from-callback","refentry"],["fann_create_train","function.fann-create-train","refentry"],["fann_descale_input","function.fann-descale-input","refentry"],["fann_descale_output","function.fann-descale-output","refentry"],["fann_descale_train","function.fann-descale-train","refentry"],["fann_destroy_train","function.fann-destroy-train","refentry"],["fann_destroy","function.fann-destroy","refentry"],["fann_duplicate_train_data","function.fann-duplicate-train-data","refentry"],["fann_get_activation_function","function.fann-get-activation-function","refentry"],["fann_get_activation_steepness","function.fann-get-activation-steepness","refentry"],["fann_get_bias_array","function.fann-get-bias-array","refentry"],["fann_get_bit_fail_limit","function.fann-get-bit-fail-limit","refentry"],["fann_get_bit_fail","function.fann-get-bit-fail","refentry"],["fann_get_cascade_activation_functions_count","function.fann-get-cascade-activation-functions-count","refentry"],["fann_get_cascade_activation_functions","function.fann-get-cascade-activation-functions","refentry"],["fann_get_cascade_activation_steepnesses_count","function.fann-get-cascade-activation-steepnesses-count","refentry"],["fann_get_cascade_activation_steepnesses","function.fann-get-cascade-activation-steepnesses","refentry"],["fann_get_cascade_candidate_change_fraction","function.fann-get-cascade-candidate-change-fraction","refentry"],["fann_get_cascade_candidate_limit","function.fann-get-cascade-candidate-limit","refentry"],["fann_get_cascade_candidate_stagnation_epochs","function.fann-get-cascade-candidate-stagnation-epochs","refentry"],["fann_get_cascade_max_cand_epochs","function.fann-get-cascade-max-cand-epochs","refentry"],["fann_get_cascade_max_out_epochs","function.fann-get-cascade-max-out-epochs","refentry"],["fann_get_cascade_min_cand_epochs","function.fann-get-cascade-min-cand-epochs","refentry"],["fann_get_cascade_min_out_epochs","function.fann-get-cascade-min-out-epochs","refentry"],["fann_get_cascade_num_candidate_groups","function.fann-get-cascade-num-candidate-groups","refentry"],["fann_get_cascade_num_candidates","function.fann-get-cascade-num-candidates","refentry"],["fann_get_cascade_output_change_fraction","function.fann-get-cascade-output-change-fraction","refentry"],["fann_get_cascade_output_stagnation_epochs","function.fann-get-cascade-output-stagnation-epochs","refentry"],["fann_get_cascade_weight_multiplier","function.fann-get-cascade-weight-multiplier","refentry"],["fann_get_connection_array","function.fann-get-connection-array","refentry"],["fann_get_connection_rate","function.fann-get-connection-rate","refentry"],["fann_get_errno","function.fann-get-errno","refentry"],["fann_get_errstr","function.fann-get-errstr","refentry"],["fann_get_layer_array","function.fann-get-layer-array","refentry"],["fann_get_learning_momentum","function.fann-get-learning-momentum","refentry"],["fann_get_learning_rate","function.fann-get-learning-rate","refentry"],["fann_get_MSE","function.fann-get-mse","refentry"],["fann_get_network_type","function.fann-get-network-type","refentry"],["fann_get_num_input","function.fann-get-num-input","refentry"],["fann_get_num_layers","function.fann-get-num-layers","refentry"],["fann_get_num_output","function.fann-get-num-output","refentry"],["fann_get_quickprop_decay","function.fann-get-quickprop-decay","refentry"],["fann_get_quickprop_mu","function.fann-get-quickprop-mu","refentry"],["fann_get_rprop_decrease_factor","function.fann-get-rprop-decrease-factor","refentry"],["fann_get_rprop_delta_max","function.fann-get-rprop-delta-max","refentry"],["fann_get_rprop_delta_min","function.fann-get-rprop-delta-min","refentry"],["fann_get_rprop_delta_zero","function.fann-get-rprop-delta-zero","refentry"],["fann_get_rprop_increase_factor","function.fann-get-rprop-increase-factor","refentry"],["fann_get_sarprop_step_error_shift","function.fann-get-sarprop-step-error-shift","refentry"],["fann_get_sarprop_step_error_threshold_factor","function.fann-get-sarprop-step-error-threshold-factor","refentry"],["fann_get_sarprop_temperature","function.fann-get-sarprop-temperature","refentry"],["fann_get_sarprop_weight_decay_shift","function.fann-get-sarprop-weight-decay-shift","refentry"],["fann_get_total_connections","function.fann-get-total-connections","refentry"],["fann_get_total_neurons","function.fann-get-total-neurons","refentry"],["fann_get_train_error_function","function.fann-get-train-error-function","refentry"],["fann_get_train_stop_function","function.fann-get-train-stop-function","refentry"],["fann_get_training_algorithm","function.fann-get-training-algorithm","refentry"],["fann_init_weights","function.fann-init-weights","refentry"],["fann_length_train_data","function.fann-length-train-data","refentry"],["fann_merge_train_data","function.fann-merge-train-data","refentry"],["fann_num_input_train_data","function.fann-num-input-train-data","refentry"],["fann_num_output_train_data","function.fann-num-output-train-data","refentry"],["fann_print_error","function.fann-print-error","refentry"],["fann_randomize_weights","function.fann-randomize-weights","refentry"],["","function.fann-read-train-from-file","example"],["fann_read_train_from_file","function.fann-read-train-from-file","refentry"],["fann_reset_errno","function.fann-reset-errno","refentry"],["fann_reset_errstr","function.fann-reset-errstr","refentry"],["fann_reset_MSE","function.fann-reset-mse","refentry"],["fann_run","function.fann-run","refentry"],["fann_save_train","function.fann-save-train","refentry"],["fann_save","function.fann-save","refentry"],["fann_scale_input_train_data","function.fann-scale-input-train-data","refentry"],["fann_scale_input","function.fann-scale-input","refentry"],["fann_scale_output_train_data","function.fann-scale-output-train-data","refentry"],["fann_scale_output","function.fann-scale-output","refentry"],["fann_scale_train_data","function.fann-scale-train-data","refentry"],["fann_scale_train","function.fann-scale-train","refentry"],["fann_set_activation_function_hidden","function.fann-set-activation-function-hidden","refentry"],["fann_set_activation_function_layer","function.fann-set-activation-function-layer","refentry"],["fann_set_activation_function_output","function.fann-set-activation-function-output","refentry"],["fann_set_activation_function","function.fann-set-activation-function","refentry"],["fann_set_activation_steepness_hidden","function.fann-set-activation-steepness-hidden","refentry"],["fann_set_activation_steepness_layer","function.fann-set-activation-steepness-layer","refentry"],["fann_set_activation_steepness_output","function.fann-set-activation-steepness-output","refentry"],["fann_set_activation_steepness","function.fann-set-activation-steepness","refentry"],["fann_set_bit_fail_limit","function.fann-set-bit-fail-limit","refentry"],["fann_set_callback","function.fann-set-callback","refentry"],["fann_set_cascade_activation_functions","function.fann-set-cascade-activation-functions","refentry"],["fann_set_cascade_activation_steepnesses","function.fann-set-cascade-activation-steepnesses","refentry"],["fann_set_cascade_candidate_change_fraction","function.fann-set-cascade-candidate-change-fraction","refentry"],["fann_set_cascade_candidate_limit","function.fann-set-cascade-candidate-limit","refentry"],["fann_set_cascade_candidate_stagnation_epochs","function.fann-set-cascade-candidate-stagnation-epochs","refentry"],["fann_set_cascade_max_cand_epochs","function.fann-set-cascade-max-cand-epochs","refentry"],["fann_set_cascade_max_out_epochs","function.fann-set-cascade-max-out-epochs","refentry"],["fann_set_cascade_min_cand_epochs","function.fann-set-cascade-min-cand-epochs","refentry"],["fann_set_cascade_min_out_epochs","function.fann-set-cascade-min-out-epochs","refentry"],["fann_set_cascade_num_candidate_groups","function.fann-set-cascade-num-candidate-groups","refentry"],["fann_set_cascade_output_change_fraction","function.fann-set-cascade-output-change-fraction","refentry"],["fann_set_cascade_output_stagnation_epochs","function.fann-set-cascade-output-stagnation-epochs","refentry"],["fann_set_cascade_weight_multiplier","function.fann-set-cascade-weight-multiplier","refentry"],["fann_set_error_log","function.fann-set-error-log","refentry"],["fann_set_input_scaling_params","function.fann-set-input-scaling-params","refentry"],["fann_set_learning_momentum","function.fann-set-learning-momentum","refentry"],["fann_set_learning_rate","function.fann-set-learning-rate","refentry"],["fann_set_output_scaling_params","function.fann-set-output-scaling-params","refentry"],["fann_set_quickprop_decay","function.fann-set-quickprop-decay","refentry"],["fann_set_quickprop_mu","function.fann-set-quickprop-mu","refentry"],["fann_set_rprop_decrease_factor","function.fann-set-rprop-decrease-factor","refentry"],["fann_set_rprop_delta_max","function.fann-set-rprop-delta-max","refentry"],["fann_set_rprop_delta_min","function.fann-set-rprop-delta-min","refentry"],["fann_set_rprop_delta_zero","function.fann-set-rprop-delta-zero","refentry"],["fann_set_rprop_increase_factor","function.fann-set-rprop-increase-factor","refentry"],["fann_set_sarprop_step_error_shift","function.fann-set-sarprop-step-error-shift","refentry"],["fann_set_sarprop_step_error_threshold_factor","function.fann-set-sarprop-step-error-threshold-factor","refentry"],["fann_set_sarprop_temperature","function.fann-set-sarprop-temperature","refentry"],["fann_set_sarprop_weight_decay_shift","function.fann-set-sarprop-weight-decay-shift","refentry"],["fann_set_scaling_params","function.fann-set-scaling-params","refentry"],["fann_set_train_error_function","function.fann-set-train-error-function","refentry"],["fann_set_train_stop_function","function.fann-set-train-stop-function","refentry"],["fann_set_training_algorithm","function.fann-set-training-algorithm","refentry"],["fann_set_weight_array","function.fann-set-weight-array","refentry"],["fann_set_weight","function.fann-set-weight","refentry"],["fann_shuffle_train_data","function.fann-shuffle-train-data","refentry"],["fann_subset_train_data","function.fann-subset-train-data","refentry"],["fann_test_data","function.fann-test-data","refentry"],["fann_test","function.fann-test","refentry"],["fann_train_epoch","function.fann-train-epoch","refentry"],["fann_train_on_data","function.fann-train-on-data","refentry"],["fann_train_on_file","function.fann-train-on-file","refentry"],["fann_train","function.fann-train","refentry"],["","ref.fann","reference"],["","class.fannconnection","section"],["","class.fannconnection","section"],["","class.fannconnection","varlistentry"],["","class.fannconnection","varlistentry"],["","class.fannconnection","varlistentry"],["","class.fannconnection","section"],["FANNConnection::__construct","fannconnection.construct","refentry"],["FANNConnection::getFromNeuron","fannconnection.getfromneuron","refentry"],["FANNConnection::getToNeuron","fannconnection.gettoneuron","refentry"],["FANNConnection::getWeight","fannconnection.getweight","refentry"],["FANNConnection::setWeight","fannconnection.setweight","refentry"],["FANNConnection","class.fannconnection","phpdoc:classref"],["FANN","book.fann","book"],["","intro.json","preface"],["","json.requirements","section"],["","json.installation","section"],["","json.configuration","section"],["","json.resources","section"],["","json.setup","chapter"],["","json.constants","varlistentry"],["","json.constants","varlistentry"],["","json.constants","varlistentry"],["","json.constants","varlistentry"],["","json.constants","varlistentry"],["","json.constants","varlistentry"],["","json.constants","varlistentry"],["","json.constants","varlistentry"],["","json.constants","varlistentry"],["","json.constants","varlistentry"],["","json.constants","varlistentry"],["","json.constants","varlistentry"],["","json.constants","varlistentry"],["","json.constants","varlistentry"],["","json.constants","varlistentry"],["","json.constants","varlistentry"],["","json.constants","varlistentry"],["","json.constants","varlistentry"],["","json.constants","varlistentry"],["","json.constants","appendix"],["","class.jsonserializable","section"],["","class.jsonserializable","section"],["","jsonserializable.jsonserialize","example"],["","jsonserializable.jsonserialize","example"],["","jsonserializable.jsonserialize","example"],["","jsonserializable.jsonserialize","example"],["JsonSerializable::jsonSerialize","jsonserializable.jsonserialize","refentry"],["JsonSerializable","class.jsonserializable","phpdoc:classref"],["","function.json-decode","example"],["","function.json-decode","example"],["","function.json-decode","example"],["","function.json-decode","example"],["","function.json-decode","example"],["json_decode","function.json-decode","refentry"],["","function.json-encode","example"],["","function.json-encode","example"],["","function.json-encode","example"],["json_encode","function.json-encode","refentry"],["json_last_error_msg","function.json-last-error-msg","refentry"],["","function.json-last-error","example"],["","function.json-last-error","example"],["json_last_error","function.json-last-error","refentry"],["","ref.json","reference"],["JSON","book.json","book"],["","intro.judy","preface"],["","judy.requirements","section"],["","judy.installation","section"],["","judy.configuration","section"],["","judy.resources","section"],["","judy.setup","chapter"],["","class.judy","para"],["","class.judy","example"],["","class.judy","section"],["","class.judy","section"],["","class.judy","varlistentry"],["","class.judy","varlistentry"],["","class.judy","varlistentry"],["","class.judy","varlistentry"],["","class.judy","varlistentry"],["","class.judy","section"],["Judy::byCount","judy.bycount","refentry"],["Judy::__construct","judy.construct","refentry"],["Judy::count","judy.count","refentry"],["Judy::__destruct","judy.destruct","refentry"],["Judy::first","judy.first","refentry"],["Judy::firstEmpty","judy.firstempty","refentry"],["Judy::free","judy.free","refentry"],["Judy::getType","judy.gettype","refentry"],["Judy::last","judy.last","refentry"],["Judy::lastEmpty","judy.lastempty","refentry"],["Judy::memoryUsage","judy.memoryusage","refentry"],["Judy::next","judy.next","refentry"],["Judy::nextEmpty","judy.nextempty","refentry"],["Judy::offsetExists","judy.offsetexists","refentry"],["Judy::offsetGet","judy.offsetget","refentry"],["Judy::offsetSet","judy.offsetset","refentry"],["Judy::offsetUnset","judy.offsetunset","refentry"],["Judy::prev","judy.prev","refentry"],["Judy::prevEmpty","judy.prevempty","refentry"],["Judy::size","judy.size","refentry"],["Judy","class.judy","phpdoc:classref"],["judy_type","function.judy-type","refentry"],["judy_version","function.judy-version","refentry"],["","ref.judy","reference"],["Judy","book.judy","book"],["","intro.lua","preface"],["","lua.requirements","section"],["","lua.installation","section"],["","lua.configuration","section"],["","lua.resources","section"],["","lua.setup","chapter"],["","class.lua","section"],["","class.lua","section"],["","class.lua","varlistentry"],["","class.lua","section"],["","lua.assign","example"],["Lua::assign","lua.assign","refentry"],["","lua.call","example"],["Lua::call","lua.call","refentry"],["Lua::__construct","lua.construct","refentry"],["","lua.eval","example"],["Lua::eval","lua.eval","refentry"],["Lua::getVersion","lua.getversion","refentry"],["Lua::include","lua.include","refentry"],["","lua.registercallback","example"],["Lua::registerCallback","lua.registercallback","refentry"],["Lua","class.lua","phpdoc:classref"],["","class.luaclosure","section"],["","class.luaclosure","section"],["","luaclosure.invoke","example"],["LuaClosure::__invoke","luaclosure.invoke","refentry"],["LuaClosure","class.luaclosure","phpdoc:classref"],["Lua","book.lua","book"],["","intro.misc","preface"],["","misc.requirements","section"],["","misc.installation","section"],["","misc.configuration","varlistentry"],["","misc.configuration","varlistentry"],["","misc.configuration","varlistentry"],["","misc.configuration","section"],["","misc.resources","section"],["","misc.setup","chapter"],["","misc.constants","varlistentry"],["","misc.constants","varlistentry"],["","misc.constants","varlistentry"],["","misc.constants","varlistentry"],["","misc.constants","appendix"],["connection_aborted","function.connection-aborted","refentry"],["connection_status","function.connection-status","refentry"],["connection_timeout","function.connection-timeout","refentry"],["","function.constant","example"],["constant","function.constant","refentry"],["","function.define","example"],["define","function.define","refentry"],["","function.defined","example"],["defined","function.defined","refentry"],["die","function.die","refentry"],["","function.eval","example"],["eval","function.eval","refentry"],["","function.exit","example"],["","function.exit","example"],["","function.exit","example"],["exit","function.exit","refentry"],["","function.get-browser","example"],["get_browser","function.get-browser","refentry"],["","function.halt-compiler","example"],["__halt_compiler","function.halt-compiler","refentry"],["highlight_file","function.highlight-file","refentry"],["","function.highlight-string","example"],["highlight_string","function.highlight-string","refentry"],["","function.ignore-user-abort","example"],["ignore_user_abort","function.ignore-user-abort","refentry"],["","function.pack","example"],["pack","function.pack","refentry"],["php_check_syntax","function.php-check-syntax","refentry"],["","function.php-strip-whitespace","example"],["php_strip_whitespace","function.php-strip-whitespace","refentry"],["show_source","function.show-source","refentry"],["","function.sleep","example"],["sleep","function.sleep","refentry"],["","function.sys-getloadavg","example"],["sys_getloadavg","function.sys-getloadavg","refentry"],["","function.time-nanosleep","example"],["time_nanosleep","function.time-nanosleep","refentry"],["","function.time-sleep-until","example"],["time_sleep_until","function.time-sleep-until","refentry"],["","function.uniqid","example"],["uniqid","function.uniqid","refentry"],["","function.unpack","example"],["","function.unpack","example"],["","function.unpack","example"],["unpack","function.unpack","refentry"],["","function.usleep","example"],["usleep","function.usleep","refentry"],["","ref.misc","reference"],["","changelog.misc","appendix"],["Misc.","book.misc","book"],["","intro.parsekit","preface"],["","parsekit.requirements","section"],["","parsekit.installation","section"],["","parsekit.configuration","section"],["","parsekit.resources","section"],["","parsekit.setup","chapter"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","varlistentry"],["","parsekit.constants","appendix"],["","function.parsekit-compile-file","example"],["parsekit_compile_file","function.parsekit-compile-file","refentry"],["","function.parsekit-compile-string","example"],["parsekit_compile_string","function.parsekit-compile-string","refentry"],["","function.parsekit-func-arginfo","example"],["parsekit_func_arginfo","function.parsekit-func-arginfo","refentry"],["","ref.parsekit","reference"],["","book.parsekit","book"],["","intro.spl","preface"],["","spl.requirements","section"],["","spl.installation","section"],["","spl.configuration","section"],["","spl.resources","section"],["","spl.setup","chapter"],["","spl.constants","appendix"],["","class.spldoublylinkedlist","section"],["","class.spldoublylinkedlist","section"],["SplDoublyLinkedList::bottom","spldoublylinkedlist.bottom","refentry"],["","spldoublylinkedlist.construct","example"],["SplDoublyLinkedList::__construct","spldoublylinkedlist.construct","refentry"],["SplDoublyLinkedList::count","spldoublylinkedlist.count","refentry"],["SplDoublyLinkedList::current","spldoublylinkedlist.current","refentry"],["SplDoublyLinkedList::getIteratorMode","spldoublylinkedlist.getiteratormode","refentry"],["SplDoublyLinkedList::isEmpty","spldoublylinkedlist.isempty","refentry"],["SplDoublyLinkedList::key","spldoublylinkedlist.key","refentry"],["SplDoublyLinkedList::next","spldoublylinkedlist.next","refentry"],["SplDoublyLinkedList::offsetExists","spldoublylinkedlist.offsetexists","refentry"],["SplDoublyLinkedList::offsetGet","spldoublylinkedlist.offsetget","refentry"],["SplDoublyLinkedList::offsetSet","spldoublylinkedlist.offsetset","refentry"],["SplDoublyLinkedList::offsetUnset","spldoublylinkedlist.offsetunset","refentry"],["SplDoublyLinkedList::pop","spldoublylinkedlist.pop","refentry"],["SplDoublyLinkedList::prev","spldoublylinkedlist.prev","refentry"],["SplDoublyLinkedList::push","spldoublylinkedlist.push","refentry"],["SplDoublyLinkedList::rewind","spldoublylinkedlist.rewind","refentry"],["SplDoublyLinkedList::serialize","spldoublylinkedlist.serialize","refentry"],["SplDoublyLinkedList::setIteratorMode","spldoublylinkedlist.setiteratormode","refentry"],["SplDoublyLinkedList::shift","spldoublylinkedlist.shift","refentry"],["SplDoublyLinkedList::top","spldoublylinkedlist.top","refentry"],["SplDoublyLinkedList::unserialize","spldoublylinkedlist.unserialize","refentry"],["SplDoublyLinkedList::unshift","spldoublylinkedlist.unshift","refentry"],["SplDoublyLinkedList::valid","spldoublylinkedlist.valid","refentry"],["SplDoublyLinkedList","class.spldoublylinkedlist","phpdoc:classref"],["","class.splstack","section"],["","class.splstack","section"],["","splstack.construct","example"],["SplStack::__construct","splstack.construct","refentry"],["SplStack::setIteratorMode","splstack.setiteratormode","refentry"],["SplStack","class.splstack","phpdoc:classref"],["","class.splqueue","section"],["","class.splqueue","section"],["","splqueue.construct","example"],["","splqueue.construct","example"],["SplQueue::__construct","splqueue.construct","refentry"],["SplQueue::dequeue","splqueue.dequeue","refentry"],["SplQueue::enqueue","splqueue.enqueue","refentry"],["SplQueue::setIteratorMode","splqueue.setiteratormode","refentry"],["SplQueue","class.splqueue","phpdoc:classref"],["","class.splheap","section"],["","class.splheap","section"],["SplHeap::compare","splheap.compare","refentry"],["SplHeap::__construct","splheap.construct","refentry"],["SplHeap::count","splheap.count","refentry"],["SplHeap::current","splheap.current","refentry"],["SplHeap::extract","splheap.extract","refentry"],["SplHeap::insert","splheap.insert","refentry"],["SplHeap::isEmpty","splheap.isempty","refentry"],["SplHeap::key","splheap.key","refentry"],["SplHeap::next","splheap.next","refentry"],["SplHeap::recoverFromCorruption","splheap.recoverfromcorruption","refentry"],["SplHeap::rewind","splheap.rewind","refentry"],["SplHeap::top","splheap.top","refentry"],["SplHeap::valid","splheap.valid","refentry"],["SplHeap","class.splheap","phpdoc:classref"],["","class.splmaxheap","section"],["","class.splmaxheap","section"],["SplMaxHeap::compare","splmaxheap.compare","refentry"],["SplMaxHeap","class.splmaxheap","phpdoc:classref"],["","class.splminheap","section"],["","class.splminheap","section"],["SplMinHeap::compare","splminheap.compare","refentry"],["SplMinHeap","class.splminheap","phpdoc:classref"],["","class.splpriorityqueue","section"],["","class.splpriorityqueue","section"],["SplPriorityQueue::compare","splpriorityqueue.compare","refentry"],["SplPriorityQueue::__construct","splpriorityqueue.construct","refentry"],["SplPriorityQueue::count","splpriorityqueue.count","refentry"],["SplPriorityQueue::current","splpriorityqueue.current","refentry"],["SplPriorityQueue::extract","splpriorityqueue.extract","refentry"],["SplPriorityQueue::insert","splpriorityqueue.insert","refentry"],["SplPriorityQueue::isEmpty","splpriorityqueue.isempty","refentry"],["SplPriorityQueue::key","splpriorityqueue.key","refentry"],["SplPriorityQueue::next","splpriorityqueue.next","refentry"],["SplPriorityQueue::recoverFromCorruption","splpriorityqueue.recoverfromcorruption","refentry"],["SplPriorityQueue::rewind","splpriorityqueue.rewind","refentry"],["SplPriorityQueue::setExtractFlags","splpriorityqueue.setextractflags","refentry"],["SplPriorityQueue::top","splpriorityqueue.top","refentry"],["SplPriorityQueue::valid","splpriorityqueue.valid","refentry"],["SplPriorityQueue","class.splpriorityqueue","phpdoc:classref"],["","class.splfixedarray","section"],["","class.splfixedarray","section"],["","class.splfixedarray","example"],["","class.splfixedarray","section"],["","splfixedarray.construct","example"],["SplFixedArray::__construct","splfixedarray.construct","refentry"],["","splfixedarray.count","example"],["SplFixedArray::count","splfixedarray.count","refentry"],["SplFixedArray::current","splfixedarray.current","refentry"],["","splfixedarray.fromarray","example"],["SplFixedArray::fromArray","splfixedarray.fromarray","refentry"],["","splfixedarray.getsize","example"],["SplFixedArray::getSize","splfixedarray.getsize","refentry"],["SplFixedArray::key","splfixedarray.key","refentry"],["SplFixedArray::next","splfixedarray.next","refentry"],["SplFixedArray::offsetExists","splfixedarray.offsetexists","refentry"],["SplFixedArray::offsetGet","splfixedarray.offsetget","refentry"],["SplFixedArray::offsetSet","splfixedarray.offsetset","refentry"],["SplFixedArray::offsetUnset","splfixedarray.offsetunset","refentry"],["SplFixedArray::rewind","splfixedarray.rewind","refentry"],["","splfixedarray.setsize","example"],["SplFixedArray::setSize","splfixedarray.setsize","refentry"],["","splfixedarray.toarray","example"],["SplFixedArray::toArray","splfixedarray.toarray","refentry"],["SplFixedArray::valid","splfixedarray.valid","refentry"],["SplFixedArray::__wakeup","splfixedarray.wakeup","refentry"],["SplFixedArray","class.splfixedarray","phpdoc:classref"],["","class.splobjectstorage","section"],["","class.splobjectstorage","section"],["","class.splobjectstorage","example"],["","class.splobjectstorage","example"],["","class.splobjectstorage","section"],["","splobjectstorage.addall","example"],["SplObjectStorage::addAll","splobjectstorage.addall","refentry"],["","splobjectstorage.attach","example"],["SplObjectStorage::attach","splobjectstorage.attach","refentry"],["","splobjectstorage.contains","example"],["SplObjectStorage::contains","splobjectstorage.contains","refentry"],["","splobjectstorage.count","example"],["SplObjectStorage::count","splobjectstorage.count","refentry"],["","splobjectstorage.current","example"],["SplObjectStorage::current","splobjectstorage.current","refentry"],["","splobjectstorage.detach","example"],["SplObjectStorage::detach","splobjectstorage.detach","refentry"],["","splobjectstorage.gethash","example"],["SplObjectStorage::getHash","splobjectstorage.gethash","refentry"],["","splobjectstorage.getinfo","example"],["SplObjectStorage::getInfo","splobjectstorage.getinfo","refentry"],["","splobjectstorage.key","example"],["SplObjectStorage::key","splobjectstorage.key","refentry"],["","splobjectstorage.next","example"],["SplObjectStorage::next","splobjectstorage.next","refentry"],["","splobjectstorage.offsetexists","example"],["SplObjectStorage::offsetExists","splobjectstorage.offsetexists","refentry"],["","splobjectstorage.offsetget","example"],["SplObjectStorage::offsetGet","splobjectstorage.offsetget","refentry"],["","splobjectstorage.offsetset","example"],["SplObjectStorage::offsetSet","splobjectstorage.offsetset","refentry"],["","splobjectstorage.offsetunset","example"],["SplObjectStorage::offsetUnset","splobjectstorage.offsetunset","refentry"],["","splobjectstorage.removeall","example"],["SplObjectStorage::removeAll","splobjectstorage.removeall","refentry"],["","splobjectstorage.removeallexcept","example"],["SplObjectStorage::removeAllExcept","splobjectstorage.removeallexcept","refentry"],["","splobjectstorage.rewind","example"],["SplObjectStorage::rewind","splobjectstorage.rewind","refentry"],["","splobjectstorage.serialize","example"],["SplObjectStorage::serialize","splobjectstorage.serialize","refentry"],["","splobjectstorage.setinfo","example"],["SplObjectStorage::setInfo","splobjectstorage.setinfo","refentry"],["","splobjectstorage.unserialize","example"],["SplObjectStorage::unserialize","splobjectstorage.unserialize","refentry"],["","splobjectstorage.valid","example"],["SplObjectStorage::valid","splobjectstorage.valid","refentry"],["SplObjectStorage","class.splobjectstorage","phpdoc:classref"],["","spl.datastructures","part"],["","spl.iterators","section"],["","class.appenditerator","section"],["","class.appenditerator","section"],["","appenditerator.append","example"],["AppendIterator::append","appenditerator.append","refentry"],["","appenditerator.construct","example"],["","appenditerator.construct","example"],["AppendIterator::__construct","appenditerator.construct","refentry"],["AppendIterator::current","appenditerator.current","refentry"],["AppendIterator::getArrayIterator","appenditerator.getarrayiterator","refentry"],["","appenditerator.getinneriterator","example"],["AppendIterator::getInnerIterator","appenditerator.getinneriterator","refentry"],["","appenditerator.getiteratorindex","example"],["AppendIterator::getIteratorIndex","appenditerator.getiteratorindex","refentry"],["","appenditerator.key","example"],["AppendIterator::key","appenditerator.key","refentry"],["AppendIterator::next","appenditerator.next","refentry"],["AppendIterator::rewind","appenditerator.rewind","refentry"],["AppendIterator::valid","appenditerator.valid","refentry"],["AppendIterator","class.appenditerator","phpdoc:classref"],["","class.arrayiterator","section"],["","class.arrayiterator","section"],["ArrayIterator::append","arrayiterator.append","refentry"],["ArrayIterator::asort","arrayiterator.asort","refentry"],["ArrayIterator::__construct","arrayiterator.construct","refentry"],["ArrayIterator::count","arrayiterator.count","refentry"],["","arrayiterator.current","example"],["ArrayIterator::current","arrayiterator.current","refentry"],["ArrayIterator::getArrayCopy","arrayiterator.getarraycopy","refentry"],["ArrayIterator::getFlags","arrayiterator.getflags","refentry"],["","arrayiterator.key","example"],["ArrayIterator::key","arrayiterator.key","refentry"],["ArrayIterator::ksort","arrayiterator.ksort","refentry"],["ArrayIterator::natcasesort","arrayiterator.natcasesort","refentry"],["ArrayIterator::natsort","arrayiterator.natsort","refentry"],["","arrayiterator.next","example"],["ArrayIterator::next","arrayiterator.next","refentry"],["ArrayIterator::offsetExists","arrayiterator.offsetexists","refentry"],["ArrayIterator::offsetGet","arrayiterator.offsetget","refentry"],["ArrayIterator::offsetSet","arrayiterator.offsetset","refentry"],["ArrayIterator::offsetUnset","arrayiterator.offsetunset","refentry"],["","arrayiterator.rewind","example"],["ArrayIterator::rewind","arrayiterator.rewind","refentry"],["ArrayIterator::seek","arrayiterator.seek","refentry"],["ArrayIterator::serialize","arrayiterator.serialize","refentry"],["ArrayIterator::setFlags","arrayiterator.setflags","refentry"],["ArrayIterator::uasort","arrayiterator.uasort","refentry"],["ArrayIterator::uksort","arrayiterator.uksort","refentry"],["ArrayIterator::unserialize","arrayiterator.unserialize","refentry"],["","arrayiterator.valid","example"],["ArrayIterator::valid","arrayiterator.valid","refentry"],["ArrayIterator","class.arrayiterator","phpdoc:classref"],["","class.cachingiterator","section"],["","class.cachingiterator","section"],["","class.cachingiterator","varlistentry"],["","class.cachingiterator","varlistentry"],["","class.cachingiterator","varlistentry"],["","class.cachingiterator","varlistentry"],["","class.cachingiterator","varlistentry"],["","class.cachingiterator","varlistentry"],["","class.cachingiterator","section"],["CachingIterator::__construct","cachingiterator.construct","refentry"],["CachingIterator::count","cachingiterator.count","refentry"],["CachingIterator::current","cachingiterator.current","refentry"],["CachingIterator::getCache","cachingiterator.getcache","refentry"],["CachingIterator::getFlags","cachingiterator.getflags","refentry"],["CachingIterator::getInnerIterator","cachingiterator.getinneriterator","refentry"],["CachingIterator::hasNext","cachingiterator.hasnext","refentry"],["CachingIterator::key","cachingiterator.key","refentry"],["CachingIterator::next","cachingiterator.next","refentry"],["CachingIterator::offsetExists","cachingiterator.offsetexists","refentry"],["CachingIterator::offsetGet","cachingiterator.offsetget","refentry"],["CachingIterator::offsetSet","cachingiterator.offsetset","refentry"],["CachingIterator::offsetUnset","cachingiterator.offsetunset","refentry"],["CachingIterator::rewind","cachingiterator.rewind","refentry"],["CachingIterator::setFlags","cachingiterator.setflags","refentry"],["CachingIterator::__toString","cachingiterator.tostring","refentry"],["CachingIterator::valid","cachingiterator.valid","refentry"],["CachingIterator","class.cachingiterator","phpdoc:classref"],["","class.callbackfilteriterator","section"],["","class.callbackfilteriterator","section"],["","class.callbackfilteriterator","example"],["","class.callbackfilteriterator","example"],["","class.callbackfilteriterator","section"],["CallbackFilterIterator::accept","callbackfilteriterator.accept","refentry"],["CallbackFilterIterator::__construct","callbackfilteriterator.construct","refentry"],["CallbackFilterIterator","class.callbackfilteriterator","phpdoc:classref"],["","class.directoryiterator","section"],["","class.directoryiterator","section"],["","class.directoryiterator","section"],["","directoryiterator.construct","example"],["DirectoryIterator::__construct","directoryiterator.construct","refentry"],["","directoryiterator.current","example"],["DirectoryIterator::current","directoryiterator.current","refentry"],["","directoryiterator.getatime","example"],["DirectoryIterator::getATime","directoryiterator.getatime","refentry"],["","directoryiterator.getbasename","example"],["DirectoryIterator::getBasename","directoryiterator.getbasename","refentry"],["","directoryiterator.getctime","example"],["DirectoryIterator::getCTime","directoryiterator.getctime","refentry"],["","directoryiterator.getextension","example"],["","directoryiterator.getextension","example"],["DirectoryIterator::getExtension","directoryiterator.getextension","refentry"],["","directoryiterator.getfilename","example"],["DirectoryIterator::getFilename","directoryiterator.getfilename","refentry"],["","directoryiterator.getgroup","example"],["DirectoryIterator::getGroup","directoryiterator.getgroup","refentry"],["","directoryiterator.getinode","example"],["DirectoryIterator::getInode","directoryiterator.getinode","refentry"],["","directoryiterator.getmtime","example"],["DirectoryIterator::getMTime","directoryiterator.getmtime","refentry"],["","directoryiterator.getowner","example"],["DirectoryIterator::getOwner","directoryiterator.getowner","refentry"],["","directoryiterator.getpath","example"],["DirectoryIterator::getPath","directoryiterator.getpath","refentry"],["","directoryiterator.getpathname","example"],["DirectoryIterator::getPathname","directoryiterator.getpathname","refentry"],["","directoryiterator.getperms","example"],["DirectoryIterator::getPerms","directoryiterator.getperms","refentry"],["","directoryiterator.getsize","example"],["DirectoryIterator::getSize","directoryiterator.getsize","refentry"],["","directoryiterator.gettype","example"],["DirectoryIterator::getType","directoryiterator.gettype","refentry"],["","directoryiterator.isdir","example"],["DirectoryIterator::isDir","directoryiterator.isdir","refentry"],["","directoryiterator.isdot","example"],["DirectoryIterator::isDot","directoryiterator.isdot","refentry"],["","directoryiterator.isexecutable","example"],["DirectoryIterator::isExecutable","directoryiterator.isexecutable","refentry"],["","directoryiterator.isfile","example"],["DirectoryIterator::isFile","directoryiterator.isfile","refentry"],["","directoryiterator.islink","example"],["DirectoryIterator::isLink","directoryiterator.islink","refentry"],["","directoryiterator.isreadable","example"],["DirectoryIterator::isReadable","directoryiterator.isreadable","refentry"],["","directoryiterator.iswritable","example"],["DirectoryIterator::isWritable","directoryiterator.iswritable","refentry"],["","directoryiterator.key","example"],["DirectoryIterator::key","directoryiterator.key","refentry"],["","directoryiterator.next","example"],["DirectoryIterator::next","directoryiterator.next","refentry"],["","directoryiterator.rewind","example"],["DirectoryIterator::rewind","directoryiterator.rewind","refentry"],["","directoryiterator.seek","example"],["DirectoryIterator::seek","directoryiterator.seek","refentry"],["","directoryiterator.tostring","example"],["DirectoryIterator::__toString","directoryiterator.tostring","refentry"],["","directoryiterator.valid","example"],["DirectoryIterator::valid","directoryiterator.valid","refentry"],["DirectoryIterator","class.directoryiterator","phpdoc:classref"],["","class.emptyiterator","section"],["","class.emptyiterator","section"],["EmptyIterator::current","emptyiterator.current","refentry"],["EmptyIterator::key","emptyiterator.key","refentry"],["EmptyIterator::next","emptyiterator.next","refentry"],["EmptyIterator::rewind","emptyiterator.rewind","refentry"],["EmptyIterator::valid","emptyiterator.valid","refentry"],["EmptyIterator","class.emptyiterator","phpdoc:classref"],["","class.filesystemiterator","section"],["","class.filesystemiterator","section"],["","class.filesystemiterator","varlistentry"],["","class.filesystemiterator","varlistentry"],["","class.filesystemiterator","varlistentry"],["","class.filesystemiterator","varlistentry"],["","class.filesystemiterator","varlistentry"],["","class.filesystemiterator","varlistentry"],["","class.filesystemiterator","varlistentry"],["","class.filesystemiterator","varlistentry"],["","class.filesystemiterator","varlistentry"],["","class.filesystemiterator","varlistentry"],["","class.filesystemiterator","varlistentry"],["","class.filesystemiterator","section"],["","filesystemiterator.construct","example"],["FilesystemIterator::__construct","filesystemiterator.construct","refentry"],["","filesystemiterator.current","example"],["FilesystemIterator::current","filesystemiterator.current","refentry"],["FilesystemIterator::getFlags","filesystemiterator.getflags","refentry"],["","filesystemiterator.key","example"],["FilesystemIterator::key","filesystemiterator.key","refentry"],["","filesystemiterator.next","example"],["FilesystemIterator::next","filesystemiterator.next","refentry"],["","filesystemiterator.rewind","example"],["FilesystemIterator::rewind","filesystemiterator.rewind","refentry"],["","filesystemiterator.setflags","example"],["FilesystemIterator::setFlags","filesystemiterator.setflags","refentry"],["FilesystemIterator","class.filesystemiterator","phpdoc:classref"],["","class.filteriterator","section"],["","class.filteriterator","section"],["","filteriterator.accept","example"],["FilterIterator::accept","filteriterator.accept","refentry"],["FilterIterator::__construct","filteriterator.construct","refentry"],["FilterIterator::current","filteriterator.current","refentry"],["FilterIterator::getInnerIterator","filteriterator.getinneriterator","refentry"],["FilterIterator::key","filteriterator.key","refentry"],["FilterIterator::next","filteriterator.next","refentry"],["FilterIterator::rewind","filteriterator.rewind","refentry"],["FilterIterator::valid","filteriterator.valid","refentry"],["FilterIterator","class.filteriterator","phpdoc:classref"],["","class.globiterator","section"],["","class.globiterator","section"],["","globiterator.construct","example"],["GlobIterator::__construct","globiterator.construct","refentry"],["","globiterator.count","example"],["GlobIterator::count","globiterator.count","refentry"],["GlobIterator","class.globiterator","phpdoc:classref"],["","class.infiniteiterator","section"],["","class.infiniteiterator","section"],["","infiniteiterator.construct","example"],["InfiniteIterator::__construct","infiniteiterator.construct","refentry"],["InfiniteIterator::next","infiniteiterator.next","refentry"],["InfiniteIterator","class.infiniteiterator","phpdoc:classref"],["","class.iteratoriterator","section"],["","class.iteratoriterator","section"],["IteratorIterator::__construct","iteratoriterator.construct","refentry"],["IteratorIterator::current","iteratoriterator.current","refentry"],["IteratorIterator::getInnerIterator","iteratoriterator.getinneriterator","refentry"],["IteratorIterator::key","iteratoriterator.key","refentry"],["IteratorIterator::next","iteratoriterator.next","refentry"],["IteratorIterator::rewind","iteratoriterator.rewind","refentry"],["IteratorIterator::valid","iteratoriterator.valid","refentry"],["IteratorIterator","class.iteratoriterator","phpdoc:classref"],["","class.limititerator","section"],["","class.limititerator","section"],["","class.limititerator","example"],["","class.limititerator","section"],["","limititerator.construct","example"],["LimitIterator::__construct","limititerator.construct","refentry"],["LimitIterator::current","limititerator.current","refentry"],["LimitIterator::getInnerIterator","limititerator.getinneriterator","refentry"],["","limititerator.getposition","example"],["LimitIterator::getPosition","limititerator.getposition","refentry"],["LimitIterator::key","limititerator.key","refentry"],["LimitIterator::next","limititerator.next","refentry"],["LimitIterator::rewind","limititerator.rewind","refentry"],["LimitIterator::seek","limititerator.seek","refentry"],["LimitIterator::valid","limititerator.valid","refentry"],["LimitIterator","class.limititerator","phpdoc:classref"],["","class.multipleiterator","section"],["","class.multipleiterator","section"],["","class.multipleiterator","varlistentry"],["","class.multipleiterator","varlistentry"],["","class.multipleiterator","varlistentry"],["","class.multipleiterator","varlistentry"],["","class.multipleiterator","section"],["MultipleIterator::attachIterator","multipleiterator.attachiterator","refentry"],["","multipleiterator.construct","para"],["","multipleiterator.construct","para"],["","multipleiterator.construct","para"],["","multipleiterator.construct","para"],["","multipleiterator.construct","example"],["MultipleIterator::__construct","multipleiterator.construct","refentry"],["MultipleIterator::containsIterator","multipleiterator.containsiterator","refentry"],["MultipleIterator::countIterators","multipleiterator.countiterators","refentry"],["MultipleIterator::current","multipleiterator.current","refentry"],["MultipleIterator::detachIterator","multipleiterator.detachiterator","refentry"],["MultipleIterator::getFlags","multipleiterator.getflags","refentry"],["MultipleIterator::key","multipleiterator.key","refentry"],["MultipleIterator::next","multipleiterator.next","refentry"],["MultipleIterator::rewind","multipleiterator.rewind","refentry"],["MultipleIterator::setFlags","multipleiterator.setflags","refentry"],["MultipleIterator::valid","multipleiterator.valid","refentry"],["MultipleIterator","class.multipleiterator","phpdoc:classref"],["","class.norewinditerator","section"],["","class.norewinditerator","section"],["","norewinditerator.construct","example"],["NoRewindIterator::__construct","norewinditerator.construct","refentry"],["NoRewindIterator::current","norewinditerator.current","refentry"],["NoRewindIterator::getInnerIterator","norewinditerator.getinneriterator","refentry"],["NoRewindIterator::key","norewinditerator.key","refentry"],["NoRewindIterator::next","norewinditerator.next","refentry"],["","norewinditerator.rewind","example"],["NoRewindIterator::rewind","norewinditerator.rewind","refentry"],["NoRewindIterator::valid","norewinditerator.valid","refentry"],["NoRewindIterator","class.norewinditerator","phpdoc:classref"],["","class.parentiterator","section"],["","class.parentiterator","section"],["ParentIterator::accept","parentiterator.accept","refentry"],["ParentIterator::__construct","parentiterator.construct","refentry"],["ParentIterator::getChildren","parentiterator.getchildren","refentry"],["ParentIterator::hasChildren","parentiterator.haschildren","refentry"],["ParentIterator::next","parentiterator.next","refentry"],["ParentIterator::rewind","parentiterator.rewind","refentry"],["ParentIterator","class.parentiterator","phpdoc:classref"],["","class.recursivearrayiterator","section"],["","class.recursivearrayiterator","section"],["","recursivearrayiterator.getchildren","example"],["RecursiveArrayIterator::getChildren","recursivearrayiterator.getchildren","refentry"],["","recursivearrayiterator.haschildren","example"],["RecursiveArrayIterator::hasChildren","recursivearrayiterator.haschildren","refentry"],["RecursiveArrayIterator","class.recursivearrayiterator","phpdoc:classref"],["","class.recursivecachingiterator","section"],["","class.recursivecachingiterator","section"],["RecursiveCachingIterator::__construct","recursivecachingiterator.construct","refentry"],["RecursiveCachingIterator::getChildren","recursivecachingiterator.getchildren","refentry"],["RecursiveCachingIterator::hasChildren","recursivecachingiterator.haschildren","refentry"],["RecursiveCachingIterator","class.recursivecachingiterator","phpdoc:classref"],["","class.recursivecallbackfilteriterator","section"],["","class.recursivecallbackfilteriterator","section"],["","class.recursivecallbackfilteriterator","example"],["","class.recursivecallbackfilteriterator","example"],["","class.recursivecallbackfilteriterator","section"],["RecursiveCallbackFilterIterator::__construct","recursivecallbackfilteriterator.construct","refentry"],["RecursiveCallbackFilterIterator::getChildren","recursivecallbackfilteriterator.getchildren","refentry"],["","recursivecallbackfilteriterator.haschildren","example"],["RecursiveCallbackFilterIterator::hasChildren","recursivecallbackfilteriterator.haschildren","refentry"],["RecursiveCallbackFilterIterator","class.recursivecallbackfilteriterator","phpdoc:classref"],["","class.recursivedirectoryiterator","section"],["","class.recursivedirectoryiterator","section"],["","recursivedirectoryiterator.construct","example"],["RecursiveDirectoryIterator::__construct","recursivedirectoryiterator.construct","refentry"],["RecursiveDirectoryIterator::getChildren","recursivedirectoryiterator.getchildren","refentry"],["RecursiveDirectoryIterator::getSubPath","recursivedirectoryiterator.getsubpath","refentry"],["RecursiveDirectoryIterator::getSubPathname","recursivedirectoryiterator.getsubpathname","refentry"],["RecursiveDirectoryIterator::hasChildren","recursivedirectoryiterator.haschildren","refentry"],["RecursiveDirectoryIterator::key","recursivedirectoryiterator.key","refentry"],["RecursiveDirectoryIterator::next","recursivedirectoryiterator.next","refentry"],["RecursiveDirectoryIterator::rewind","recursivedirectoryiterator.rewind","refentry"],["RecursiveDirectoryIterator","class.recursivedirectoryiterator","phpdoc:classref"],["","class.recursivefilteriterator","section"],["","class.recursivefilteriterator","section"],["","recursivefilteriterator.construct","example"],["","recursivefilteriterator.construct","example"],["RecursiveFilterIterator::__construct","recursivefilteriterator.construct","refentry"],["RecursiveFilterIterator::getChildren","recursivefilteriterator.getchildren","refentry"],["RecursiveFilterIterator::hasChildren","recursivefilteriterator.haschildren","refentry"],["RecursiveFilterIterator","class.recursivefilteriterator","phpdoc:classref"],["","class.recursiveiteratoriterator","section"],["","class.recursiveiteratoriterator","section"],["","class.recursiveiteratoriterator","varlistentry"],["","class.recursiveiteratoriterator","varlistentry"],["","class.recursiveiteratoriterator","varlistentry"],["","class.recursiveiteratoriterator","varlistentry"],["","class.recursiveiteratoriterator","section"],["RecursiveIteratorIterator::beginChildren","recursiveiteratoriterator.beginchildren","refentry"],["RecursiveIteratorIterator::beginIteration","recursiveiteratoriterator.beginiteration","refentry"],["RecursiveIteratorIterator::callGetChildren","recursiveiteratoriterator.callgetchildren","refentry"],["RecursiveIteratorIterator::callHasChildren","recursiveiteratoriterator.callhaschildren","refentry"],["","recursiveiteratoriterator.construct","para"],["","recursiveiteratoriterator.construct","para"],["","recursiveiteratoriterator.construct","para"],["","recursiveiteratoriterator.construct","example"],["RecursiveIteratorIterator::__construct","recursiveiteratoriterator.construct","refentry"],["RecursiveIteratorIterator::current","recursiveiteratoriterator.current","refentry"],["RecursiveIteratorIterator::endChildren","recursiveiteratoriterator.endchildren","refentry"],["RecursiveIteratorIterator::endIteration","recursiveiteratoriterator.enditeration","refentry"],["RecursiveIteratorIterator::getDepth","recursiveiteratoriterator.getdepth","refentry"],["RecursiveIteratorIterator::getInnerIterator","recursiveiteratoriterator.getinneriterator","refentry"],["RecursiveIteratorIterator::getMaxDepth","recursiveiteratoriterator.getmaxdepth","refentry"],["RecursiveIteratorIterator::getSubIterator","recursiveiteratoriterator.getsubiterator","refentry"],["RecursiveIteratorIterator::key","recursiveiteratoriterator.key","refentry"],["RecursiveIteratorIterator::next","recursiveiteratoriterator.next","refentry"],["RecursiveIteratorIterator::nextElement","recursiveiteratoriterator.nextelement","refentry"],["RecursiveIteratorIterator::rewind","recursiveiteratoriterator.rewind","refentry"],["RecursiveIteratorIterator::setMaxDepth","recursiveiteratoriterator.setmaxdepth","refentry"],["RecursiveIteratorIterator::valid","recursiveiteratoriterator.valid","refentry"],["RecursiveIteratorIterator","class.recursiveiteratoriterator","phpdoc:classref"],["","class.recursiveregexiterator","section"],["","class.recursiveregexiterator","section"],["","recursiveregexiterator.construct","example"],["RecursiveRegexIterator::__construct","recursiveregexiterator.construct","refentry"],["","recursiveregexiterator.getchildren","example"],["RecursiveRegexIterator::getChildren","recursiveregexiterator.getchildren","refentry"],["","recursiveregexiterator.haschildren","example"],["RecursiveRegexIterator::hasChildren","recursiveregexiterator.haschildren","refentry"],["RecursiveRegexIterator","class.recursiveregexiterator","phpdoc:classref"],["","class.recursivetreeiterator","section"],["","class.recursivetreeiterator","section"],["","class.recursivetreeiterator","varlistentry"],["","class.recursivetreeiterator","varlistentry"],["","class.recursivetreeiterator","varlistentry"],["","class.recursivetreeiterator","varlistentry"],["","class.recursivetreeiterator","varlistentry"],["","class.recursivetreeiterator","varlistentry"],["","class.recursivetreeiterator","varlistentry"],["","class.recursivetreeiterator","varlistentry"],["","class.recursivetreeiterator","section"],["RecursiveTreeIterator::beginChildren","recursivetreeiterator.beginchildren","refentry"],["RecursiveTreeIterator::beginIteration","recursivetreeiterator.beginiteration","refentry"],["RecursiveTreeIterator::callGetChildren","recursivetreeiterator.callgetchildren","refentry"],["RecursiveTreeIterator::callHasChildren","recursivetreeiterator.callhaschildren","refentry"],["RecursiveTreeIterator::__construct","recursivetreeiterator.construct","refentry"],["RecursiveTreeIterator::current","recursivetreeiterator.current","refentry"],["RecursiveTreeIterator::endChildren","recursivetreeiterator.endchildren","refentry"],["RecursiveTreeIterator::endIteration","recursivetreeiterator.enditeration","refentry"],["RecursiveTreeIterator::getEntry","recursivetreeiterator.getentry","refentry"],["RecursiveTreeIterator::getPostfix","recursivetreeiterator.getpostfix","refentry"],["RecursiveTreeIterator::getPrefix","recursivetreeiterator.getprefix","refentry"],["RecursiveTreeIterator::key","recursivetreeiterator.key","refentry"],["RecursiveTreeIterator::next","recursivetreeiterator.next","refentry"],["RecursiveTreeIterator::nextElement","recursivetreeiterator.nextelement","refentry"],["RecursiveTreeIterator::rewind","recursivetreeiterator.rewind","refentry"],["RecursiveTreeIterator::setPrefixPart","recursivetreeiterator.setprefixpart","refentry"],["RecursiveTreeIterator::valid","recursivetreeiterator.valid","refentry"],["RecursiveTreeIterator","class.recursivetreeiterator","phpdoc:classref"],["","class.regexiterator","section"],["","class.regexiterator","section"],["","class.regexiterator","varlistentry"],["","class.regexiterator","varlistentry"],["","class.regexiterator","varlistentry"],["","class.regexiterator","varlistentry"],["","class.regexiterator","varlistentry"],["","class.regexiterator","section"],["","class.regexiterator","varlistentry"],["","class.regexiterator","section"],["","class.regexiterator","section"],["","regexiterator.accept","example"],["RegexIterator::accept","regexiterator.accept","refentry"],["","regexiterator.construct","example"],["RegexIterator::__construct","regexiterator.construct","refentry"],["","regexiterator.getflags","example"],["RegexIterator::getFlags","regexiterator.getflags","refentry"],["","regexiterator.getmode","example"],["RegexIterator::getMode","regexiterator.getmode","refentry"],["","regexiterator.getpregflags","example"],["RegexIterator::getPregFlags","regexiterator.getpregflags","refentry"],["RegexIterator::getRegex","regexiterator.getregex","refentry"],["","regexiterator.setflags","example"],["RegexIterator::setFlags","regexiterator.setflags","refentry"],["","regexiterator.setmode","example"],["RegexIterator::setMode","regexiterator.setmode","refentry"],["","regexiterator.setpregflags","example"],["RegexIterator::setPregFlags","regexiterator.setpregflags","refentry"],["RegexIterator","class.regexiterator","phpdoc:classref"],["","spl.iterators","part"],["","spl.interfaces","section"],["","class.countable","section"],["","class.countable","section"],["","countable.count","example"],["Countable::count","countable.count","refentry"],["Countable","class.countable","phpdoc:classref"],["","class.outeriterator","section"],["","class.outeriterator","section"],["OuterIterator::getInnerIterator","outeriterator.getinneriterator","refentry"],["OuterIterator","class.outeriterator","phpdoc:classref"],["","class.recursiveiterator","section"],["","class.recursiveiterator","section"],["RecursiveIterator::getChildren","recursiveiterator.getchildren","refentry"],["RecursiveIterator::hasChildren","recursiveiterator.haschildren","refentry"],["RecursiveIterator","class.recursiveiterator","phpdoc:classref"],["","class.seekableiterator","section"],["","class.seekableiterator","section"],["","class.seekableiterator","example"],["","class.seekableiterator","section"],["","seekableiterator.seek","example"],["SeekableIterator::seek","seekableiterator.seek","refentry"],["SeekableIterator","class.seekableiterator","phpdoc:classref"],["","spl.interfaces","part"],["","spl.exceptions","section"],["","class.badfunctioncallexception","section"],["","class.badfunctioncallexception","section"],["BadFunctionCallException","class.badfunctioncallexception","phpdoc:exceptionref"],["","class.badmethodcallexception","section"],["","class.badmethodcallexception","section"],["BadMethodCallException","class.badmethodcallexception","phpdoc:exceptionref"],["","class.domainexception","section"],["","class.domainexception","section"],["DomainException","class.domainexception","phpdoc:exceptionref"],["","class.invalidargumentexception","section"],["","class.invalidargumentexception","section"],["InvalidArgumentException","class.invalidargumentexception","phpdoc:exceptionref"],["","class.lengthexception","section"],["","class.lengthexception","section"],["LengthException","class.lengthexception","phpdoc:exceptionref"],["","class.logicexception","section"],["","class.logicexception","section"],["LogicException","class.logicexception","phpdoc:exceptionref"],["","class.outofboundsexception","section"],["","class.outofboundsexception","section"],["OutOfBoundsException","class.outofboundsexception","phpdoc:exceptionref"],["","class.outofrangeexception","section"],["","class.outofrangeexception","section"],["OutOfRangeException","class.outofrangeexception","phpdoc:exceptionref"],["","class.overflowexception","section"],["","class.overflowexception","section"],["OverflowException","class.overflowexception","phpdoc:exceptionref"],["","class.rangeexception","section"],["","class.rangeexception","section"],["RangeException","class.rangeexception","phpdoc:exceptionref"],["","class.runtimeexception","section"],["","class.runtimeexception","section"],["RuntimeException","class.runtimeexception","phpdoc:exceptionref"],["","class.underflowexception","section"],["","class.underflowexception","section"],["UnderflowException","class.underflowexception","phpdoc:exceptionref"],["","class.unexpectedvalueexception","section"],["","class.unexpectedvalueexception","section"],["UnexpectedValueException","class.unexpectedvalueexception","phpdoc:exceptionref"],["","spl.exceptions","part"],["","function.class-implements","example"],["class_implements","function.class-implements","refentry"],["","function.class-parents","example"],["class_parents","function.class-parents","refentry"],["","function.class-uses","example"],["class_uses","function.class-uses","refentry"],["","function.iterator-apply","example"],["iterator_apply","function.iterator-apply","refentry"],["","function.iterator-count","example"],["iterator_count","function.iterator-count","refentry"],["","function.iterator-to-array","example"],["iterator_to_array","function.iterator-to-array","refentry"],["spl_autoload_call","function.spl-autoload-call","refentry"],["spl_autoload_extensions","function.spl-autoload-extensions","refentry"],["spl_autoload_functions","function.spl-autoload-functions","refentry"],["","function.spl-autoload-register","example"],["","function.spl-autoload-register","example"],["spl_autoload_register","function.spl-autoload-register","refentry"],["spl_autoload_unregister","function.spl-autoload-unregister","refentry"],["spl_autoload","function.spl-autoload","refentry"],["","function.spl-classes","example"],["spl_classes","function.spl-classes","refentry"],["","function.spl-object-hash","example"],["spl_object_hash","function.spl-object-hash","refentry"],["","ref.spl","reference"],["","class.splfileinfo","section"],["","class.splfileinfo","section"],["","splfileinfo.construct","example"],["SplFileInfo::__construct","splfileinfo.construct","refentry"],["SplFileInfo::getATime","splfileinfo.getatime","refentry"],["","splfileinfo.getbasename","example"],["SplFileInfo::getBasename","splfileinfo.getbasename","refentry"],["","splfileinfo.getctime","example"],["SplFileInfo::getCTime","splfileinfo.getctime","refentry"],["","splfileinfo.getextension","example"],["","splfileinfo.getextension","example"],["SplFileInfo::getExtension","splfileinfo.getextension","refentry"],["SplFileInfo::getFileInfo","splfileinfo.getfileinfo","refentry"],["","splfileinfo.getfilename","example"],["SplFileInfo::getFilename","splfileinfo.getfilename","refentry"],["","splfileinfo.getgroup","example"],["SplFileInfo::getGroup","splfileinfo.getgroup","refentry"],["SplFileInfo::getInode","splfileinfo.getinode","refentry"],["","splfileinfo.getlinktarget","example"],["SplFileInfo::getLinkTarget","splfileinfo.getlinktarget","refentry"],["SplFileInfo::getMTime","splfileinfo.getmtime","refentry"],["","splfileinfo.getowner","example"],["SplFileInfo::getOwner","splfileinfo.getowner","refentry"],["","splfileinfo.getpath","example"],["SplFileInfo::getPath","splfileinfo.getpath","refentry"],["","splfileinfo.getpathinfo","example"],["SplFileInfo::getPathInfo","splfileinfo.getpathinfo","refentry"],["","splfileinfo.getpathname","example"],["SplFileInfo::getPathname","splfileinfo.getpathname","refentry"],["","splfileinfo.getperms","example"],["SplFileInfo::getPerms","splfileinfo.getperms","refentry"],["","splfileinfo.getrealpath","example"],["SplFileInfo::getRealPath","splfileinfo.getrealpath","refentry"],["SplFileInfo::getSize","splfileinfo.getsize","refentry"],["","splfileinfo.gettype","example"],["SplFileInfo::getType","splfileinfo.gettype","refentry"],["","splfileinfo.isdir","example"],["SplFileInfo::isDir","splfileinfo.isdir","refentry"],["","splfileinfo.isexecutable","example"],["SplFileInfo::isExecutable","splfileinfo.isexecutable","refentry"],["","splfileinfo.isfile","example"],["SplFileInfo::isFile","splfileinfo.isfile","refentry"],["","splfileinfo.islink","example"],["SplFileInfo::isLink","splfileinfo.islink","refentry"],["","splfileinfo.isreadable","example"],["SplFileInfo::isReadable","splfileinfo.isreadable","refentry"],["SplFileInfo::isWritable","splfileinfo.iswritable","refentry"],["","splfileinfo.openfile","example"],["SplFileInfo::openFile","splfileinfo.openfile","refentry"],["","splfileinfo.setfileclass","example"],["SplFileInfo::setFileClass","splfileinfo.setfileclass","refentry"],["","splfileinfo.setinfoclass","example"],["SplFileInfo::setInfoClass","splfileinfo.setinfoclass","refentry"],["","splfileinfo.tostring","example"],["SplFileInfo::__toString","splfileinfo.tostring","refentry"],["SplFileInfo","class.splfileinfo","phpdoc:classref"],["","class.splfileobject","section"],["","class.splfileobject","section"],["","class.splfileobject","varlistentry"],["","class.splfileobject","varlistentry"],["","class.splfileobject","varlistentry"],["","class.splfileobject","varlistentry"],["","class.splfileobject","section"],["","splfileobject.construct","example"],["SplFileObject::__construct","splfileobject.construct","refentry"],["","splfileobject.current","example"],["SplFileObject::current","splfileobject.current","refentry"],["","splfileobject.eof","example"],["SplFileObject::eof","splfileobject.eof","refentry"],["","splfileobject.fflush","example"],["SplFileObject::fflush","splfileobject.fflush","refentry"],["","splfileobject.fgetc","example"],["SplFileObject::fgetc","splfileobject.fgetc","refentry"],["","splfileobject.fgetcsv","example"],["","splfileobject.fgetcsv","example"],["SplFileObject::fgetcsv","splfileobject.fgetcsv","refentry"],["","splfileobject.fgets","example"],["SplFileObject::fgets","splfileobject.fgets","refentry"],["","splfileobject.fgetss","example"],["SplFileObject::fgetss","splfileobject.fgetss","refentry"],["","splfileobject.flock","example"],["SplFileObject::flock","splfileobject.flock","refentry"],["","splfileobject.fpassthru","example"],["SplFileObject::fpassthru","splfileobject.fpassthru","refentry"],["","splfileobject.fputcsv","example"],["SplFileObject::fputcsv","splfileobject.fputcsv","refentry"],["","splfileobject.fscanf","example"],["SplFileObject::fscanf","splfileobject.fscanf","refentry"],["","splfileobject.fseek","example"],["SplFileObject::fseek","splfileobject.fseek","refentry"],["","splfileobject.fstat","example"],["SplFileObject::fstat","splfileobject.fstat","refentry"],["","splfileobject.ftell","example"],["SplFileObject::ftell","splfileobject.ftell","refentry"],["","splfileobject.ftruncate","example"],["SplFileObject::ftruncate","splfileobject.ftruncate","refentry"],["","splfileobject.fwrite","example"],["SplFileObject::fwrite","splfileobject.fwrite","refentry"],["SplFileObject::getChildren","splfileobject.getchildren","refentry"],["","splfileobject.getcsvcontrol","example"],["SplFileObject::getCsvControl","splfileobject.getcsvcontrol","refentry"],["SplFileObject::getCurrentLine","splfileobject.getcurrentline","refentry"],["","splfileobject.getflags","example"],["SplFileObject::getFlags","splfileobject.getflags","refentry"],["","splfileobject.getmaxlinelen","example"],["SplFileObject::getMaxLineLen","splfileobject.getmaxlinelen","refentry"],["SplFileObject::hasChildren","splfileobject.haschildren","refentry"],["","splfileobject.key","example"],["","splfileobject.key","example"],["SplFileObject::key","splfileobject.key","refentry"],["","splfileobject.next","example"],["SplFileObject::next","splfileobject.next","refentry"],["","splfileobject.rewind","example"],["SplFileObject::rewind","splfileobject.rewind","refentry"],["","splfileobject.seek","example"],["SplFileObject::seek","splfileobject.seek","refentry"],["","splfileobject.setcsvcontrol","example"],["SplFileObject::setCsvControl","splfileobject.setcsvcontrol","refentry"],["","splfileobject.setflags","example"],["SplFileObject::setFlags","splfileobject.setflags","refentry"],["","splfileobject.setmaxlinelen","example"],["SplFileObject::setMaxLineLen","splfileobject.setmaxlinelen","refentry"],["SplFileObject::__toString","splfileobject.tostring","refentry"],["","splfileobject.valid","example"],["SplFileObject::valid","splfileobject.valid","refentry"],["SplFileObject","class.splfileobject","phpdoc:classref"],["","class.spltempfileobject","section"],["","class.spltempfileobject","section"],["","spltempfileobject.construct","example"],["SplTempFileObject::__construct","spltempfileobject.construct","refentry"],["SplTempFileObject","class.spltempfileobject","phpdoc:classref"],["","spl.files","part"],["","class.arrayobject","section"],["","class.arrayobject","section"],["","class.arrayobject","varlistentry"],["","class.arrayobject","varlistentry"],["","class.arrayobject","section"],["","class.arrayobject","section"],["","arrayobject.append","example"],["ArrayObject::append","arrayobject.append","refentry"],["","arrayobject.asort","example"],["ArrayObject::asort","arrayobject.asort","refentry"],["","arrayobject.construct","example"],["ArrayObject::__construct","arrayobject.construct","refentry"],["","arrayobject.count","example"],["ArrayObject::count","arrayobject.count","refentry"],["","arrayobject.exchangearray","example"],["ArrayObject::exchangeArray","arrayobject.exchangearray","refentry"],["","arrayobject.getarraycopy","example"],["ArrayObject::getArrayCopy","arrayobject.getarraycopy","refentry"],["","arrayobject.getflags","example"],["ArrayObject::getFlags","arrayobject.getflags","refentry"],["","arrayobject.getiterator","example"],["ArrayObject::getIterator","arrayobject.getiterator","refentry"],["","arrayobject.getiteratorclass","example"],["ArrayObject::getIteratorClass","arrayobject.getiteratorclass","refentry"],["","arrayobject.ksort","example"],["ArrayObject::ksort","arrayobject.ksort","refentry"],["","arrayobject.natcasesort","example"],["ArrayObject::natcasesort","arrayobject.natcasesort","refentry"],["","arrayobject.natsort","example"],["ArrayObject::natsort","arrayobject.natsort","refentry"],["","arrayobject.offsetexists","example"],["ArrayObject::offsetExists","arrayobject.offsetexists","refentry"],["","arrayobject.offsetget","example"],["ArrayObject::offsetGet","arrayobject.offsetget","refentry"],["","arrayobject.offsetset","example"],["ArrayObject::offsetSet","arrayobject.offsetset","refentry"],["","arrayobject.offsetunset","example"],["ArrayObject::offsetUnset","arrayobject.offsetunset","refentry"],["","arrayobject.serialize","example"],["ArrayObject::serialize","arrayobject.serialize","refentry"],["","arrayobject.setflags","example"],["ArrayObject::setFlags","arrayobject.setflags","refentry"],["","arrayobject.setiteratorclass","example"],["ArrayObject::setIteratorClass","arrayobject.setiteratorclass","refentry"],["","arrayobject.uasort","example"],["ArrayObject::uasort","arrayobject.uasort","refentry"],["","arrayobject.uksort","example"],["ArrayObject::uksort","arrayobject.uksort","refentry"],["ArrayObject::unserialize","arrayobject.unserialize","refentry"],["ArrayObject","class.arrayobject","phpdoc:classref"],["","class.splobserver","section"],["","class.splobserver","section"],["SplObserver::update","splobserver.update","refentry"],["SplObserver","class.splobserver","phpdoc:classref"],["","class.splsubject","section"],["","class.splsubject","section"],["SplSubject::attach","splsubject.attach","refentry"],["SplSubject::detach","splsubject.detach","refentry"],["SplSubject::notify","splsubject.notify","refentry"],["SplSubject","class.splsubject","phpdoc:classref"],["","spl.misc","part"],["SPL","book.spl","book"],["","intro.spl-types","preface"],["","spl-types.requirements","section"],["","spl-types.installation","section"],["","spl-types.configuration","section"],["","spl-types.resources","section"],["","spl-types.setup","chapter"],["","class.spltype","section"],["","class.spltype","section"],["","class.spltype","varlistentry"],["","class.spltype","section"],["SplType::__construct","spltype.construct","refentry"],["SplType","class.spltype","phpdoc:classref"],["","class.splint","section"],["","class.splint","section"],["","class.splint","varlistentry"],["","class.splint","section"],["","class.splint","example"],["","class.splint","section"],["SplInt","class.splint","phpdoc:classref"],["","class.splfloat","section"],["","class.splfloat","section"],["","class.splfloat","varlistentry"],["","class.splfloat","section"],["","class.splfloat","example"],["","class.splfloat","section"],["SplFloat","class.splfloat","phpdoc:classref"],["","class.splenum","section"],["","class.splenum","section"],["","class.splenum","varlistentry"],["","class.splenum","section"],["","class.splenum","example"],["","class.splenum","section"],["","splenum.getconstlist","example"],["SplEnum::getConstList","splenum.getconstlist","refentry"],["SplEnum","class.splenum","phpdoc:classref"],["","class.splbool","section"],["","class.splbool","section"],["","class.splbool","varlistentry"],["","class.splbool","varlistentry"],["","class.splbool","varlistentry"],["","class.splbool","section"],["","class.splbool","example"],["","class.splbool","section"],["SplBool","class.splbool","phpdoc:classref"],["","class.splstring","section"],["","class.splstring","section"],["","class.splstring","varlistentry"],["","class.splstring","section"],["","class.splstring","example"],["","class.splstring","section"],["SplString","class.splstring","phpdoc:classref"],["SPL Types","book.spl-types","book"],["","intro.stream","preface"],["","stream.requirements","section"],["","stream.installation","section"],["","stream.configuration","section"],["","stream.resources","section"],["","stream.setup","chapter"],["","stream.constants","appendix"],["","stream.filters","chapter"],["","stream.contexts","chapter"],["","stream.errors","chapter"],["","stream.examples","example"],["","stream.examples","example"],["","stream.examples","example"],["","stream.streamwrapper.example-1","example"],["","stream.streamwrapper.example-1","section"],["","stream.examples","chapter"],["","class.php-user-filter","section"],["","class.php-user-filter","section"],["","class.php-user-filter","varlistentry"],["","class.php-user-filter","varlistentry"],["","class.php-user-filter","section"],["php_user_filter::filter","php-user-filter.filter","refentry"],["php_user_filter::onClose","php-user-filter.onclose","refentry"],["php_user_filter::onCreate","php-user-filter.oncreate","refentry"],["php_user_filter","class.php-user-filter","phpdoc:classref"],["","class.streamwrapper","section"],["","class.streamwrapper","section"],["","class.streamwrapper","varlistentry"],["","class.streamwrapper","section"],["streamWrapper::__construct","streamwrapper.construct","refentry"],["streamWrapper::__destruct","streamwrapper.destruct","refentry"],["streamWrapper::dir_closedir","streamwrapper.dir-closedir","refentry"],["streamWrapper::dir_opendir","streamwrapper.dir-opendir","refentry"],["","streamwrapper.dir-readdir","example"],["streamWrapper::dir_readdir","streamwrapper.dir-readdir","refentry"],["streamWrapper::dir_rewinddir","streamwrapper.dir-rewinddir","refentry"],["streamWrapper::mkdir","streamwrapper.mkdir","refentry"],["streamWrapper::rename","streamwrapper.rename","refentry"],["streamWrapper::rmdir","streamwrapper.rmdir","refentry"],["streamWrapper::stream_cast","streamwrapper.stream-cast","refentry"],["streamWrapper::stream_close","streamwrapper.stream-close","refentry"],["streamWrapper::stream_eof","streamwrapper.stream-eof","refentry"],["streamWrapper::stream_flush","streamwrapper.stream-flush","refentry"],["streamWrapper::stream_lock","streamwrapper.stream-lock","refentry"],["streamWrapper::stream_metadata","streamwrapper.stream-metadata","refentry"],["streamWrapper::stream_open","streamwrapper.stream-open","refentry"],["streamWrapper::stream_read","streamwrapper.stream-read","refentry"],["streamWrapper::stream_seek","streamwrapper.stream-seek","refentry"],["streamWrapper::stream_set_option","streamwrapper.stream-set-option","refentry"],["streamWrapper::stream_stat","streamwrapper.stream-stat","refentry"],["streamWrapper::stream_tell","streamwrapper.stream-tell","refentry"],["streamWrapper::stream_truncate","streamwrapper.stream-truncate","refentry"],["streamWrapper::stream_write","streamwrapper.stream-write","refentry"],["streamWrapper::unlink","streamwrapper.unlink","refentry"],["streamWrapper::url_stat","streamwrapper.url-stat","refentry"],["streamWrapper","class.streamwrapper","phpdoc:classref"],["set_socket_blocking","function.set-socket-blocking","refentry"],["stream_await","function.hack.stream-await","refentry"],["stream_bucket_append","function.stream-bucket-append","refentry"],["stream_bucket_make_writeable","function.stream-bucket-make-writeable","refentry"],["stream_bucket_new","function.stream-bucket-new","refentry"],["","function.stream-bucket-prepend","example"],["stream_bucket_prepend","function.stream-bucket-prepend","refentry"],["","function.stream-context-create","example"],["stream_context_create","function.stream-context-create","refentry"],["","function.stream-context-get-default","example"],["stream_context_get_default","function.stream-context-get-default","refentry"],["","function.stream-context-get-options","example"],["stream_context_get_options","function.stream-context-get-options","refentry"],["","function.stream-context-get-params","example"],["stream_context_get_params","function.stream-context-get-params","refentry"],["","function.stream-context-set-default","example"],["stream_context_set_default","function.stream-context-set-default","refentry"],["stream_context_set_option","function.stream-context-set-option","refentry"],["stream_context_set_params","function.stream-context-set-params","refentry"],["","function.stream-copy-to-stream","example"],["stream_copy_to_stream","function.stream-copy-to-stream","refentry"],["stream_encoding","function.stream-encoding","refentry"],["","function.stream-filter-append","example"],["stream_filter_append","function.stream-filter-append","refentry"],["stream_filter_prepend","function.stream-filter-prepend","refentry"],["","function.stream-filter-register","example"],["","function.stream-filter-register","example"],["stream_filter_register","function.stream-filter-register","refentry"],["","function.stream-filter-remove","example"],["stream_filter_remove","function.stream-filter-remove","refentry"],["","function.stream-get-contents","example"],["stream_get_contents","function.stream-get-contents","refentry"],["","function.stream-get-filters","example"],["stream_get_filters","function.stream-get-filters","refentry"],["stream_get_line","function.stream-get-line","refentry"],["","function.stream-get-meta-data","example"],["stream_get_meta_data","function.stream-get-meta-data","refentry"],["","function.stream-get-transports","example"],["stream_get_transports","function.stream-get-transports","refentry"],["","function.stream-get-wrappers","example"],["","function.stream-get-wrappers","example"],["stream_get_wrappers","function.stream-get-wrappers","refentry"],["","function.stream-is-local","example"],["stream_is_local","function.stream-is-local","refentry"],["","function.stream-notification-callback","example"],["","function.stream-notification-callback","example"],["stream_notification_callback","function.stream-notification-callback","refentry"],["stream_register_wrapper","function.stream-register-wrapper","refentry"],["","function.stream-resolve-include-path","example"],["stream_resolve_include_path","function.stream-resolve-include-path","refentry"],["","function.stream-select","example"],["stream_select","function.stream-select","refentry"],["stream_set_blocking","function.stream-set-blocking","refentry"],["stream_set_chunk_size","function.stream-set-chunk-size","refentry"],["stream_set_read_buffer","function.stream-set-read-buffer","refentry"],["","function.stream-set-timeout","example"],["stream_set_timeout","function.stream-set-timeout","refentry"],["","function.stream-set-write-buffer","example"],["stream_set_write_buffer","function.stream-set-write-buffer","refentry"],["stream_socket_accept","function.stream-socket-accept","refentry"],["","function.stream-socket-client","example"],["","function.stream-socket-client","example"],["stream_socket_client","function.stream-socket-client","refentry"],["","function.stream-socket-enable-crypto","example"],["stream_socket_enable_crypto","function.stream-socket-enable-crypto","refentry"],["stream_socket_get_name","function.stream-socket-get-name","refentry"],["","function.stream-socket-pair","example"],["stream_socket_pair","function.stream-socket-pair","refentry"],["","function.stream-socket-recvfrom","example"],["stream_socket_recvfrom","function.stream-socket-recvfrom","refentry"],["","function.stream-socket-sendto","example"],["stream_socket_sendto","function.stream-socket-sendto","refentry"],["","function.stream-socket-server","example"],["","function.stream-socket-server","example"],["stream_socket_server","function.stream-socket-server","refentry"],["","function.stream-socket-shutdown","example"],["stream_socket_shutdown","function.stream-socket-shutdown","refentry"],["stream_supports_lock","function.stream-supports-lock","refentry"],["","function.stream-wrapper-register","example"],["stream_wrapper_register","function.stream-wrapper-register","refentry"],["stream_wrapper_restore","function.stream-wrapper-restore","refentry"],["stream_wrapper_unregister","function.stream-wrapper-unregister","refentry"],["","ref.stream","reference"],["","book.stream","book"],["","intro.tidy","preface"],["","tidy.requirements","section"],["","tidy.installation","section"],["","tidy.configuration","varlistentry"],["","tidy.configuration","varlistentry"],["","tidy.configuration","section"],["","tidy.resources","section"],["","tidy.setup","chapter"],["","tidy.constants","appendix"],["","tidy.examples.basic","example"],["","tidy.examples.basic","section"],["","tidy.examples","appendix"],["","class.tidy","section"],["","class.tidy","section"],["","tidy.body","example"],["tidy::body","tidy.body","refentry"],["","tidy.cleanrepair","example"],["tidy::cleanRepair","tidy.cleanrepair","refentry"],["","tidy.construct","example"],["tidy::__construct","tidy.construct","refentry"],["","tidy.diagnose","example"],["tidy::diagnose","tidy.diagnose","refentry"],["","tidy.props.errorbuffer","example"],["tidy::$errorBuffer","tidy.props.errorbuffer","refentry"],["","tidy.getconfig","example"],["tidy::getConfig","tidy.getconfig","refentry"],["tidy::getHtmlVer","tidy.gethtmlver","refentry"],["","tidy.getopt","example"],["tidy::getOpt","tidy.getopt","refentry"],["","tidy.getoptdoc","example"],["tidy::getOptDoc","tidy.getoptdoc","refentry"],["tidy::getRelease","tidy.getrelease","refentry"],["","tidy.getstatus","example"],["tidy::getStatus","tidy.getstatus","refentry"],["","tidy.head","example"],["tidy::head","tidy.head","refentry"],["","tidy.html","example"],["tidy::html","tidy.html","refentry"],["tidy::isXhtml","tidy.isxhtml","refentry"],["tidy::isXml","tidy.isxml","refentry"],["","tidy.parsefile","example"],["tidy::parseFile","tidy.parsefile","refentry"],["","tidy.parsestring","example"],["tidy::parseString","tidy.parsestring","refentry"],["","tidy.repairfile","example"],["tidy::repairFile","tidy.repairfile","refentry"],["","tidy.repairstring","example"],["tidy::repairString","tidy.repairstring","refentry"],["","tidy.root","example"],["tidy::root","tidy.root","refentry"],["tidy","class.tidy","phpdoc:classref"],["","class.tidynode","section"],["","class.tidynode","section"],["","class.tidynode","varlistentry"],["","class.tidynode","varlistentry"],["","class.tidynode","varlistentry"],["","class.tidynode","varlistentry"],["","class.tidynode","varlistentry"],["","class.tidynode","varlistentry"],["","class.tidynode","varlistentry"],["","class.tidynode","varlistentry"],["","class.tidynode","varlistentry"],["","class.tidynode","section"],["","tidynode.getparent","example"],["tidyNode::getParent","tidynode.getparent","refentry"],["","tidynode.haschildren","example"],["tidyNode::hasChildren","tidynode.haschildren","refentry"],["","tidynode.hassiblings","example"],["tidyNode::hasSiblings","tidynode.hassiblings","refentry"],["","tidynode.isasp","example"],["tidyNode::isAsp","tidynode.isasp","refentry"],["","tidynode.iscomment","example"],["tidyNode::isComment","tidynode.iscomment","refentry"],["","tidynode.ishtml","example"],["tidyNode::isHtml","tidynode.ishtml","refentry"],["","tidynode.isjste","example"],["tidyNode::isJste","tidynode.isjste","refentry"],["","tidynode.isphp","example"],["tidyNode::isPhp","tidynode.isphp","refentry"],["","tidynode.istext","example"],["tidyNode::isText","tidynode.istext","refentry"],["tidyNode","class.tidynode","phpdoc:classref"],["","function.ob-tidyhandler","example"],["ob_tidyhandler","function.ob-tidyhandler","refentry"],["","function.tidy-access-count","example"],["tidy_access_count","function.tidy-access-count","refentry"],["","function.tidy-config-count","example"],["tidy_config_count","function.tidy-config-count","refentry"],["","function.tidy-error-count","example"],["tidy_error_count","function.tidy-error-count","refentry"],["","function.tidy-get-output","example"],["tidy_get_output","function.tidy-get-output","refentry"],["tidy_load_config","function.tidy-load-config","refentry"],["tidy_reset_config","function.tidy-reset-config","refentry"],["tidy_save_config","function.tidy-save-config","refentry"],["tidy_set_encoding","function.tidy-set-encoding","refentry"],["","function.tidy-setopt","example"],["tidy_setopt","function.tidy-setopt","refentry"],["","function.tidy-warning-count","example"],["tidy_warning_count","function.tidy-warning-count","refentry"],["","ref.tidy","reference"],["","book.tidy","book"],["","intro.tokenizer","preface"],["","tokenizer.requirements","section"],["","tokenizer.installation","section"],["","tokenizer.configuration","section"],["","tokenizer.resources","section"],["","tokenizer.setup","chapter"],["","tokenizer.constants","appendix"],["","tokenizer.examples","example"],["","tokenizer.examples","appendix"],["","function.token-get-all","example"],["token_get_all","function.token-get-all","refentry"],["","function.token-name","example"],["token_name","function.token-name","refentry"],["","ref.tokenizer","reference"],["","book.tokenizer","book"],["","intro.url","preface"],["","url.requirements","section"],["","url.installation","section"],["","url.configuration","section"],["","url.resources","section"],["","url.setup","chapter"],["","url.constants","varlistentry"],["","url.constants","varlistentry"],["","url.constants","varlistentry"],["","url.constants","varlistentry"],["","url.constants","varlistentry"],["","url.constants","varlistentry"],["","url.constants","varlistentry"],["","url.constants","varlistentry"],["","url.constants","varlistentry"],["","url.constants","varlistentry"],["","url.constants","appendix"],["","function.base64-decode","example"],["base64_decode","function.base64-decode","refentry"],["","function.base64-encode","example"],["base64_encode","function.base64-encode","refentry"],["","function.get-headers","example"],["","function.get-headers","example"],["get_headers","function.get-headers","refentry"],["","function.get-meta-tags","example"],["","function.get-meta-tags","example"],["get_meta_tags","function.get-meta-tags","refentry"],["","function.http-build-query","example"],["","function.http-build-query","example"],["","function.http-build-query","example"],["","function.http-build-query","example"],["http_build_query","function.http-build-query","refentry"],["","function.parse-url","example"],["","function.parse-url","example"],["parse_url","function.parse-url","refentry"],["","function.rawurldecode","example"],["rawurldecode","function.rawurldecode","refentry"],["","function.rawurlencode","example"],["","function.rawurlencode","example"],["rawurlencode","function.rawurlencode","refentry"],["","function.urldecode","example"],["urldecode","function.urldecode","refentry"],["","function.urlencode","example"],["","function.urlencode","example"],["urlencode","function.urlencode","refentry"],["","ref.url","reference"],["","book.url","book"],["","intro.v8js","preface"],["","v8js.requirements","section"],["","v8js.installation","section"],["","v8js.configuration","varlistentry"],["","v8js.configuration","varlistentry"],["","v8js.configuration","section"],["","v8js.resources","section"],["","v8js.setup","chapter"],["","v8js.examples","example"],["","v8js.examples","chapter"],["","class.v8js","section"],["","class.v8js","section"],["","class.v8js","varlistentry"],["","class.v8js","varlistentry"],["","class.v8js","varlistentry"],["","class.v8js","section"],["V8Js::__construct","v8js.construct","refentry"],["V8Js::executeString","v8js.executestring","refentry"],["V8Js::getExtensions","v8js.getextensions","refentry"],["V8Js::getPendingException","v8js.getpendingexception","refentry"],["V8Js::registerExtension","v8js.registerextension","refentry"],["V8Js","class.v8js","phpdoc:classref"],["","class.v8jsexception","section"],["","class.v8jsexception","section"],["","class.v8jsexception","varlistentry"],["","class.v8jsexception","varlistentry"],["","class.v8jsexception","varlistentry"],["","class.v8jsexception","varlistentry"],["","class.v8jsexception","section"],["V8JsException::getJsFileName","v8jsexception.getjsfilename","refentry"],["V8JsException::getJsLineNumber","v8jsexception.getjslinenumber","refentry"],["V8JsException::getJsSourceLine","v8jsexception.getjssourceline","refentry"],["V8JsException::getJsTrace","v8jsexception.getjstrace","refentry"],["V8JsException","class.v8jsexception","phpdoc:classref"],["V8js","book.v8js","book"],["","intro.yaml","preface"],["","yaml.requirements","section"],["","yaml.installation","section"],["","yaml.configuration","varlistentry"],["","yaml.configuration","varlistentry"],["","yaml.configuration","varlistentry"],["","yaml.configuration","varlistentry"],["","yaml.configuration","varlistentry"],["","yaml.configuration","section"],["","yaml.resources","section"],["","yaml.setup","chapter"],["","yaml.constants","varlistentry"],["","yaml.constants","varlistentry"],["","yaml.constants","varlistentry"],["","yaml.constants","varlistentry"],["","yaml.constants","varlistentry"],["","yaml.constants","varlistentry"],["","yaml.constants","variablelist"],["","yaml.constants","varlistentry"],["","yaml.constants","varlistentry"],["","yaml.constants","varlistentry"],["","yaml.constants","varlistentry"],["","yaml.constants","varlistentry"],["","yaml.constants","varlistentry"],["","yaml.constants","varlistentry"],["","yaml.constants","varlistentry"],["","yaml.constants","varlistentry"],["","yaml.constants","variablelist"],["","yaml.constants","varlistentry"],["","yaml.constants","varlistentry"],["","yaml.constants","varlistentry"],["","yaml.constants","varlistentry"],["","yaml.constants","variablelist"],["","yaml.constants","varlistentry"],["","yaml.constants","varlistentry"],["","yaml.constants","varlistentry"],["","yaml.constants","varlistentry"],["","yaml.constants","variablelist"],["","yaml.constants","appendix"],["","yaml.examples","example"],["","yaml.examples","chapter"],["","yaml.callbacks.parse","example"],["","yaml.callbacks.parse","section"],["","yaml.callbacks.emit","example"],["","yaml.callbacks.emit","section"],["","yaml.callbacks","chapter"],["yaml_emit_file","function.yaml-emit-file","refentry"],["","function.yaml-emit","example"],["yaml_emit","function.yaml-emit","refentry"],["yaml_parse_file","function.yaml-parse-file","refentry"],["yaml_parse_url","function.yaml-parse-url","refentry"],["","function.yaml-parse","example"],["yaml_parse","function.yaml-parse","refentry"],["","ref.yaml","reference"],["Yaml","book.yaml","book"],["","intro.yaf","preface"],["","yaf.requirements","section"],["","yaf.installation","section"],["","yaf.configuration","varlistentry"],["","yaf.configuration","varlistentry"],["","yaf.configuration","varlistentry"],["","yaf.configuration","varlistentry"],["","yaf.configuration","varlistentry"],["","yaf.configuration","varlistentry"],["","yaf.configuration","varlistentry"],["","yaf.configuration","varlistentry"],["","yaf.configuration","varlistentry"],["","yaf.configuration","varlistentry"],["","yaf.configuration","section"],["","yaf.resources","section"],["","yaf.setup","chapter"],["","yaf.constants","varlistentry"],["","yaf.constants","varlistentry"],["","yaf.constants","varlistentry"],["","yaf.constants","varlistentry"],["","yaf.constants","varlistentry"],["","yaf.constants","varlistentry"],["","yaf.constants","varlistentry"],["","yaf.constants","varlistentry"],["","yaf.constants","varlistentry"],["","yaf.constants","varlistentry"],["","yaf.constants","varlistentry"],["","yaf.constants","varlistentry"],["","yaf.constants","appendix"],["","yaf.tutorials","example"],["","yaf.tutorials","example"],["","yaf.tutorials","example"],["","yaf.tutorials","example"],["","yaf.tutorials","example"],["","yaf.tutorials","example"],["","yaf.tutorials","example"],["","yaf.tutorials","chapter"],["","yaf.appconfig","example"],["","yaf.appconfig","example"],["","yaf.appconfig","varlistentry"],["","yaf.appconfig","varlistentry"],["","yaf.appconfig","varlistentry"],["","yaf.appconfig","varlistentry"],["","yaf.appconfig","varlistentry"],["","yaf.appconfig","varlistentry"],["","yaf.appconfig","varlistentry"],["","yaf.appconfig","varlistentry"],["","yaf.appconfig","varlistentry"],["","yaf.appconfig","varlistentry"],["","yaf.appconfig","varlistentry"],["","yaf.appconfig","varlistentry"],["","yaf.appconfig","varlistentry"],["","yaf.appconfig","varlistentry"],["","yaf.appconfig","varlistentry"],["","yaf.appconfig","varlistentry"],["","yaf.appconfig","chapter"],["","class.yaf-application","section"],["","class.yaf-application","section"],["","class.yaf-application","varlistentry"],["","class.yaf-application","varlistentry"],["","class.yaf-application","varlistentry"],["","class.yaf-application","varlistentry"],["","class.yaf-application","varlistentry"],["","class.yaf-application","varlistentry"],["","class.yaf-application","section"],["Yaf_Application::app","yaf-application.app","refentry"],["","yaf-application.bootstrap","example"],["","yaf-application.bootstrap","example"],["Yaf_Application::bootstrap","yaf-application.bootstrap","refentry"],["","yaf-application.clearlasterror","example"],["Yaf_Application::clearLastError","yaf-application.clearlasterror","refentry"],["Yaf_Application::__clone","yaf-application.clone","refentry"],["","yaf-application.construct","programlisting"],["","yaf-application.construct","example"],["","yaf-application.construct","example"],["","yaf-application.construct","example"],["Yaf_Application::__construct","yaf-application.construct","refentry"],["Yaf_Application::__destruct","yaf-application.destruct","refentry"],["","yaf-application.environ","example"],["Yaf_Application::environ","yaf-application.environ","refentry"],["","yaf-application.execute","example"],["Yaf_Application::execute","yaf-application.execute","refentry"],["Yaf_Application::getAppDirectory","yaf-application.getappdirectory","refentry"],["","yaf-application.getconfig","example"],["Yaf_Application::getConfig","yaf-application.getconfig","refentry"],["","yaf-application.getdispatcher","example"],["Yaf_Application::getDispatcher","yaf-application.getdispatcher","refentry"],["","yaf-application.getlasterrormsg","example"],["Yaf_Application::getLastErrorMsg","yaf-application.getlasterrormsg","refentry"],["","yaf-application.getlasterrorno","example"],["Yaf_Application::getLastErrorNo","yaf-application.getlasterrorno","refentry"],["","yaf-application.getmodules","example"],["Yaf_Application::getModules","yaf-application.getmodules","refentry"],["Yaf_Application::run","yaf-application.run","refentry"],["Yaf_Application::setAppDirectory","yaf-application.setappdirectory","refentry"],["Yaf_Application::__sleep","yaf-application.sleep","refentry"],["Yaf_Application::__wakeup","yaf-application.wakeup","refentry"],["Yaf_Application","class.yaf-application","phpdoc:classref"],["","class.yaf-bootstrap-abstract","section"],["","class.yaf-bootstrap-abstract","example"],["","class.yaf-bootstrap-abstract","section"],["Yaf_Bootstrap_Abstract","class.yaf-bootstrap-abstract","phpdoc:classref"],["","class.yaf-dispatcher","section"],["","class.yaf-dispatcher","section"],["","class.yaf-dispatcher","varlistentry"],["","class.yaf-dispatcher","varlistentry"],["","class.yaf-dispatcher","varlistentry"],["","class.yaf-dispatcher","varlistentry"],["","class.yaf-dispatcher","varlistentry"],["","class.yaf-dispatcher","varlistentry"],["","class.yaf-dispatcher","varlistentry"],["","class.yaf-dispatcher","varlistentry"],["","class.yaf-dispatcher","varlistentry"],["","class.yaf-dispatcher","varlistentry"],["","class.yaf-dispatcher","varlistentry"],["","class.yaf-dispatcher","section"],["","yaf-dispatcher.autorender","example"],["Yaf_Dispatcher::autoRender","yaf-dispatcher.autorender","refentry"],["","yaf-dispatcher.catchexception","example"],["Yaf_Dispatcher::catchException","yaf-dispatcher.catchexception","refentry"],["Yaf_Dispatcher::__clone","yaf-dispatcher.clone","refentry"],["Yaf_Dispatcher::__construct","yaf-dispatcher.construct","refentry"],["Yaf_Dispatcher::disableView","yaf-dispatcher.disableview","refentry"],["Yaf_Dispatcher::dispatch","yaf-dispatcher.dispatch","refentry"],["Yaf_Dispatcher::enableView","yaf-dispatcher.enableview","refentry"],["Yaf_Dispatcher::flushInstantly","yaf-dispatcher.flushinstantly","refentry"],["Yaf_Dispatcher::getApplication","yaf-dispatcher.getapplication","refentry"],["Yaf_Dispatcher::getInstance","yaf-dispatcher.getinstance","refentry"],["Yaf_Dispatcher::getRequest","yaf-dispatcher.getrequest","refentry"],["Yaf_Dispatcher::getRouter","yaf-dispatcher.getrouter","refentry"],["Yaf_Dispatcher::initView","yaf-dispatcher.initview","refentry"],["","yaf-dispatcher.registerplugin","example"],["Yaf_Dispatcher::registerPlugin","yaf-dispatcher.registerplugin","refentry"],["Yaf_Dispatcher::returnResponse","yaf-dispatcher.returnresponse","refentry"],["Yaf_Dispatcher::setDefaultAction","yaf-dispatcher.setdefaultaction","refentry"],["Yaf_Dispatcher::setDefaultController","yaf-dispatcher.setdefaultcontroller","refentry"],["Yaf_Dispatcher::setDefaultModule","yaf-dispatcher.setdefaultmodule","refentry"],["Yaf_Dispatcher::setErrorHandler","yaf-dispatcher.seterrorhandler","refentry"],["Yaf_Dispatcher::setRequest","yaf-dispatcher.setrequest","refentry"],["","yaf-dispatcher.setview","example"],["","yaf-dispatcher.setview","example"],["Yaf_Dispatcher::setView","yaf-dispatcher.setview","refentry"],["Yaf_Dispatcher::__sleep","yaf-dispatcher.sleep","refentry"],["","yaf-dispatcher.throwexception","example"],["","yaf-dispatcher.throwexception","example"],["Yaf_Dispatcher::throwException","yaf-dispatcher.throwexception","refentry"],["Yaf_Dispatcher::__wakeup","yaf-dispatcher.wakeup","refentry"],["Yaf_Dispatcher","class.yaf-dispatcher","phpdoc:classref"],["","class.yaf-config-abstract","section"],["","class.yaf-config-abstract","section"],["","class.yaf-config-abstract","varlistentry"],["","class.yaf-config-abstract","varlistentry"],["","class.yaf-config-abstract","section"],["Yaf_Config_Abstract::get","yaf-config-abstract.get","refentry"],["Yaf_Config_Abstract::readonly","yaf-config-abstract.readonly","refentry"],["Yaf_Config_Abstract::set","yaf-config-abstract.set","refentry"],["Yaf_Config_Abstract::toArray","yaf-config-abstract.toarray","refentry"],["Yaf_Config_Abstract","class.yaf-config-abstract","phpdoc:classref"],["","class.yaf-config-ini","section"],["","class.yaf-config-ini","section"],["","class.yaf-config-ini","varlistentry"],["","class.yaf-config-ini","varlistentry"],["","class.yaf-config-ini","section"],["","class.yaf-config-ini","example"],["Yaf_Config_Ini::__construct","yaf-config-ini.construct","refentry"],["Yaf_Config_Ini::count","yaf-config-ini.count","refentry"],["Yaf_Config_Ini::current","yaf-config-ini.current","refentry"],["Yaf_Config_Ini::__get","yaf-config-ini.get","refentry"],["Yaf_Config_Ini::__isset","yaf-config-ini.isset","refentry"],["Yaf_Config_Ini::key","yaf-config-ini.key","refentry"],["Yaf_Config_Ini::next","yaf-config-ini.next","refentry"],["Yaf_Config_Ini::offsetExists","yaf-config-ini.offsetexists","refentry"],["Yaf_Config_Ini::offsetGet","yaf-config-ini.offsetget","refentry"],["Yaf_Config_Ini::offsetSet","yaf-config-ini.offsetset","refentry"],["Yaf_Config_Ini::offsetUnset","yaf-config-ini.offsetunset","refentry"],["Yaf_Config_Ini::readonly","yaf-config-ini.readonly","refentry"],["Yaf_Config_Ini::rewind","yaf-config-ini.rewind","refentry"],["Yaf_Config_Ini::__set","yaf-config-ini.set","refentry"],["Yaf_Config_Ini::toArray","yaf-config-ini.toarray","refentry"],["Yaf_Config_Ini::valid","yaf-config-ini.valid","refentry"],["Yaf_Config_Ini","class.yaf-config-ini","phpdoc:classref"],["","class.yaf-config-simple","section"],["","class.yaf-config-simple","section"],["","class.yaf-config-simple","varlistentry"],["","class.yaf-config-simple","varlistentry"],["","class.yaf-config-simple","section"],["Yaf_Config_Simple::__construct","yaf-config-simple.construct","refentry"],["Yaf_Config_Simple::count","yaf-config-simple.count","refentry"],["Yaf_Config_Simple::current","yaf-config-simple.current","refentry"],["Yaf_Config_Simple::__get","yaf-config-simple.get","refentry"],["Yaf_Config_Simple::__isset","yaf-config-simple.isset","refentry"],["Yaf_Config_Simple::key","yaf-config-simple.key","refentry"],["Yaf_Config_Simple::next","yaf-config-simple.next","refentry"],["Yaf_Config_Simple::offsetExists","yaf-config-simple.offsetexists","refentry"],["Yaf_Config_Simple::offsetGet","yaf-config-simple.offsetget","refentry"],["Yaf_Config_Simple::offsetSet","yaf-config-simple.offsetset","refentry"],["Yaf_Config_Simple::offsetUnset","yaf-config-simple.offsetunset","refentry"],["Yaf_Config_Simple::readonly","yaf-config-simple.readonly","refentry"],["Yaf_Config_Simple::rewind","yaf-config-simple.rewind","refentry"],["Yaf_Config_Simple::__set","yaf-config-simple.set","refentry"],["Yaf_Config_Simple::toArray","yaf-config-simple.toarray","refentry"],["Yaf_Config_Simple::valid","yaf-config-simple.valid","refentry"],["Yaf_Config_Simple","class.yaf-config-simple","phpdoc:classref"],["","class.yaf-controller-abstract","section"],["","class.yaf-controller-abstract","section"],["","class.yaf-controller-abstract","example"],["","class.yaf-controller-abstract","example"],["","class.yaf-controller-abstract","varlistentry"],["","class.yaf-controller-abstract","varlistentry"],["","class.yaf-controller-abstract","varlistentry"],["","class.yaf-controller-abstract","varlistentry"],["","class.yaf-controller-abstract","varlistentry"],["","class.yaf-controller-abstract","varlistentry"],["","class.yaf-controller-abstract","varlistentry"],["","class.yaf-controller-abstract","section"],["Yaf_Controller_Abstract::__clone","yaf-controller-abstract.clone","refentry"],["Yaf_Controller_Abstract::__construct","yaf-controller-abstract.construct","refentry"],["Yaf_Controller_Abstract::display","yaf-controller-abstract.display","refentry"],["","yaf-controller-abstract.forward","example"],["Yaf_Controller_Abstract::forward","yaf-controller-abstract.forward","refentry"],["Yaf_Controller_Abstract::getInvokeArg","yaf-controller-abstract.getinvokearg","refentry"],["Yaf_Controller_Abstract::getInvokeArgs","yaf-controller-abstract.getinvokeargs","refentry"],["Yaf_Controller_Abstract::getModuleName","yaf-controller-abstract.getmodulename","refentry"],["Yaf_Controller_Abstract::getRequest","yaf-controller-abstract.getrequest","refentry"],["Yaf_Controller_Abstract::getResponse","yaf-controller-abstract.getresponse","refentry"],["Yaf_Controller_Abstract::getView","yaf-controller-abstract.getview","refentry"],["Yaf_Controller_Abstract::getViewpath","yaf-controller-abstract.getviewpath","refentry"],["Yaf_Controller_Abstract::init","yaf-controller-abstract.init","refentry"],["Yaf_Controller_Abstract::initView","yaf-controller-abstract.initview","refentry"],["Yaf_Controller_Abstract::redirect","yaf-controller-abstract.redirect","refentry"],["Yaf_Controller_Abstract::render","yaf-controller-abstract.render","refentry"],["Yaf_Controller_Abstract::setViewpath","yaf-controller-abstract.setviewpath","refentry"],["Yaf_Controller_Abstract","class.yaf-controller-abstract","phpdoc:classref"],["","class.yaf-action-abstract","section"],["","class.yaf-action-abstract","section"],["","class.yaf-action-abstract","varlistentry"],["","class.yaf-action-abstract","varlistentry"],["","class.yaf-action-abstract","varlistentry"],["","class.yaf-action-abstract","varlistentry"],["","class.yaf-action-abstract","varlistentry"],["","class.yaf-action-abstract","varlistentry"],["","class.yaf-action-abstract","varlistentry"],["","class.yaf-action-abstract","section"],["","yaf-action-abstract.execute","example"],["","yaf-action-abstract.execute","example"],["Yaf_Action_Abstract::execute","yaf-action-abstract.execute","refentry"],["Yaf_Action_Abstract::getController","yaf-action-abstract.getcontroller","refentry"],["Yaf_Action_Abstract","class.yaf-action-abstract","phpdoc:classref"],["","class.yaf-view-interface","section"],["","class.yaf-view-interface","section"],["Yaf_View_Interface::assign","yaf-view-interface.assign","refentry"],["Yaf_View_Interface::display","yaf-view-interface.display","refentry"],["Yaf_View_Interface::getScriptPath","yaf-view-interface.getscriptpath","refentry"],["Yaf_View_Interface::render","yaf-view-interface.render","refentry"],["Yaf_View_Interface::setScriptPath","yaf-view-interface.setscriptpath","refentry"],["Yaf_View_Interface","class.yaf-view-interface","phpdoc:classref"],["","class.yaf-view-simple","section"],["","class.yaf-view-simple","section"],["","class.yaf-view-simple","varlistentry"],["","class.yaf-view-simple","varlistentry"],["","class.yaf-view-simple","section"],["","yaf-view-simple.assign","example"],["","yaf-view-simple.assign","example"],["Yaf_View_Simple::assign","yaf-view-simple.assign","refentry"],["","yaf-view-simple.assignref","example"],["","yaf-view-simple.assignref","example"],["Yaf_View_Simple::assignRef","yaf-view-simple.assignref","refentry"],["","yaf-view-simple.clear","example"],["Yaf_View_Simple::clear","yaf-view-simple.clear","refentry"],["","yaf-view-simple.construct","example"],["Yaf_View_Simple::__construct","yaf-view-simple.construct","refentry"],["Yaf_View_Simple::display","yaf-view-simple.display","refentry"],["Yaf_View_Simple::eval","yaf-view-simple.eval","refentry"],["Yaf_View_Simple::__get","yaf-view-simple.get","refentry"],["Yaf_View_Simple::getScriptPath","yaf-view-simple.getscriptpath","refentry"],["Yaf_View_Simple::__isset","yaf-view-simple.isset","refentry"],["Yaf_View_Simple::render","yaf-view-simple.render","refentry"],["","yaf-view-simple.set","example"],["Yaf_View_Simple::__set","yaf-view-simple.set","refentry"],["Yaf_View_Simple::setScriptPath","yaf-view-simple.setscriptpath","refentry"],["Yaf_View_Simple","class.yaf-view-simple","phpdoc:classref"],["","class.yaf-loader","example"],["","class.yaf-loader","example"],["","class.yaf-loader","example"],["","class.yaf-loader","example"],["","class.yaf-loader","example"],["","class.yaf-loader","example"],["","class.yaf-loader","example"],["","class.yaf-loader","section"],["","class.yaf-loader","section"],["","class.yaf-loader","varlistentry"],["","class.yaf-loader","varlistentry"],["","class.yaf-loader","varlistentry"],["","class.yaf-loader","varlistentry"],["","class.yaf-loader","section"],["Yaf_Loader::autoload","yaf-loader.autoload","refentry"],["Yaf_Loader::clearLocalNamespace","yaf-loader.clearlocalnamespace","refentry"],["Yaf_Loader::__clone","yaf-loader.clone","refentry"],["Yaf_Loader::__construct","yaf-loader.construct","refentry"],["Yaf_Loader::getInstance","yaf-loader.getinstance","refentry"],["Yaf_Loader::getLibraryPath","yaf-loader.getlibrarypath","refentry"],["Yaf_Loader::getLocalNamespace","yaf-loader.getlocalnamespace","refentry"],["Yaf_Loader::import","yaf-loader.import","refentry"],["Yaf_Loader::isLocalName","yaf-loader.islocalname","refentry"],["","yaf-loader.registerlocalnamespace","example"],["Yaf_Loader::registerLocalNamespace","yaf-loader.registerlocalnamespace","refentry"],["Yaf_Loader::setLibraryPath","yaf-loader.setlibrarypath","refentry"],["Yaf_Loader::__sleep","yaf-loader.sleep","refentry"],["Yaf_Loader::__wakeup","yaf-loader.wakeup","refentry"],["Yaf_Loader","class.yaf-loader","phpdoc:classref"],["","class.yaf-plugin-abstract","section"],["","class.yaf-plugin-abstract","example"],["","class.yaf-plugin-abstract","section"],["Yaf_Plugin_Abstract::dispatchLoopShutdown","yaf-plugin-abstract.dispatchloopshutdown","refentry"],["Yaf_Plugin_Abstract::dispatchLoopStartup","yaf-plugin-abstract.dispatchloopstartup","refentry"],["Yaf_Plugin_Abstract::postDispatch","yaf-plugin-abstract.postdispatch","refentry"],["Yaf_Plugin_Abstract::preDispatch","yaf-plugin-abstract.predispatch","refentry"],["Yaf_Plugin_Abstract::preResponse","yaf-plugin-abstract.preresponse","refentry"],["","yaf-plugin-abstract.routershutdown","example"],["Yaf_Plugin_Abstract::routerShutdown","yaf-plugin-abstract.routershutdown","refentry"],["Yaf_Plugin_Abstract::routerStartup","yaf-plugin-abstract.routerstartup","refentry"],["Yaf_Plugin_Abstract","class.yaf-plugin-abstract","phpdoc:classref"],["","class.yaf-registry","section"],["","class.yaf-registry","section"],["","class.yaf-registry","varlistentry"],["","class.yaf-registry","varlistentry"],["","class.yaf-registry","section"],["Yaf_Registry::__clone","yaf-registry.clone","refentry"],["Yaf_Registry::__construct","yaf-registry.construct","refentry"],["Yaf_Registry::del","yaf-registry.del","refentry"],["Yaf_Registry::get","yaf-registry.get","refentry"],["Yaf_Registry::has","yaf-registry.has","refentry"],["Yaf_Registry::set","yaf-registry.set","refentry"],["Yaf_Registry","class.yaf-registry","phpdoc:classref"],["","class.yaf-request-abstract","section"],["","class.yaf-request-abstract","section"],["","class.yaf-request-abstract","varlistentry"],["","class.yaf-request-abstract","varlistentry"],["","class.yaf-request-abstract","varlistentry"],["","class.yaf-request-abstract","varlistentry"],["","class.yaf-request-abstract","varlistentry"],["","class.yaf-request-abstract","varlistentry"],["","class.yaf-request-abstract","varlistentry"],["","class.yaf-request-abstract","varlistentry"],["","class.yaf-request-abstract","varlistentry"],["","class.yaf-request-abstract","varlistentry"],["","class.yaf-request-abstract","varlistentry"],["","class.yaf-request-abstract","section"],["","class.yaf-request-abstract","varlistentry"],["","class.yaf-request-abstract","varlistentry"],["","class.yaf-request-abstract","section"],["Yaf_Request_Abstract::getActionName","yaf-request-abstract.getactionname","refentry"],["Yaf_Request_Abstract::getBaseUri","yaf-request-abstract.getbaseuri","refentry"],["Yaf_Request_Abstract::getControllerName","yaf-request-abstract.getcontrollername","refentry"],["Yaf_Request_Abstract::getEnv","yaf-request-abstract.getenv","refentry"],["Yaf_Request_Abstract::getException","yaf-request-abstract.getexception","refentry"],["Yaf_Request_Abstract::getLanguage","yaf-request-abstract.getlanguage","refentry"],["Yaf_Request_Abstract::getMethod","yaf-request-abstract.getmethod","refentry"],["Yaf_Request_Abstract::getModuleName","yaf-request-abstract.getmodulename","refentry"],["Yaf_Request_Abstract::getParam","yaf-request-abstract.getparam","refentry"],["Yaf_Request_Abstract::getParams","yaf-request-abstract.getparams","refentry"],["Yaf_Request_Abstract::getRequestUri","yaf-request-abstract.getrequesturi","refentry"],["Yaf_Request_Abstract::getServer","yaf-request-abstract.getserver","refentry"],["Yaf_Request_Abstract::isCli","yaf-request-abstract.iscli","refentry"],["Yaf_Request_Abstract::isDispatched","yaf-request-abstract.isdispatched","refentry"],["Yaf_Request_Abstract::isGet","yaf-request-abstract.isget","refentry"],["Yaf_Request_Abstract::isHead","yaf-request-abstract.ishead","refentry"],["Yaf_Request_Abstract::isOptions","yaf-request-abstract.isoptions","refentry"],["Yaf_Request_Abstract::isPost","yaf-request-abstract.ispost","refentry"],["Yaf_Request_Abstract::isPut","yaf-request-abstract.isput","refentry"],["Yaf_Request_Abstract::isRouted","yaf-request-abstract.isrouted","refentry"],["Yaf_Request_Abstract::isXmlHttpRequest","yaf-request-abstract.isxmlhttprequest","refentry"],["Yaf_Request_Abstract::setActionName","yaf-request-abstract.setactionname","refentry"],["Yaf_Request_Abstract::setBaseUri","yaf-request-abstract.setbaseuri","refentry"],["Yaf_Request_Abstract::setControllerName","yaf-request-abstract.setcontrollername","refentry"],["Yaf_Request_Abstract::setDispatched","yaf-request-abstract.setdispatched","refentry"],["Yaf_Request_Abstract::setModuleName","yaf-request-abstract.setmodulename","refentry"],["Yaf_Request_Abstract::setParam","yaf-request-abstract.setparam","refentry"],["Yaf_Request_Abstract::setRequestUri","yaf-request-abstract.setrequesturi","refentry"],["Yaf_Request_Abstract::setRouted","yaf-request-abstract.setrouted","refentry"],["Yaf_Request_Abstract","class.yaf-request-abstract","phpdoc:classref"],["","class.yaf-request-http","section"],["","class.yaf-request-http","section"],["","class.yaf-request-http","varlistentry"],["","class.yaf-request-http","varlistentry"],["","class.yaf-request-http","varlistentry"],["","class.yaf-request-http","varlistentry"],["","class.yaf-request-http","varlistentry"],["","class.yaf-request-http","varlistentry"],["","class.yaf-request-http","varlistentry"],["","class.yaf-request-http","varlistentry"],["","class.yaf-request-http","varlistentry"],["","class.yaf-request-http","varlistentry"],["","class.yaf-request-http","varlistentry"],["","class.yaf-request-http","section"],["Yaf_Request_Http::__clone","yaf-request-http.clone","refentry"],["Yaf_Request_Http::__construct","yaf-request-http.construct","refentry"],["Yaf_Request_Http::get","yaf-request-http.get","refentry"],["Yaf_Request_Http::getCookie","yaf-request-http.getcookie","refentry"],["Yaf_Request_Http::getFiles","yaf-request-http.getfiles","refentry"],["Yaf_Request_Http::getPost","yaf-request-http.getpost","refentry"],["Yaf_Request_Http::getQuery","yaf-request-http.getquery","refentry"],["Yaf_Request_Http::getRequest","yaf-request-http.getrequest","refentry"],["Yaf_Request_Http::isXmlHttpRequest","yaf-request-http.isxmlhttprequest","refentry"],["Yaf_Request_Http","class.yaf-request-http","phpdoc:classref"],["","class.yaf-request-simple","section"],["","class.yaf-request-simple","section"],["","class.yaf-request-simple","varlistentry"],["","class.yaf-request-simple","varlistentry"],["","class.yaf-request-simple","varlistentry"],["","class.yaf-request-simple","varlistentry"],["","class.yaf-request-simple","varlistentry"],["","class.yaf-request-simple","varlistentry"],["","class.yaf-request-simple","varlistentry"],["","class.yaf-request-simple","varlistentry"],["","class.yaf-request-simple","varlistentry"],["","class.yaf-request-simple","varlistentry"],["","class.yaf-request-simple","varlistentry"],["","class.yaf-request-simple","section"],["","class.yaf-request-simple","varlistentry"],["","class.yaf-request-simple","varlistentry"],["","class.yaf-request-simple","section"],["Yaf_Request_Simple::__clone","yaf-request-simple.clone","refentry"],["Yaf_Request_Simple::__construct","yaf-request-simple.construct","refentry"],["Yaf_Request_Simple::get","yaf-request-simple.get","refentry"],["Yaf_Request_Simple::getCookie","yaf-request-simple.getcookie","refentry"],["Yaf_Request_Simple::getFiles","yaf-request-simple.getfiles","refentry"],["Yaf_Request_Simple::getPost","yaf-request-simple.getpost","refentry"],["Yaf_Request_Simple::getQuery","yaf-request-simple.getquery","refentry"],["Yaf_Request_Simple::getRequest","yaf-request-simple.getrequest","refentry"],["Yaf_Request_Simple::isXmlHttpRequest","yaf-request-simple.isxmlhttprequest","refentry"],["Yaf_Request_Simple","class.yaf-request-simple","phpdoc:classref"],["","class.yaf-response-abstract","section"],["","class.yaf-response-abstract","section"],["","class.yaf-response-abstract","varlistentry"],["","class.yaf-response-abstract","varlistentry"],["","class.yaf-response-abstract","varlistentry"],["","class.yaf-response-abstract","section"],["","yaf-response-abstract.appendbody","example"],["Yaf_Response_Abstract::appendBody","yaf-response-abstract.appendbody","refentry"],["Yaf_Response_Abstract::clearBody","yaf-response-abstract.clearbody","refentry"],["Yaf_Response_Abstract::clearHeaders","yaf-response-abstract.clearheaders","refentry"],["Yaf_Response_Abstract::__clone","yaf-response-abstract.clone","refentry"],["Yaf_Response_Abstract::__construct","yaf-response-abstract.construct","refentry"],["Yaf_Response_Abstract::__destruct","yaf-response-abstract.destruct","refentry"],["","yaf-response-abstract.getbody","example"],["Yaf_Response_Abstract::getBody","yaf-response-abstract.getbody","refentry"],["Yaf_Response_Abstract::getHeader","yaf-response-abstract.getheader","refentry"],["","yaf-response-abstract.prependbody","example"],["Yaf_Response_Abstract::prependBody","yaf-response-abstract.prependbody","refentry"],["","yaf-response-abstract.response","example"],["Yaf_Response_Abstract::response","yaf-response-abstract.response","refentry"],["Yaf_Response_Abstract::setAllHeaders","yaf-response-abstract.setallheaders","refentry"],["","yaf-response-abstract.setbody","example"],["Yaf_Response_Abstract::setBody","yaf-response-abstract.setbody","refentry"],["Yaf_Response_Abstract::setHeader","yaf-response-abstract.setheader","refentry"],["Yaf_Response_Abstract::setRedirect","yaf-response-abstract.setredirect","refentry"],["Yaf_Response_Abstract::__toString","yaf-response-abstract.tostring","refentry"],["Yaf_Response_Abstract","class.yaf-response-abstract","phpdoc:classref"],["","class.yaf-route-interface","section"],["","class.yaf-route-interface","section"],["Yaf_Route_Interface::assemble","yaf-assemble-interface.assemble","refentry"],["Yaf_Route_Interface::route","yaf-route-interface.route","refentry"],["Yaf_Route_Interface","class.yaf-route-interface","phpdoc:classref"],["","class.yaf-route-map","section"],["","class.yaf-route-map","section"],["","class.yaf-route-map","varlistentry"],["","class.yaf-route-map","varlistentry"],["","class.yaf-route-map","section"],["","yaf-assemble-map.assemble","example"],["Yaf_Route_Map::assemble","yaf-assemble-map.assemble","refentry"],["","yaf-route-map.construct","example"],["","yaf-route-map.construct","example"],["","yaf-route-map.construct","example"],["Yaf_Route_Map::__construct","yaf-route-map.construct","refentry"],["Yaf_Route_Map::route","yaf-route-map.route","refentry"],["Yaf_Route_Map","class.yaf-route-map","phpdoc:classref"],["","class.yaf-route-regex","section"],["","class.yaf-route-regex","section"],["","class.yaf-route-regex","varlistentry"],["","class.yaf-route-regex","varlistentry"],["","class.yaf-route-regex","varlistentry"],["","class.yaf-route-regex","varlistentry"],["","class.yaf-route-regex","section"],["","yaf-assemble-regex.assemble","example"],["Yaf_Route_Regex::assemble","yaf-assemble-regex.assemble","refentry"],["","yaf-route-regex.construct","example"],["","yaf-route-regex.construct","example"],["","yaf-route-regex.construct","example"],["Yaf_Route_Regex::__construct","yaf-route-regex.construct","refentry"],["Yaf_Route_Regex::route","yaf-route-regex.route","refentry"],["Yaf_Route_Regex","class.yaf-route-regex","phpdoc:classref"],["","class.yaf-route-rewrite","section"],["","class.yaf-route-rewrite","section"],["","class.yaf-route-rewrite","varlistentry"],["","class.yaf-route-rewrite","varlistentry"],["","class.yaf-route-rewrite","varlistentry"],["","class.yaf-route-rewrite","section"],["","yaf-assemble-rewrite.assemble","example"],["Yaf_Route_Rewrite::assemble","yaf-assemble-rewrite.assemble","refentry"],["","yaf-route-rewrite.construct","example"],["","yaf-route-rewrite.construct","example"],["","yaf-route-rewrite.construct","example"],["Yaf_Route_Rewrite::__construct","yaf-route-rewrite.construct","refentry"],["Yaf_Route_Rewrite::route","yaf-route-rewrite.route","refentry"],["Yaf_Route_Rewrite","class.yaf-route-rewrite","phpdoc:classref"],["","class.yaf-router","example"],["","class.yaf-router","example"],["","class.yaf-router","example"],["","class.yaf-router","example"],["","class.yaf-router","section"],["","class.yaf-router","example"],["","class.yaf-router","section"],["","class.yaf-router","section"],["","class.yaf-router","varlistentry"],["","class.yaf-router","varlistentry"],["","class.yaf-router","section"],["","yaf-router.addconfig","example"],["","yaf-router.addconfig","example"],["Yaf_Router::addConfig","yaf-router.addconfig","refentry"],["","yaf-router.addroute","example"],["Yaf_Router::addRoute","yaf-router.addroute","refentry"],["Yaf_Router::__construct","yaf-router.construct","refentry"],["","yaf-router.getcurrentroute","example"],["","yaf-router.getcurrentroute","example"],["Yaf_Router::getCurrentRoute","yaf-router.getcurrentroute","refentry"],["Yaf_Router::getRoute","yaf-router.getroute","refentry"],["Yaf_Router::getRoutes","yaf-router.getroutes","refentry"],["Yaf_Router::route","yaf-router.route","refentry"],["Yaf_Router","class.yaf-router","phpdoc:classref"],["","class.yaf-route-simple","section"],["","class.yaf-route-simple","section"],["","class.yaf-route-simple","varlistentry"],["","class.yaf-route-simple","varlistentry"],["","class.yaf-route-simple","varlistentry"],["","class.yaf-route-simple","section"],["","yaf-assemble-simple.assemble","example"],["Yaf_Route_Simple::assemble","yaf-assemble-simple.assemble","refentry"],["","yaf-route-simple.construct","example"],["","yaf-route-simple.construct","example"],["Yaf_Route_Simple::__construct","yaf-route-simple.construct","refentry"],["Yaf_Route_Simple::route","yaf-route-simple.route","refentry"],["Yaf_Route_Simple","class.yaf-route-simple","phpdoc:classref"],["","class.yaf-route-static","section"],["","class.yaf-route-static","section"],["","yaf-assemble-static.assemble","example"],["Yaf_Route_Static::assemble","yaf-assemble-static.assemble","refentry"],["Yaf_Route_Static::match","yaf-route-static.match","refentry"],["","yaf-route-static.route","example"],["Yaf_Route_Static::route","yaf-route-static.route","refentry"],["Yaf_Route_Static","class.yaf-route-static","phpdoc:classref"],["","class.yaf-route-supervar","section"],["","class.yaf-route-supervar","section"],["","class.yaf-route-supervar","varlistentry"],["","class.yaf-route-supervar","section"],["","yaf-assemble-supervar.assemble","example"],["Yaf_Route_Supervar::assemble","yaf-assemble-supervar.assemble","refentry"],["","yaf-route-supervar.construct","example"],["Yaf_Route_Supervar::__construct","yaf-route-supervar.construct","refentry"],["Yaf_Route_Supervar::route","yaf-route-supervar.route","refentry"],["Yaf_Route_Supervar","class.yaf-route-supervar","phpdoc:classref"],["","class.yaf-session","section"],["","class.yaf-session","section"],["","class.yaf-session","varlistentry"],["","class.yaf-session","varlistentry"],["","class.yaf-session","varlistentry"],["","class.yaf-session","section"],["Yaf_Session::__clone","yaf-session.clone","refentry"],["Yaf_Session::__construct","yaf-session.construct","refentry"],["Yaf_Session::count","yaf-session.count","refentry"],["Yaf_Session::current","yaf-session.current","refentry"],["Yaf_Session::del","yaf-session.del","refentry"],["Yaf_Session::__get","yaf-session.get","refentry"],["Yaf_Session::getInstance","yaf-session.getinstance","refentry"],["Yaf_Session::has","yaf-session.has","refentry"],["Yaf_Session::__isset","yaf-session.isset","refentry"],["Yaf_Session::key","yaf-session.key","refentry"],["Yaf_Session::next","yaf-session.next","refentry"],["Yaf_Session::offsetExists","yaf-session.offsetexists","refentry"],["Yaf_Session::offsetGet","yaf-session.offsetget","refentry"],["Yaf_Session::offsetSet","yaf-session.offsetset","refentry"],["Yaf_Session::offsetUnset","yaf-session.offsetunset","refentry"],["Yaf_Session::rewind","yaf-session.rewind","refentry"],["Yaf_Session::__set","yaf-session.set","refentry"],["Yaf_Session::__sleep","yaf-session.sleep","refentry"],["Yaf_Session::start","yaf-session.start","refentry"],["Yaf_Session::__unset","yaf-session.unset","refentry"],["Yaf_Session::valid","yaf-session.valid","refentry"],["Yaf_Session::__wakeup","yaf-session.wakeup","refentry"],["Yaf_Session","class.yaf-session","phpdoc:classref"],["","class.yaf-exception","section"],["","class.yaf-exception","section"],["Yaf_Exception::__construct","yaf-exception.construct","refentry"],["Yaf_Exception::getPrevious","yaf-exception.getprevious","refentry"],["Yaf_Exception","class.yaf-exception","phpdoc:classref"],["","class.yaf-exception-typeerror","section"],["","class.yaf-exception-typeerror","section"],["Yaf_Exception_TypeError","class.yaf-exception-typeerror","phpdoc:classref"],["","class.yaf-exception-startuperror","section"],["","class.yaf-exception-startuperror","section"],["Yaf_Exception_StartupError","class.yaf-exception-startuperror","phpdoc:classref"],["","class.yaf-exception-dispatchfailed","section"],["","class.yaf-exception-dispatchfailed","section"],["Yaf_Exception_DispatchFailed","class.yaf-exception-dispatchfailed","phpdoc:classref"],["","class.yaf-exception-routerfailed","section"],["","class.yaf-exception-routerfailed","section"],["Yaf_Exception_RouterFailed","class.yaf-exception-routerfailed","phpdoc:classref"],["","class.yaf-exception-loadfailed","section"],["","class.yaf-exception-loadfailed","section"],["Yaf_Exception_LoadFailed","class.yaf-exception-loadfailed","phpdoc:classref"],["","class.yaf-exception-loadfailed-module","section"],["","class.yaf-exception-loadfailed-module","section"],["Yaf_Exception_LoadFailed_Module","class.yaf-exception-loadfailed-module","phpdoc:classref"],["","class.yaf-exception-loadfailed-controller","section"],["","class.yaf-exception-loadfailed-controller","section"],["Yaf_Exception_LoadFailed_Controller","class.yaf-exception-loadfailed-controller","phpdoc:classref"],["","class.yaf-exception-loadfailed-action","section"],["","class.yaf-exception-loadfailed-action","section"],["Yaf_Exception_LoadFailed_Action","class.yaf-exception-loadfailed-action","phpdoc:classref"],["","class.yaf-exception-loadfailed-view","section"],["","class.yaf-exception-loadfailed-view","section"],["Yaf_Exception_LoadFailed_View","class.yaf-exception-loadfailed-view","phpdoc:classref"],["Yaf","book.yaf","book"],["","intro.taint","example"],["","intro.taint","preface"],["","taint.requirements","section"],["","taint.installation","section"],["","taint.configuration","varlistentry"],["","taint.configuration","varlistentry"],["","taint.configuration","section"],["","taint.resources","section"],["","taint.setup","chapter"],["","taint.detail.basic","section"],["","taint.detail.taint","section"],["","taint.detail.untaint","section"],["","taint.detail","chapter"],["is_tainted","function.is-tainted","refentry"],["taint","function.taint","refentry"],["untaint","function.untaint","refentry"],["","ref.taint","reference"],["Taint","book.taint","book"],["","refs.basic.other","set"],["","intro.amqp","preface"],["","amqp.requirements","section"],["","amqp.installation","section"],["","amqp.configuration","varlistentry"],["","amqp.configuration","varlistentry"],["","amqp.configuration","varlistentry"],["","amqp.configuration","varlistentry"],["","amqp.configuration","varlistentry"],["","amqp.configuration","varlistentry"],["","amqp.configuration","varlistentry"],["","amqp.configuration","varlistentry"],["","amqp.configuration","varlistentry"],["","amqp.configuration","section"],["","amqp.resources","section"],["","amqp.setup","chapter"],["","amqp.constants","varlistentry"],["","amqp.constants","varlistentry"],["","amqp.constants","varlistentry"],["","amqp.constants","varlistentry"],["","amqp.constants","varlistentry"],["","amqp.constants","varlistentry"],["","amqp.constants","varlistentry"],["","amqp.constants","varlistentry"],["","amqp.constants","varlistentry"],["","amqp.constants","varlistentry"],["","amqp.constants","varlistentry"],["","amqp.constants","varlistentry"],["","amqp.constants","varlistentry"],["","amqp.constants","varlistentry"],["","amqp.constants","varlistentry"],["","amqp.constants","varlistentry"],["","amqp.constants","varlistentry"],["","amqp.constants","varlistentry"],["","amqp.constants","appendix"],["","amqp.examples","example"],["","amqp.examples","chapter"],["","class.amqpconnection","section"],["","class.amqpconnection","section"],["","amqpconnection.connect","example"],["AMQPConnection::connect","amqpconnection.connect","refentry"],["","amqpconnection.construct","example"],["AMQPConnection::__construct","amqpconnection.construct","refentry"],["","amqpconnection.disconnect","example"],["AMQPConnection::disconnect","amqpconnection.disconnect","refentry"],["AMQPConnection::getHost","amqpconnection.gethost","refentry"],["AMQPConnection::getLogin","amqpconnection.getlogin","refentry"],["AMQPConnection::getPassword","amqpconnection.getpassword","refentry"],["AMQPConnection::getPort","amqpconnection.getport","refentry"],["AMQPConnection::getTimeout","amqpconnection.gettimeout","refentry"],["AMQPConnection::getVhost","amqpconnection.getvhost","refentry"],["","amqpconnection.isconnected","example"],["AMQPConnection::isConnected","amqpconnection.isconnected","refentry"],["","amqpconnection.reconnect","example"],["AMQPConnection::reconnect","amqpconnection.reconnect","refentry"],["","amqpconnection.sethost","example"],["AMQPConnection::setHost","amqpconnection.sethost","refentry"],["","amqpconnection.setlogin","example"],["AMQPConnection::setLogin","amqpconnection.setlogin","refentry"],["","amqpconnection.setpassword","example"],["AMQPConnection::setPassword","amqpconnection.setpassword","refentry"],["","amqpconnection.setport","example"],["AMQPConnection::setPort","amqpconnection.setport","refentry"],["","amqpconnection.settimeout","example"],["AMQPConnection::setTimeout","amqpconnection.settimeout","refentry"],["","amqpconnection.setvhost","example"],["AMQPConnection::setVhost","amqpconnection.setvhost","refentry"],["AMQPConnection","class.amqpconnection","phpdoc:classref"],["","class.amqpchannel","section"],["","class.amqpchannel","section"],["AMQPChannel::commitTransaction","amqpchannel.committransaction","refentry"],["AMQPChannel::__construct","amqpchannel.construct","refentry"],["AMQPChannel::isConnected","amqpchannel.isconnected","refentry"],["AMQPChannel::qos","amqpchannel.qos","refentry"],["AMQPChannel::rollbackTransaction","amqpchannel.rollbacktransaction","refentry"],["AMQPChannel::setPrefetchCount","amqpchannel.setprefetchcount","refentry"],["AMQPChannel::setPrefetchSize","amqpchannel.setprefetchsize","refentry"],["AMQPChannel::startTransaction","amqpchannel.starttransaction","refentry"],["AMQPChannel","class.amqpchannel","phpdoc:classref"],["","class.amqpexchange","section"],["","class.amqpexchange","section"],["AMQPExchange::bind","amqpexchange.bind","refentry"],["AMQPExchange::__construct","amqpexchange.construct","refentry"],["","amqpexchange.declare","example"],["AMQPExchange::declare","amqpexchange.declare","refentry"],["","amqpexchange.delete","example"],["AMQPExchange::delete","amqpexchange.delete","refentry"],["AMQPExchange::getArgument","amqpexchange.getargument","refentry"],["AMQPExchange::getArguments","amqpexchange.getarguments","refentry"],["AMQPExchange::getFlags","amqpexchange.getflags","refentry"],["AMQPExchange::getName","amqpexchange.getname","refentry"],["AMQPExchange::getType","amqpexchange.gettype","refentry"],["AMQPExchange::publish","amqpexchange.publish","refentry"],["AMQPExchange::setArgument","amqpexchange.setargument","refentry"],["AMQPExchange::setArguments","amqpexchange.setarguments","refentry"],["AMQPExchange::setFlags","amqpexchange.setflags","refentry"],["AMQPExchange::setName","amqpexchange.setname","refentry"],["AMQPExchange::setType","amqpexchange.settype","refentry"],["AMQPExchange","class.amqpexchange","phpdoc:classref"],["","class.amqpqueue","section"],["","class.amqpqueue","section"],["","amqpqueue.ack","example"],["","amqpqueue.ack","example"],["AMQPQueue::ack","amqpqueue.ack","refentry"],["AMQPQueue::bind","amqpqueue.bind","refentry"],["AMQPQueue::cancel","amqpqueue.cancel","refentry"],["AMQPQueue::__construct","amqpqueue.construct","refentry"],["","amqpqueue.consume","example"],["AMQPQueue::consume","amqpqueue.consume","refentry"],["AMQPQueue::declare","amqpqueue.declare","refentry"],["AMQPQueue::delete","amqpqueue.delete","refentry"],["","amqpqueue.get","example"],["AMQPQueue::get","amqpqueue.get","refentry"],["AMQPQueue::getArgument","amqpqueue.getargument","refentry"],["AMQPQueue::getArguments","amqpqueue.getarguments","refentry"],["AMQPQueue::getFlags","amqpqueue.getflags","refentry"],["AMQPQueue::getName","amqpqueue.getname","refentry"],["AMQPQueue::nack","amqpqueue.nack","refentry"],["AMQPQueue::purge","amqpqueue.purge","refentry"],["AMQPQueue::setArgument","amqpqueue.setargument","refentry"],["AMQPQueue::setArguments","amqpqueue.setarguments","refentry"],["AMQPQueue::setFlags","amqpqueue.setflags","refentry"],["AMQPQueue::setName","amqpqueue.setname","refentry"],["AMQPQueue::unbind","amqpqueue.unbind","refentry"],["AMQPQueue","class.amqpqueue","phpdoc:classref"],["","class.amqpenvelope","section"],["","class.amqpenvelope","section"],["AMQPEnvelope::getAppId","amqpenvelope.getappid","refentry"],["AMQPEnvelope::getBody","amqpenvelope.getbody","refentry"],["AMQPEnvelope::getContentEncoding","amqpenvelope.getcontentencoding","refentry"],["AMQPEnvelope::getContentType","amqpenvelope.getcontenttype","refentry"],["AMQPEnvelope::getCorrelationId","amqpenvelope.getcorrelationid","refentry"],["AMQPEnvelope::getDeliveryTag","amqpenvelope.getdeliverytag","refentry"],["AMQPEnvelope::getExchange","amqpenvelope.getexchange","refentry"],["AMQPEnvelope::getExpiration","amqpenvelope.getexpiration","refentry"],["AMQPEnvelope::getHeader","amqpenvelope.getheader","refentry"],["AMQPEnvelope::getHeaders","amqpenvelope.getheaders","refentry"],["AMQPEnvelope::getMessageId","amqpenvelope.getmessageid","refentry"],["AMQPEnvelope::getPriority","amqpenvelope.getpriority","refentry"],["AMQPEnvelope::getReplyTo","amqpenvelope.getreplyto","refentry"],["AMQPEnvelope::getRoutingKey","amqpenvelope.getroutingkey","refentry"],["AMQPEnvelope::getTimeStamp","amqpenvelope.gettimestamp","refentry"],["AMQPEnvelope::getType","amqpenvelope.gettype","refentry"],["AMQPEnvelope::getUserId","amqpenvelope.getuserid","refentry"],["AMQPEnvelope::isRedelivery","amqpenvelope.isredelivery","refentry"],["AMQPEnvelope","class.amqpenvelope","phpdoc:classref"],["AMQP","book.amqp","book"],["","intro.chdb","preface"],["","chdb.requirements","section"],["","chdb.installation","section"],["","chdb.configuration","section"],["","chdb.resources","section"],["","chdb.setup","chapter"],["","chdb.constants","appendix"],["","chdb.examples","example"],["","chdb.examples","example"],["","chdb.examples","chapter"],["","class.chdb","section"],["","class.chdb","section"],["chdb::__construct","chdb.construct","refentry"],["","chdb.get","example"],["chdb::get","chdb.get","refentry"],["chdb","class.chdb","phpdoc:classref"],["","function.chdb-create","example"],["chdb_create","function.chdb-create","refentry"],["","ref.chdb","reference"],["chdb","book.chdb","book"],["","intro.curl","preface"],["","curl.requirements","section"],["","curl.installation","section"],["","curl.configuration","varlistentry"],["","curl.configuration","section"],["","curl.resources","section"],["","curl.setup","chapter"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","varlistentry"],["","curl.constants","appendix"],["","curl.examples-basic","example"],["","curl.examples-basic","section"],["","curl.examples","chapter"],["","function.curl-close","example"],["curl_close","function.curl-close","refentry"],["","function.curl-copy-handle","example"],["curl_copy_handle","function.curl-copy-handle","refentry"],["","function.curl-errno","example"],["curl_errno","function.curl-errno","refentry"],["","function.curl-error","example"],["curl_error","function.curl-error","refentry"],["","function.curl-escape","example"],["curl_escape","function.curl-escape","refentry"],["","function.curl-exec","example"],["curl_exec","function.curl-exec","refentry"],["curl_file_create","function.curl-file-create","refentry"],["","function.curl-getinfo","example"],["curl_getinfo","function.curl-getinfo","refentry"],["","function.curl-init","example"],["curl_init","function.curl-init","refentry"],["","function.curl-multi-add-handle","example"],["curl_multi_add_handle","function.curl-multi-add-handle","refentry"],["","function.hack.curl-multi-await","example"],["curl_multi_await","function.hack.curl-multi-await","refentry"],["","function.curl-multi-close","example"],["curl_multi_close","function.curl-multi-close","refentry"],["","function.curl-multi-exec","example"],["curl_multi_exec","function.curl-multi-exec","refentry"],["curl_multi_getcontent","function.curl-multi-getcontent","refentry"],["","function.curl-multi-info-read","example"],["curl_multi_info_read","function.curl-multi-info-read","refentry"],["","function.curl-multi-init","example"],["curl_multi_init","function.curl-multi-init","refentry"],["curl_multi_remove_handle","function.curl-multi-remove-handle","refentry"],["curl_multi_select","function.curl-multi-select","refentry"],["curl_multi_setopt","function.curl-multi-setopt","refentry"],["","function.curl-multi-strerror","example"],["curl_multi_strerror","function.curl-multi-strerror","refentry"],["curl_pause","function.curl-pause","refentry"],["","function.curl-reset","example"],["curl_reset","function.curl-reset","refentry"],["","function.curl-setopt-array","example"],["","function.curl-setopt-array","example"],["curl_setopt_array","function.curl-setopt-array","refentry"],["","function.curl-setopt","example"],["","function.curl-setopt","example"],["curl_setopt","function.curl-setopt","refentry"],["","function.curl-share-close","example"],["curl_share_close","function.curl-share-close","refentry"],["","function.curl-share-init","example"],["curl_share_init","function.curl-share-init","refentry"],["","function.curl-share-setopt","example"],["curl_share_setopt","function.curl-share-setopt","refentry"],["","function.curl-strerror","example"],["curl_strerror","function.curl-strerror","refentry"],["","function.curl-unescape","example"],["curl_unescape","function.curl-unescape","refentry"],["","function.curl-version","example"],["curl_version","function.curl-version","refentry"],["","function.hack.hh.asio.curl-exec","example"],["","function.hack.hh.asio.curl-exec","example"],["HH\\Asio\\curl_exec","function.hack.hh.asio.curl-exec","refentry"],["","ref.curl","reference"],["","class.curlfile","section"],["","class.curlfile","section"],["","class.curlfile","varlistentry"],["","class.curlfile","varlistentry"],["","class.curlfile","varlistentry"],["","class.curlfile","section"],["","curlfile.construct","example"],["CURLFile::__construct","curlfile.construct","refentry"],["CURLFile::getFilename","curlfile.getfilename","refentry"],["CURLFile::getMimeType","curlfile.getmimetype","refentry"],["CURLFile::getPostFilename","curlfile.getpostfilename","refentry"],["CURLFile::setMimeType","curlfile.setmimetype","refentry"],["CURLFile::setPostFilename","curlfile.setpostfilename","refentry"],["CURLFile::__wakeup","curlfile.wakeup","refentry"],["CURLFile","class.curlfile","phpdoc:classref"],["cURL","book.curl","book"],["","intro.event","preface"],["","event.requirements","section"],["","event.installation","section"],["","event.configuration","section"],["","event.resources","section"],["","event.setup","chapter"],["","event.examples","example"],["","event.examples","example"],["","event.examples","example"],["","event.examples","example"],["","event.examples","example"],["","event.examples","example"],["","event.examples","example"],["","event.examples","example"],["","event.examples","example"],["","event.examples","example"],["","event.examples","example"],["","event.examples","chapter"],["","event.flags","chapter"],["","event.persistence","chapter"],["","event.callbacks","chapter"],["","event.constructing.signal.events","example"],["","event.constructing.signal.events","chapter"],["","class.event","section"],["","class.event","section"],["","class.event","varlistentry"],["","class.event","section"],["","class.event","varlistentry"],["","class.event","varlistentry"],["","class.event","varlistentry"],["","class.event","varlistentry"],["","class.event","varlistentry"],["","class.event","varlistentry"],["","class.event","section"],["Event::add","event.add","refentry"],["","event.addsignal","example"],["Event::addSignal","event.addsignal","refentry"],["","event.addtimer","example"],["Event::addTimer","event.addtimer","refentry"],["Event::__construct","event.construct","refentry"],["Event::del","event.del","refentry"],["Event::delSignal","event.delsignal","refentry"],["Event::delTimer","event.deltimer","refentry"],["Event::free","event.free","refentry"],["Event::getSupportedMethods","event.getsupportedmethods","refentry"],["Event::pending","event.pending","refentry"],["Event::set","event.set","refentry"],["Event::setPriority","event.setpriority","refentry"],["Event::setTimer","event.settimer","refentry"],["Event::signal","event.signal","refentry"],["Event::timer","event.timer","refentry"],["Event","class.event","phpdoc:classref"],["","class.eventbase","warning"],["","class.eventbase","section"],["","class.eventbase","section"],["","class.eventbase","varlistentry"],["","class.eventbase","varlistentry"],["","class.eventbase","varlistentry"],["","class.eventbase","varlistentry"],["","class.eventbase","varlistentry"],["","class.eventbase","varlistentry"],["","class.eventbase","section"],["EventBase::__construct","eventbase.construct","refentry"],["EventBase::dispatch","eventbase.dispatch","refentry"],["EventBase::exit","eventbase.exit","refentry"],["","eventbase.getfeatures","example"],["EventBase::getFeatures","eventbase.getfeatures","refentry"],["","eventbase.getmethod","example"],["EventBase::getMethod","eventbase.getmethod","refentry"],["EventBase::getTimeOfDayCached","eventbase.gettimeofdaycached","refentry"],["EventBase::gotExit","eventbase.gotexit","refentry"],["EventBase::gotStop","eventbase.gotstop","refentry"],["EventBase::loop","eventbase.loop","refentry"],["EventBase::priorityInit","eventbase.priorityinit","refentry"],["EventBase::reInit","eventbase.reinit","refentry"],["EventBase::stop","eventbase.stop","refentry"],["EventBase","class.eventbase","phpdoc:classref"],["","class.eventbuffer","section"],["","class.eventbuffer","section"],["","class.eventbuffer","varlistentry"],["","class.eventbuffer","varlistentry"],["","class.eventbuffer","section"],["","class.eventbuffer","varlistentry"],["","class.eventbuffer","varlistentry"],["","class.eventbuffer","varlistentry"],["","class.eventbuffer","varlistentry"],["","class.eventbuffer","varlistentry"],["","class.eventbuffer","varlistentry"],["","class.eventbuffer","section"],["EventBuffer::add","eventbuffer.add","refentry"],["EventBuffer::addBuffer","eventbuffer.addbuffer","refentry"],["EventBuffer::appendFrom","eventbuffer.appendfrom","refentry"],["EventBuffer::__construct","eventbuffer.construct","refentry"],["EventBuffer::copyout","eventbuffer.copyout","refentry"],["EventBuffer::drain","eventbuffer.drain","refentry"],["EventBuffer::enableLocking","eventbuffer.enablelocking","refentry"],["EventBuffer::expand","eventbuffer.expand","refentry"],["EventBuffer::freeze","eventbuffer.freeze","refentry"],["EventBuffer::lock","eventbuffer.lock","refentry"],["EventBuffer::prepend","eventbuffer.prepend","refentry"],["EventBuffer::prependBuffer","eventbuffer.prependbuffer","refentry"],["EventBuffer::pullup","eventbuffer.pullup","refentry"],["EventBuffer::read","eventbuffer.read","refentry"],["EventBuffer::readFrom","eventbuffer.readfrom","refentry"],["EventBuffer::readLine","eventbuffer.readline","refentry"],["","eventbuffer.search","example"],["EventBuffer::search","eventbuffer.search","refentry"],["EventBuffer::searchEol","eventbuffer.searcheol","refentry"],["EventBuffer::substr","eventbuffer.substr","refentry"],["EventBuffer::unfreeze","eventbuffer.unfreeze","refentry"],["EventBuffer::unlock","eventbuffer.unlock","refentry"],["EventBuffer::write","eventbuffer.write","refentry"],["EventBuffer","class.eventbuffer","phpdoc:classref"],["","class.eventbufferevent","section"],["","class.eventbufferevent","section"],["","class.eventbufferevent","varlistentry"],["","class.eventbufferevent","varlistentry"],["","class.eventbufferevent","varlistentry"],["","class.eventbufferevent","varlistentry"],["","class.eventbufferevent","section"],["","class.eventbufferevent","varlistentry"],["","class.eventbufferevent","varlistentry"],["","class.eventbufferevent","varlistentry"],["","class.eventbufferevent","varlistentry"],["","class.eventbufferevent","varlistentry"],["","class.eventbufferevent","varlistentry"],["","class.eventbufferevent","varlistentry"],["","class.eventbufferevent","varlistentry"],["","class.eventbufferevent","varlistentry"],["","class.eventbufferevent","varlistentry"],["","class.eventbufferevent","varlistentry"],["","class.eventbufferevent","varlistentry"],["","class.eventbufferevent","varlistentry"],["","class.eventbufferevent","section"],["","eventbufferevent.connect","example"],["","eventbufferevent.connect","example"],["EventBufferEvent::connect","eventbufferevent.connect","refentry"],["","eventbufferevent.connecthost","example"],["EventBufferEvent::connectHost","eventbufferevent.connecthost","refentry"],["EventBufferEvent::__construct","eventbufferevent.construct","refentry"],["EventBufferEvent::createPair","eventbufferevent.createpair","refentry"],["EventBufferEvent::disable","eventbufferevent.disable","refentry"],["EventBufferEvent::enable","eventbufferevent.enable","refentry"],["EventBufferEvent::free","eventbufferevent.free","refentry"],["EventBufferEvent::getDnsErrorString","eventbufferevent.getdnserrorstring","refentry"],["EventBufferEvent::getEnabled","eventbufferevent.getenabled","refentry"],["","eventbufferevent.getinput","example"],["EventBufferEvent::getInput","eventbufferevent.getinput","refentry"],["","eventbufferevent.getoutput","example"],["EventBufferEvent::getOutput","eventbufferevent.getoutput","refentry"],["EventBufferEvent::read","eventbufferevent.read","refentry"],["EventBufferEvent::readBuffer","eventbufferevent.readbuffer","refentry"],["EventBufferEvent::setCallbacks","eventbufferevent.setcallbacks","refentry"],["EventBufferEvent::setPriority","eventbufferevent.setpriority","refentry"],["EventBufferEvent::setTimeouts","eventbufferevent.settimeouts","refentry"],["EventBufferEvent::setWatermark","eventbufferevent.setwatermark","refentry"],["","eventbufferevent.sslerror","example"],["EventBufferEvent::sslError","eventbufferevent.sslerror","refentry"],["","eventbufferevent.sslfilter","example"],["EventBufferEvent::sslFilter","eventbufferevent.sslfilter","refentry"],["EventBufferEvent::sslRenegotiate","eventbufferevent.sslrenegotiate","refentry"],["EventBufferEvent::sslSocket","eventbufferevent.sslsocket","refentry"],["EventBufferEvent::write","eventbufferevent.write","refentry"],["EventBufferEvent::writeBuffer","eventbufferevent.writebuffer","refentry"],["EventBufferEvent","class.eventbufferevent","phpdoc:classref"],["","eventbufferevent.about.callbacks","chapter"],["","class.eventconfig","section"],["","class.eventconfig","section"],["","class.eventconfig","varlistentry"],["","class.eventconfig","varlistentry"],["","class.eventconfig","varlistentry"],["","class.eventconfig","section"],["","eventconfig.avoidmethod","example"],["EventConfig::avoidMethod","eventconfig.avoidmethod","refentry"],["","eventconfig.construct","example"],["EventConfig::__construct","eventconfig.construct","refentry"],["","eventconfig.requirefeatures","example"],["EventConfig::requireFeatures","eventconfig.requirefeatures","refentry"],["EventConfig::setMaxDispatchInterval","eventconfig.setmaxdispatchinterval","refentry"],["EventConfig","class.eventconfig","phpdoc:classref"],["","class.eventdnsbase","section"],["","class.eventdnsbase","section"],["","class.eventdnsbase","varlistentry"],["","class.eventdnsbase","varlistentry"],["","class.eventdnsbase","varlistentry"],["","class.eventdnsbase","varlistentry"],["","class.eventdnsbase","varlistentry"],["","class.eventdnsbase","section"],["EventDnsBase::addNameserverIp","eventdnsbase.addnameserverip","refentry"],["EventDnsBase::addSearch","eventdnsbase.addsearch","refentry"],["EventDnsBase::clearSearch","eventdnsbase.clearsearch","refentry"],["EventDnsBase::__construct","eventdnsbase.construct","refentry"],["EventDnsBase::countNameservers","eventdnsbase.countnameservers","refentry"],["EventDnsBase::loadHosts","eventdnsbase.loadhosts","refentry"],["EventDnsBase::parseResolvConf","eventdnsbase.parseresolvconf","refentry"],["EventDnsBase::setOption","eventdnsbase.setoption","refentry"],["EventDnsBase::setSearchNdots","eventdnsbase.setsearchndots","refentry"],["EventDnsBase","class.eventdnsbase","phpdoc:classref"],["","class.eventhttp","section"],["","class.eventhttp","section"],["","eventhttp.accept","example"],["EventHttp::accept","eventhttp.accept","refentry"],["","eventhttp.addserveralias","example"],["EventHttp::addServerAlias","eventhttp.addserveralias","refentry"],["","eventhttp.bind","example"],["EventHttp::bind","eventhttp.bind","refentry"],["","eventhttp.construct","example"],["EventHttp::__construct","eventhttp.construct","refentry"],["EventHttp::removeServerAlias","eventhttp.removeserveralias","refentry"],["EventHttp::setAllowedMethods","eventhttp.setallowedmethods","refentry"],["","eventhttp.setcallback","example"],["EventHttp::setCallback","eventhttp.setcallback","refentry"],["","eventhttp.setdefaultcallback","example"],["EventHttp::setDefaultCallback","eventhttp.setdefaultcallback","refentry"],["EventHttp::setMaxBodySize","eventhttp.setmaxbodysize","refentry"],["EventHttp::setMaxHeadersSize","eventhttp.setmaxheaderssize","refentry"],["EventHttp::setTimeout","eventhttp.settimeout","refentry"],["EventHttp","class.eventhttp","phpdoc:classref"],["","class.eventhttpconnection","section"],["","class.eventhttpconnection","section"],["EventHttpConnection::__construct","eventhttpconnection.construct","refentry"],["EventHttpConnection::getBase","eventhttpconnection.getbase","refentry"],["EventHttpConnection::getPeer","eventhttpconnection.getpeer","refentry"],["","eventhttpconnection.makerequest","example"],["EventHttpConnection::makeRequest","eventhttpconnection.makerequest","refentry"],["","eventhttpconnection.setclosecallback","example"],["EventHttpConnection::setCloseCallback","eventhttpconnection.setclosecallback","refentry"],["EventHttpConnection::setLocalAddress","eventhttpconnection.setlocaladdress","refentry"],["EventHttpConnection::setLocalPort","eventhttpconnection.setlocalport","refentry"],["EventHttpConnection::setMaxBodySize","eventhttpconnection.setmaxbodysize","refentry"],["EventHttpConnection::setMaxHeadersSize","eventhttpconnection.setmaxheaderssize","refentry"],["EventHttpConnection::setRetries","eventhttpconnection.setretries","refentry"],["EventHttpConnection::setTimeout","eventhttpconnection.settimeout","refentry"],["EventHttpConnection","class.eventhttpconnection","phpdoc:classref"],["","class.eventhttprequest","section"],["","class.eventhttprequest","section"],["","class.eventhttprequest","varlistentry"],["","class.eventhttprequest","varlistentry"],["","class.eventhttprequest","varlistentry"],["","class.eventhttprequest","varlistentry"],["","class.eventhttprequest","varlistentry"],["","class.eventhttprequest","varlistentry"],["","class.eventhttprequest","varlistentry"],["","class.eventhttprequest","varlistentry"],["","class.eventhttprequest","varlistentry"],["","class.eventhttprequest","varlistentry"],["","class.eventhttprequest","varlistentry"],["","class.eventhttprequest","section"],["EventHttpRequest::addHeader","eventhttprequest.addheader","refentry"],["EventHttpRequest::cancel","eventhttprequest.cancel","refentry"],["EventHttpRequest::clearHeaders","eventhttprequest.clearheaders","refentry"],["EventHttpRequest::closeConnection","eventhttprequest.closeconnection","refentry"],["","eventhttprequest.construct","example"],["EventHttpRequest::__construct","eventhttprequest.construct","refentry"],["EventHttpRequest::findHeader","eventhttprequest.findheader","refentry"],["EventHttpRequest::free","eventhttprequest.free","refentry"],["EventHttpRequest::getBufferEvent","eventhttprequest.getbufferevent","refentry"],["EventHttpRequest::getCommand","eventhttprequest.getcommand","refentry"],["EventHttpRequest::getConnection","eventhttprequest.getconnection","refentry"],["EventHttpRequest::getHost","eventhttprequest.gethost","refentry"],["EventHttpRequest::getInputBuffer","eventhttprequest.getinputbuffer","refentry"],["EventHttpRequest::getInputHeaders","eventhttprequest.getinputheaders","refentry"],["EventHttpRequest::getOutputBuffer","eventhttprequest.getoutputbuffer","refentry"],["EventHttpRequest::getOutputHeaders","eventhttprequest.getoutputheaders","refentry"],["EventHttpRequest::getResponseCode","eventhttprequest.getresponsecode","refentry"],["EventHttpRequest::getUri","eventhttprequest.geturi","refentry"],["EventHttpRequest::removeHeader","eventhttprequest.removeheader","refentry"],["","eventhttprequest.senderror","example"],["EventHttpRequest::sendError","eventhttprequest.senderror","refentry"],["EventHttpRequest::sendReply","eventhttprequest.sendreply","refentry"],["EventHttpRequest::sendReplyChunk","eventhttprequest.sendreplychunk","refentry"],["EventHttpRequest::sendReplyEnd","eventhttprequest.sendreplyend","refentry"],["EventHttpRequest::sendReplyStart","eventhttprequest.sendreplystart","refentry"],["EventHttpRequest","class.eventhttprequest","phpdoc:classref"],["","class.eventlistener","section"],["","class.eventlistener","section"],["","class.eventlistener","varlistentry"],["","class.eventlistener","section"],["","class.eventlistener","varlistentry"],["","class.eventlistener","varlistentry"],["","class.eventlistener","varlistentry"],["","class.eventlistener","varlistentry"],["","class.eventlistener","varlistentry"],["","class.eventlistener","section"],["","eventlistener.construct","example"],["EventListener::__construct","eventlistener.construct","refentry"],["EventListener::disable","eventlistener.disable","refentry"],["EventListener::enable","eventlistener.enable","refentry"],["EventListener::getBase","eventlistener.getbase","refentry"],["EventListener::getSocketName","eventlistener.getsocketname","refentry"],["EventListener::setCallback","eventlistener.setcallback","refentry"],["EventListener::setErrorCallback","eventlistener.seterrorcallback","refentry"],["EventListener","class.eventlistener","phpdoc:classref"],["","class.eventsslcontext","section"],["","class.eventsslcontext","section"],["","class.eventsslcontext","varlistentry"],["","class.eventsslcontext","varlistentry"],["","class.eventsslcontext","section"],["","class.eventsslcontext","varlistentry"],["","class.eventsslcontext","varlistentry"],["","class.eventsslcontext","varlistentry"],["","class.eventsslcontext","varlistentry"],["","class.eventsslcontext","varlistentry"],["","class.eventsslcontext","varlistentry"],["","class.eventsslcontext","varlistentry"],["","class.eventsslcontext","varlistentry"],["","class.eventsslcontext","varlistentry"],["","class.eventsslcontext","varlistentry"],["","class.eventsslcontext","varlistentry"],["","class.eventsslcontext","varlistentry"],["","class.eventsslcontext","varlistentry"],["","class.eventsslcontext","varlistentry"],["","class.eventsslcontext","varlistentry"],["","class.eventsslcontext","varlistentry"],["","class.eventsslcontext","varlistentry"],["","class.eventsslcontext","section"],["","eventsslcontext.construct","example"],["EventSslContext::__construct","eventsslcontext.construct","refentry"],["EventSslContext","class.eventsslcontext","phpdoc:classref"],["","class.eventutil","section"],["","class.eventutil","section"],["","class.eventutil","varlistentry"],["","class.eventutil","varlistentry"],["","class.eventutil","varlistentry"],["","class.eventutil","varlistentry"],["","class.eventutil","varlistentry"],["","class.eventutil","varlistentry"],["","class.eventutil","varlistentry"],["","class.eventutil","varlistentry"],["","class.eventutil","varlistentry"],["","class.eventutil","varlistentry"],["","class.eventutil","varlistentry"],["","class.eventutil","varlistentry"],["","class.eventutil","varlistentry"],["","class.eventutil","varlistentry"],["","class.eventutil","varlistentry"],["","class.eventutil","varlistentry"],["","class.eventutil","varlistentry"],["","class.eventutil","varlistentry"],["","class.eventutil","varlistentry"],["","class.eventutil","varlistentry"],["","class.eventutil","varlistentry"],["","class.eventutil","varlistentry"],["","class.eventutil","varlistentry"],["","class.eventutil","varlistentry"],["","class.eventutil","section"],["EventUtil::__construct","eventutil.construct","refentry"],["EventUtil::getLastSocketErrno","eventutil.getlastsocketerrno","refentry"],["EventUtil::getLastSocketError","eventutil.getlastsocketerror","refentry"],["EventUtil::getSocketFd","eventutil.getsocketfd","refentry"],["EventUtil::getSocketName","eventutil.getsocketname","refentry"],["EventUtil::setSocketOption","eventutil.setsocketoption","refentry"],["EventUtil::sslRandPoll","eventutil.sslrandpoll","refentry"],["EventUtil","class.eventutil","phpdoc:classref"],["Event","book.event","book"],["","intro.fam","preface"],["","fam.requirements","section"],["","fam.installation","section"],["","fam.configuration","section"],["","fam.resources","section"],["","fam.setup","chapter"],["","fam.constants","appendix"],["fam_cancel_monitor","function.fam-cancel-monitor","refentry"],["fam_close","function.fam-close","refentry"],["fam_monitor_collection","function.fam-monitor-collection","refentry"],["fam_monitor_directory","function.fam-monitor-directory","refentry"],["fam_monitor_file","function.fam-monitor-file","refentry"],["fam_next_event","function.fam-next-event","refentry"],["fam_open","function.fam-open","refentry"],["fam_pending","function.fam-pending","refentry"],["fam_resume_monitor","function.fam-resume-monitor","refentry"],["fam_suspend_monitor","function.fam-suspend-monitor","refentry"],["","ref.fam","reference"],["FAM","book.fam","book"],["","intro.ftp","preface"],["","ftp.requirements","section"],["","ftp.installation","section"],["","ftp.configuration","section"],["","ftp.resources","section"],["","ftp.setup","chapter"],["","ftp.constants","varlistentry"],["","ftp.constants","varlistentry"],["","ftp.constants","varlistentry"],["","ftp.constants","varlistentry"],["","ftp.constants","varlistentry"],["","ftp.constants","varlistentry"],["","ftp.constants","varlistentry"],["","ftp.constants","varlistentry"],["","ftp.constants","varlistentry"],["","ftp.constants","varlistentry"],["","ftp.constants","appendix"],["","ftp.examples-basic","example"],["","ftp.examples-basic","section"],["","ftp.examples","chapter"],["","function.ftp-alloc","example"],["ftp_alloc","function.ftp-alloc","refentry"],["","function.ftp-cdup","example"],["ftp_cdup","function.ftp-cdup","refentry"],["","function.ftp-chdir","example"],["ftp_chdir","function.ftp-chdir","refentry"],["","function.ftp-chmod","example"],["ftp_chmod","function.ftp-chmod","refentry"],["","function.ftp-close","example"],["ftp_close","function.ftp-close","refentry"],["","function.ftp-connect","example"],["ftp_connect","function.ftp-connect","refentry"],["","function.ftp-delete","example"],["ftp_delete","function.ftp-delete","refentry"],["","function.ftp-exec","example"],["ftp_exec","function.ftp-exec","refentry"],["","function.ftp-fget","example"],["ftp_fget","function.ftp-fget","refentry"],["","function.ftp-fput","example"],["ftp_fput","function.ftp-fput","refentry"],["","function.ftp-get-option","example"],["ftp_get_option","function.ftp-get-option","refentry"],["","function.ftp-get","example"],["ftp_get","function.ftp-get","refentry"],["","function.ftp-login","example"],["ftp_login","function.ftp-login","refentry"],["","function.ftp-mdtm","example"],["ftp_mdtm","function.ftp-mdtm","refentry"],["","function.ftp-mkdir","example"],["ftp_mkdir","function.ftp-mkdir","refentry"],["","function.ftp-nb-continue","example"],["ftp_nb_continue","function.ftp-nb-continue","refentry"],["","function.ftp-nb-fget","example"],["ftp_nb_fget","function.ftp-nb-fget","refentry"],["","function.ftp-nb-fput","example"],["ftp_nb_fput","function.ftp-nb-fput","refentry"],["","function.ftp-nb-get","example"],["","function.ftp-nb-get","example"],["","function.ftp-nb-get","example"],["ftp_nb_get","function.ftp-nb-get","refentry"],["","function.ftp-nb-put","example"],["","function.ftp-nb-put","example"],["ftp_nb_put","function.ftp-nb-put","refentry"],["","function.ftp-nlist","example"],["ftp_nlist","function.ftp-nlist","refentry"],["","function.ftp-pasv","example"],["ftp_pasv","function.ftp-pasv","refentry"],["","function.ftp-put","example"],["ftp_put","function.ftp-put","refentry"],["","function.ftp-pwd","example"],["ftp_pwd","function.ftp-pwd","refentry"],["ftp_quit","function.ftp-quit","refentry"],["","function.ftp-raw","example"],["ftp_raw","function.ftp-raw","refentry"],["","function.ftp-rawlist","example"],["ftp_rawlist","function.ftp-rawlist","refentry"],["","function.ftp-rename","example"],["ftp_rename","function.ftp-rename","refentry"],["","function.ftp-rmdir","example"],["ftp_rmdir","function.ftp-rmdir","refentry"],["","function.ftp-set-option","example"],["ftp_set_option","function.ftp-set-option","refentry"],["","function.ftp-site","example"],["ftp_site","function.ftp-site","refentry"],["","function.ftp-size","example"],["ftp_size","function.ftp-size","refentry"],["","function.ftp-ssl-connect","example"],["ftp_ssl_connect","function.ftp-ssl-connect","refentry"],["","function.ftp-systype","example"],["ftp_systype","function.ftp-systype","refentry"],["","ref.ftp","reference"],["","book.ftp","book"],["","intro.gearman","preface"],["","gearman.requirements","section"],["","gearman.installation","section"],["","gearman.configuration","section"],["","gearman.resources","section"],["","gearman.setup","chapter"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","varlistentry"],["","gearman.constants","appendix"],["","gearman.examples-reverse","example"],["","gearman.examples-reverse","section"],["","gearman.examples-reverse-bg","example"],["","gearman.examples-reverse-bg","section"],["","gearman.examples-reverse-task","example"],["","gearman.examples-reverse-task","section"],["","gearman.examples","chapter"],["","class.gearmanclient","section"],["","class.gearmanclient","section"],["GearmanClient::addOptions","gearmanclient.addoptions","refentry"],["","gearmanclient.addserver","example"],["GearmanClient::addServer","gearmanclient.addserver","refentry"],["","gearmanclient.addservers","example"],["GearmanClient::addServers","gearmanclient.addservers","refentry"],["","gearmanclient.addtask","example"],["","gearmanclient.addtask","example"],["GearmanClient::addTask","gearmanclient.addtask","refentry"],["","gearmanclient.addtaskbackground","example"],["GearmanClient::addTaskBackground","gearmanclient.addtaskbackground","refentry"],["","gearmanclient.addtaskhigh","example"],["GearmanClient::addTaskHigh","gearmanclient.addtaskhigh","refentry"],["GearmanClient::addTaskHighBackground","gearmanclient.addtaskhighbackground","refentry"],["","gearmanclient.addtasklow","example"],["GearmanClient::addTaskLow","gearmanclient.addtasklow","refentry"],["GearmanClient::addTaskLowBackground","gearmanclient.addtasklowbackground","refentry"],["","gearmanclient.addtaskstatus","example"],["GearmanClient::addTaskStatus","gearmanclient.addtaskstatus","refentry"],["GearmanClient::clearCallbacks","gearmanclient.clearcallbacks","refentry"],["GearmanClient::clone","gearmanclient.clone","refentry"],["GearmanClient::__construct","gearmanclient.construct","refentry"],["GearmanClient::context","gearmanclient.context","refentry"],["GearmanClient::data","gearmanclient.data","refentry"],["","gearmanclient.do","example"],["","gearmanclient.do","example"],["GearmanClient::do","gearmanclient.do","refentry"],["","gearmanclient.dobackground","example"],["GearmanClient::doBackground","gearmanclient.dobackground","refentry"],["GearmanClient::doHigh","gearmanclient.dohigh","refentry"],["GearmanClient::doHighBackground","gearmanclient.dohighbackground","refentry"],["GearmanClient::doJobHandle","gearmanclient.dojobhandle","refentry"],["GearmanClient::doLow","gearmanclient.dolow","refentry"],["GearmanClient::doLowBackground","gearmanclient.dolowbackground","refentry"],["","gearmanclient.donormal","example"],["","gearmanclient.donormal","example"],["GearmanClient::doNormal","gearmanclient.donormal","refentry"],["","gearmanclient.dostatus","example"],["GearmanClient::doStatus","gearmanclient.dostatus","refentry"],["GearmanClient::echo","gearmanclient.echo","refentry"],["GearmanClient::error","gearmanclient.error","refentry"],["GearmanClient::getErrno","gearmanclient.geterrno","refentry"],["","gearmanclient.jobstatus","example"],["GearmanClient::jobStatus","gearmanclient.jobstatus","refentry"],["GearmanClient::ping","gearmanclient.ping","refentry"],["GearmanClient::removeOptions","gearmanclient.removeoptions","refentry"],["GearmanClient::returnCode","gearmanclient.returncode","refentry"],["GearmanClient::runTasks","gearmanclient.runtasks","refentry"],["GearmanClient::setClientCallback","gearmanclient.setclientcallback","refentry"],["GearmanClient::setCompleteCallback","gearmanclient.setcompletecallback","refentry"],["GearmanClient::setContext","gearmanclient.setcontext","refentry"],["GearmanClient::setCreatedCallback","gearmanclient.setcreatedcallback","refentry"],["GearmanClient::setData","gearmanclient.setdata","refentry"],["GearmanClient::setDataCallback","gearmanclient.setdatacallback","refentry"],["GearmanClient::setExceptionCallback","gearmanclient.setexceptioncallback","refentry"],["GearmanClient::setFailCallback","gearmanclient.setfailcallback","refentry"],["GearmanClient::setOptions","gearmanclient.setoptions","refentry"],["GearmanClient::setStatusCallback","gearmanclient.setstatuscallback","refentry"],["GearmanClient::setTimeout","gearmanclient.settimeout","refentry"],["GearmanClient::setWarningCallback","gearmanclient.setwarningcallback","refentry"],["GearmanClient::setWorkloadCallback","gearmanclient.setworkloadcallback","refentry"],["GearmanClient::timeout","gearmanclient.timeout","refentry"],["GearmanClient","class.gearmanclient","phpdoc:classref"],["","class.gearmanjob","section"],["","class.gearmanjob","section"],["GearmanJob::complete","gearmanjob.complete","refentry"],["GearmanJob::__construct","gearmanjob.construct","refentry"],["GearmanJob::data","gearmanjob.data","refentry"],["GearmanJob::exception","gearmanjob.exception","refentry"],["GearmanJob::fail","gearmanjob.fail","refentry"],["GearmanJob::functionName","gearmanjob.functionname","refentry"],["GearmanJob::handle","gearmanjob.handle","refentry"],["GearmanJob::returnCode","gearmanjob.returncode","refentry"],["GearmanJob::sendComplete","gearmanjob.sendcomplete","refentry"],["GearmanJob::sendData","gearmanjob.senddata","refentry"],["GearmanJob::sendException","gearmanjob.sendexception","refentry"],["GearmanJob::sendFail","gearmanjob.sendfail","refentry"],["GearmanJob::sendStatus","gearmanjob.sendstatus","refentry"],["GearmanJob::sendWarning","gearmanjob.sendwarning","refentry"],["GearmanJob::setReturn","gearmanjob.setreturn","refentry"],["GearmanJob::status","gearmanjob.status","refentry"],["GearmanJob::unique","gearmanjob.unique","refentry"],["GearmanJob::warning","gearmanjob.warning","refentry"],["GearmanJob::workload","gearmanjob.workload","refentry"],["GearmanJob::workloadSize","gearmanjob.workloadsize","refentry"],["GearmanJob","class.gearmanjob","phpdoc:classref"],["","class.gearmantask","section"],["","class.gearmantask","section"],["GearmanTask::__construct","gearmantask.construct","refentry"],["GearmanTask::create","gearmantask.create","refentry"],["GearmanTask::data","gearmantask.data","refentry"],["GearmanTask::dataSize","gearmantask.datasize","refentry"],["GearmanTask::function","gearmantask.function","refentry"],["GearmanTask::functionName","gearmantask.functionname","refentry"],["GearmanTask::isKnown","gearmantask.isknown","refentry"],["GearmanTask::isRunning","gearmantask.isrunning","refentry"],["GearmanTask::jobHandle","gearmantask.jobhandle","refentry"],["GearmanTask::recvData","gearmantask.recvdata","refentry"],["GearmanTask::returnCode","gearmantask.returncode","refentry"],["GearmanTask::sendData","gearmantask.senddata","refentry"],["GearmanTask::sendWorkload","gearmantask.sendworkload","refentry"],["GearmanTask::taskDenominator","gearmantask.taskdenominator","refentry"],["GearmanTask::taskNumerator","gearmantask.tasknumerator","refentry"],["GearmanTask::unique","gearmantask.unique","refentry"],["GearmanTask::uuid","gearmantask.uuid","refentry"],["GearmanTask","class.gearmantask","phpdoc:classref"],["","class.gearmanworker","section"],["","class.gearmanworker","section"],["","gearmanworker.addfunction","example"],["GearmanWorker::addFunction","gearmanworker.addfunction","refentry"],["GearmanWorker::addOptions","gearmanworker.addoptions","refentry"],["","gearmanworker.addserver","example"],["GearmanWorker::addServer","gearmanworker.addserver","refentry"],["","gearmanworker.addservers","example"],["GearmanWorker::addServers","gearmanworker.addservers","refentry"],["GearmanWorker::clone","gearmanworker.clone","refentry"],["GearmanWorker::__construct","gearmanworker.construct","refentry"],["GearmanWorker::echo","gearmanworker.echo","refentry"],["GearmanWorker::error","gearmanworker.error","refentry"],["GearmanWorker::getErrno","gearmanworker.geterrno","refentry"],["GearmanWorker::options","gearmanworker.options","refentry"],["GearmanWorker::register","gearmanworker.register","refentry"],["GearmanWorker::removeOptions","gearmanworker.removeoptions","refentry"],["GearmanWorker::returnCode","gearmanworker.returncode","refentry"],["","function.func-name","example"],["GearmanWorker::setId","function.func-name","refentry"],["GearmanWorker::setOptions","gearmanworker.setoptions","refentry"],["","gearmanworker.settimeout","example"],["GearmanWorker::setTimeout","gearmanworker.settimeout","refentry"],["GearmanWorker::timeout","gearmanworker.timeout","refentry"],["GearmanWorker::unregister","gearmanworker.unregister","refentry"],["GearmanWorker::unregisterAll","gearmanworker.unregisterall","refentry"],["","gearmanworker.wait","example"],["GearmanWorker::wait","gearmanworker.wait","refentry"],["","gearmanworker.work","example"],["GearmanWorker::work","gearmanworker.work","refentry"],["GearmanWorker","class.gearmanworker","phpdoc:classref"],["","class.gearmanexception","section"],["","class.gearmanexception","section"],["GearmanException","class.gearmanexception","phpdoc:classref"],["Gearman","book.gearman","book"],["","intro.net-gopher","preface"],["","net-gopher.requirements","section"],["","net-gopher.install","section"],["","net-gopher.configuration","section"],["","net-gopher.resources","section"],["","net-gopher.setup","chapter"],["","net-gopher.constants","appendix"],["","net-gopher.examples-basic","section"],["","net-gopher.examples","chapter"],["","function.gopher-parsedir","example"],["","function.gopher-parsedir","example"],["gopher_parsedir","function.gopher-parsedir","refentry"],["","ref.net-gopher","reference"],["Gopher","book.net-gopher","book"],["","intro.gupnp","preface"],["","gupnp.requirements","section"],["","gupnp.installation","section"],["","gupnp.configuration","section"],["","gupnp.resources","section"],["","gupnp.setup","chapter"],["","gupnp.constants","varlistentry"],["","gupnp.constants","varlistentry"],["","gupnp.constants","varlistentry"],["","gupnp.constants","varlistentry"],["","gupnp.constants","varlistentry"],["","gupnp.constants","varlistentry"],["","gupnp.constants","varlistentry"],["","gupnp.constants","varlistentry"],["","gupnp.constants","varlistentry"],["","gupnp.constants","varlistentry"],["","gupnp.constants","varlistentry"],["","gupnp.constants","varlistentry"],["","gupnp.constants","varlistentry"],["","gupnp.constants","varlistentry"],["","gupnp.constants","varlistentry"],["","gupnp.constants","varlistentry"],["","gupnp.constants","varlistentry"],["","gupnp.constants","appendix"],["","gupnp.browsing","example"],["","gupnp.browsing","section"],["","gupnp.binary-light","example"],["","gupnp.binary-light","example"],["","gupnp.binary-light","section"],["","gupnp.examples","chapter"],["","function.gupnp-context-get-host-ip","example"],["gupnp_context_get_host_ip","function.gupnp-context-get-host-ip","refentry"],["","function.gupnp-context-get-port","example"],["gupnp_context_get_port","function.gupnp-context-get-port","refentry"],["gupnp_context_get_subscription_timeout","function.gupnp-context-get-subscription-timeout","refentry"],["","function.gupnp-context-host-path","example"],["gupnp_context_host_path","function.gupnp-context-host-path","refentry"],["","function.gupnp-context-new","example"],["gupnp_context_new","function.gupnp-context-new","refentry"],["gupnp_context_set_subscription_timeout","function.gupnp-context-set-subscription-timeout","refentry"],["","function.gupnp-context-timeout-add","example"],["gupnp_context_timeout_add","function.gupnp-context-timeout-add","refentry"],["gupnp_context_unhost_path","function.gupnp-context-unhost-path","refentry"],["","function.gupnp-control-point-browse-start","example"],["gupnp_control_point_browse_start","function.gupnp-control-point-browse-start","refentry"],["gupnp_control_point_browse_stop","function.gupnp-control-point-browse-stop","refentry"],["","function.gupnp-control-point-callback-set","example"],["gupnp_control_point_callback_set","function.gupnp-control-point-callback-set","refentry"],["gupnp_control_point_new","function.gupnp-control-point-new","refentry"],["gupnp_device_action_callback_set","function.gupnp-device-action-callback-set","refentry"],["","function.gupnp-device-info-get-service","example"],["gupnp_device_info_get_service","function.gupnp-device-info-get-service","refentry"],["gupnp_device_info_get","function.gupnp-device-info-get","refentry"],["gupnp_root_device_get_available","function.gupnp-root-device-get-available","refentry"],["gupnp_root_device_get_relative_location","function.gupnp-root-device-get-relative-location","refentry"],["","function.gupnp-root-device-new","example"],["gupnp_root_device_new","function.gupnp-root-device-new","refentry"],["gupnp_root_device_set_available","function.gupnp-root-device-set-available","refentry"],["gupnp_root_device_start","function.gupnp-root-device-start","refentry"],["gupnp_root_device_stop","function.gupnp-root-device-stop","refentry"],["gupnp_service_action_get","function.gupnp-service-action-get","refentry"],["gupnp_service_action_return_error","function.gupnp-service-action-return-error","refentry"],["gupnp_service_action_return","function.gupnp-service-action-return","refentry"],["gupnp_service_action_set","function.gupnp-service-action-set","refentry"],["gupnp_service_freeze_notify","function.gupnp-service-freeze-notify","refentry"],["gupnp_service_info_get_introspection","function.gupnp-service-info-get-introspection","refentry"],["gupnp_service_info_get","function.gupnp-service-info-get","refentry"],["gupnp_service_introspection_get_state_variable","function.gupnp-service-introspection-get-state-variable","refentry"],["gupnp_service_notify","function.gupnp-service-notify","refentry"],["gupnp_service_proxy_action_get","function.gupnp-service-proxy-action-get","refentry"],["gupnp_service_proxy_action_set","function.gupnp-service-proxy-action-set","refentry"],["gupnp_service_proxy_add_notify","function.gupnp-service-proxy-add-notify","refentry"],["gupnp_service_proxy_callback_set","function.gupnp-service-proxy-callback-set","refentry"],["gupnp_service_proxy_get_subscribed","function.gupnp-service-proxy-get-subscribed","refentry"],["gupnp_service_proxy_remove_notify","function.gupnp-service-proxy-remove-notify","refentry"],["gupnp_service_proxy_send_action","gupnp-service-proxy-send-action","refentry"],["gupnp_service_proxy_set_subscribed","function.gupnp-service-proxy-set-subscribed","refentry"],["gupnp_service_thaw_notify","function.gupnp-service-thaw-notify","refentry"],["","ref.gupnp","reference"],["Gupnp","book.gupnp","book"],["","intro.http","preface"],["","http.requirements","section"],["","http.install","section"],["Installing the HTTP extension","http.install","section"],["","http.configuration","section"],["","http.resources","section"],["","http.setup","chapter"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","variablelist"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","variablelist"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","variablelist"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","variablelist"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","variablelist"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","variablelist"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","variablelist"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","variablelist"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","variablelist"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","variablelist"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","variablelist"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","variablelist"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","variablelist"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","variablelist"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","variablelist"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","varlistentry"],["","http.constants","variablelist"],["","http.constants","appendix"],["","http.request.options","varlistentry"],["","http.request.options","varlistentry"],["","http.request.options","varlistentry"],["","http.request.options","variablelist"],["","http.request.options","varlistentry"],["","http.request.options","varlistentry"],["","http.request.options","varlistentry"],["","http.request.options","varlistentry"],["","http.request.options","variablelist"],["","http.request.options","variablelist"],["","http.request.options","variablelist"],["","http.request.options","variablelist"],["","http.request.options","variablelist"],["","http.request.options","variablelist"],["","http.request.options","variablelist"],["","http.request.options","variablelist"],["","http.request.options","variablelist"],["","http.request.options","variablelist"],["Request Options","http.request.options","appendix"],["","class.httpdeflatestream","section"],["","class.httpdeflatestream","section"],["","class.httpdeflatestream","section"],["","class.httpdeflatestream","example"],["HttpDeflateStream::__construct","httpdeflatestream.construct","refentry"],["HttpDeflateStream::factory","httpdeflatestream.factory","refentry"],["HttpDeflateStream::finish","httpdeflatestream.finish","refentry"],["HttpDeflateStream::flush","httpdeflatestream.flush","refentry"],["HttpDeflateStream::update","httpdeflatestream.update","refentry"],["HttpDeflateStream","class.httpdeflatestream","phpdoc:classref"],["","class.httpinflatestream","section"],["","class.httpinflatestream","section"],["","class.httpinflatestream","section"],["","class.httpinflatestream","example"],["HttpInflateStream::__construct","httpinflatestream.construct","refentry"],["HttpInflateStream::factory","httpinflatestream.factory","refentry"],["HttpInflateStream::finish","httpinflatestream.finish","refentry"],["HttpInflateStream::flush","httpinflatestream.flush","refentry"],["HttpInflateStream::update","httpinflatestream.update","refentry"],["HttpInflateStream","class.httpinflatestream","phpdoc:classref"],["","class.httpmessage","section"],["","class.httpmessage","table"],["","class.httpmessage","section"],["","class.httpmessage","section"],["","class.httpmessage","section"],["HttpMessage::addHeaders","httpmessage.addheaders","refentry"],["HttpMessage::__construct","httpmessage.construct","refentry"],["HttpMessage::detach","httpmessage.detach","refentry"],["HttpMessage::factory","httpmessage.factory","refentry"],["HttpMessage::fromEnv","httpmessage.fromenv","refentry"],["HttpMessage::fromString","httpmessage.fromstring","refentry"],["HttpMessage::getBody","httpmessage.getbody","refentry"],["HttpMessage::getHeader","httpmessage.getheader","refentry"],["HttpMessage::getHeaders","httpmessage.getheaders","refentry"],["HttpMessage::getHttpVersion","httpmessage.gethttpversion","refentry"],["HttpMessage::getParentMessage","httpmessage.getparentmessage","refentry"],["HttpMessage::getRequestMethod","httpmessage.getrequestmethod","refentry"],["HttpMessage::getRequestUrl","httpmessage.getrequesturl","refentry"],["HttpMessage::getResponseCode","httpmessage.getresponsecode","refentry"],["HttpMessage::getResponseStatus","httpmessage.getresponsestatus","refentry"],["HttpMessage::getType","httpmessage.gettype","refentry"],["HttpMessage::guessContentType","httpmessage.guesscontenttype","refentry"],["HttpMessage::prepend","httpmessage.prepend","refentry"],["HttpMessage::reverse","httpmessage.reverse","refentry"],["HttpMessage::send","httpmessage.send","refentry"],["HttpMessage::setBody","httpmessage.setbody","refentry"],["HttpMessage::setHeaders","httpmessage.setheaders","refentry"],["HttpMessage::setHttpVersion","httpmessage.sethttpversion","refentry"],["HttpMessage::setRequestMethod","httpmessage.setrequestmethod","refentry"],["HttpMessage::setRequestUrl","httpmessage.setrequesturl","refentry"],["HttpMessage::setResponseCode","httpmessage.setresponsecode","refentry"],["HttpMessage::setResponseStatus","httpmessage.setresponsestatus","refentry"],["HttpMessage::setType","httpmessage.settype","refentry"],["HttpMessage::toMessageTypeObject","httpmessage.tomessagetypeobject","refentry"],["HttpMessage::toString","httpmessage.tostring","refentry"],["HttpMessage","class.httpmessage","phpdoc:classref"],["","class.httpquerystring","section"],["","class.httpquerystring","table"],["","class.httpquerystring","table"],["","class.httpquerystring","section"],["","class.httpquerystring","section"],["","class.httpquerystring","section"],["HttpQueryString::__construct","httpquerystring.construct","refentry"],["HttpQueryString::get","httpquerystring.get","refentry"],["HttpQueryString::mod","httpquerystring.mod","refentry"],["HttpQueryString::set","httpquerystring.set","refentry"],["HttpQueryString::singleton","httpquerystring.singleton","refentry"],["HttpQueryString::toArray","httpquerystring.toarray","refentry"],["HttpQueryString::toString","httpquerystring.tostring","refentry"],["HttpQueryString::xlate","httpquerystring.xlate","refentry"],["HttpQueryString","class.httpquerystring","phpdoc:classref"],["","class.httprequest","section"],["","class.httprequest","table"],["","class.httprequest","section"],["","class.httprequest","section"],["","class.httprequest","section"],["","httprequest.addcookies","example"],["HttpRequest::addCookies","httprequest.addcookies","refentry"],["HttpRequest::addHeaders","httprequest.addheaders","refentry"],["HttpRequest::addPostFields","httprequest.addpostfields","refentry"],["HttpRequest::addPostFile","httprequest.addpostfile","refentry"],["HttpRequest::addPutData","httprequest.addputdata","refentry"],["HttpRequest::addQueryData","httprequest.addquerydata","refentry"],["HttpRequest::addRawPostData","httprequest.addrawpostdata","refentry"],["HttpRequest::addSslOptions","httprequest.addssloptions","refentry"],["HttpRequest::clearHistory","httprequest.clearhistory","refentry"],["HttpRequest::__construct","httprequest.construct","refentry"],["HttpRequest::enableCookies","httprequest.enablecookies","refentry"],["HttpRequest::getContentType","httprequest.getcontenttype","refentry"],["HttpRequest::getCookies","httprequest.getcookies","refentry"],["HttpRequest::getHeaders","httprequest.getheaders","refentry"],["HttpRequest::getHistory","httprequest.gethistory","refentry"],["HttpRequest::getMethod","httprequest.getmethod","refentry"],["HttpRequest::getOptions","httprequest.getoptions","refentry"],["HttpRequest::getPostFields","httprequest.getpostfields","refentry"],["HttpRequest::getPostFiles","httprequest.getpostfiles","refentry"],["HttpRequest::getPutData","httprequest.getputdata","refentry"],["HttpRequest::getPutFile","httprequest.getputfile","refentry"],["HttpRequest::getQueryData","httprequest.getquerydata","refentry"],["HttpRequest::getRawPostData","httprequest.getrawpostdata","refentry"],["HttpRequest::getRawRequestMessage","httprequest.getrawrequestmessage","refentry"],["HttpRequest::getRawResponseMessage","httprequest.getrawresponsemessage","refentry"],["HttpRequest::getRequestMessage","httprequest.getrequestmessage","refentry"],["HttpRequest::getResponseBody","httprequest.getresponsebody","refentry"],["HttpRequest::getResponseCode","httprequest.getresponsecode","refentry"],["HttpRequest::getResponseCookies","httprequest.getresponsecookies","refentry"],["HttpRequest::getResponseData","httprequest.getresponsedata","refentry"],["HttpRequest::getResponseHeader","httprequest.getresponseheader","refentry"],["HttpRequest::getResponseInfo","httprequest.getresponseinfo","refentry"],["HttpRequest::getResponseMessage","httprequest.getresponsemessage","refentry"],["HttpRequest::getResponseStatus","httprequest.getresponsestatus","refentry"],["HttpRequest::getSslOptions","httprequest.getssloptions","refentry"],["HttpRequest::getUrl","httprequest.geturl","refentry"],["HttpRequest::resetCookies","httprequest.resetcookies","refentry"],["","httprequest.send","example"],["","httprequest.send","example"],["HttpRequest::send","httprequest.send","refentry"],["HttpRequest::setBody","httprequest.setbody","refentry"],["HttpRequest::setContentType","httprequest.setcontenttype","refentry"],["HttpRequest::setCookies","httprequest.setcookies","refentry"],["HttpRequest::setHeaders","httprequest.setheaders","refentry"],["HttpRequest::setMethod","httprequest.setmethod","refentry"],["HttpRequest::setOptions","httprequest.setoptions","refentry"],["HttpRequest::setPostFields","httprequest.setpostfields","refentry"],["HttpRequest::setPostFiles","httprequest.setpostfiles","refentry"],["HttpRequest::setPutData","httprequest.setputdata","refentry"],["HttpRequest::setPutFile","httprequest.setputfile","refentry"],["HttpRequest::setQueryData","httprequest.setquerydata","refentry"],["HttpRequest::setRawPostData","httprequest.setrawpostdata","refentry"],["HttpRequest::setSslOptions","httprequest.setssloptions","refentry"],["HttpRequest::setUrl","httprequest.seturl","refentry"],["HttpRequest","class.httprequest","phpdoc:classref"],["","class.httprequestpool","section"],["","class.httprequestpool","section"],["","class.httprequestpool","section"],["","class.httprequestpool","section"],["HttpRequestPool::attach","httprequestpool.attach","refentry"],["","httprequestpool.construct","example"],["HttpRequestPool::__construct","httprequestpool.construct","refentry"],["HttpRequestPool::__destruct","httprequestpool.destruct","refentry"],["HttpRequestPool::detach","httprequestpool.detach","refentry"],["HttpRequestPool::getAttachedRequests","httprequestpool.getattachedrequests","refentry"],["HttpRequestPool::getFinishedRequests","httprequestpool.getfinishedrequests","refentry"],["HttpRequestPool::reset","httprequestpool.reset","refentry"],["HttpRequestPool::send","httprequestpool.send","refentry"],["","httprequestpool.socketperform","example"],["HttpRequestPool::socketPerform","httprequestpool.socketperform","refentry"],["HttpRequestPool::socketSelect","httprequestpool.socketselect","refentry"],["HttpRequestPool","class.httprequestpool","phpdoc:classref"],["","class.httpresponse","section"],["","class.httpresponse","table"],["","class.httpresponse","section"],["","class.httpresponse","section"],["","class.httpresponse","section"],["","httpresponse.capture","example"],["HttpResponse::capture","httpresponse.capture","refentry"],["HttpResponse::getBufferSize","httpresponse.getbuffersize","refentry"],["HttpResponse::getCache","httpresponse.getcache","refentry"],["HttpResponse::getCacheControl","httpresponse.getcachecontrol","refentry"],["HttpResponse::getContentDisposition","httpresponse.getcontentdisposition","refentry"],["HttpResponse::getContentType","httpresponse.getcontenttype","refentry"],["HttpResponse::getData","httpresponse.getdata","refentry"],["HttpResponse::getETag","httpresponse.getetag","refentry"],["HttpResponse::getFile","httpresponse.getfile","refentry"],["HttpResponse::getGzip","httpresponse.getgzip","refentry"],["HttpResponse::getHeader","httpresponse.getheader","refentry"],["HttpResponse::getLastModified","httpresponse.getlastmodified","refentry"],["HttpResponse::getRequestBody","httpresponse.getrequestbody","refentry"],["HttpResponse::getRequestBodyStream","httpresponse.getrequestbodystream","refentry"],["HttpResponse::getRequestHeaders","httpresponse.getrequestheaders","refentry"],["HttpResponse::getStream","httpresponse.getstream","refentry"],["HttpResponse::getThrottleDelay","httpresponse.getthrottledelay","refentry"],["HttpResponse::guessContentType","httpresponse.guesscontenttype","refentry"],["HttpResponse::redirect","httpresponse.redirect","refentry"],["","httpresponse.send","example"],["HttpResponse::send","httpresponse.send","refentry"],["HttpResponse::setBufferSize","httpresponse.setbuffersize","refentry"],["HttpResponse::setCache","httpresponse.setcache","refentry"],["HttpResponse::setCacheControl","httpresponse.setcachecontrol","refentry"],["HttpResponse::setContentDisposition","httpresponse.setcontentdisposition","refentry"],["HttpResponse::setContentType","httpresponse.setcontenttype","refentry"],["HttpResponse::setData","httpresponse.setdata","refentry"],["HttpResponse::setETag","httpresponse.setetag","refentry"],["HttpResponse::setFile","httpresponse.setfile","refentry"],["HttpResponse::setGzip","httpresponse.setgzip","refentry"],["HttpResponse::setHeader","httpresponse.setheader","refentry"],["HttpResponse::setLastModified","httpresponse.setlastmodified","refentry"],["HttpResponse::setStream","httpresponse.setstream","refentry"],["HttpResponse::setThrottleDelay","httpresponse.setthrottledelay","refentry"],["HttpResponse::status","httpresponse.status","refentry"],["HttpResponse","class.httpresponse","phpdoc:classref"],["","ref.http","section"],["","function.http-cache-etag","example"],["http_cache_etag","function.http-cache-etag","refentry"],["","function.http-cache-last-modified","example"],["http_cache_last_modified","function.http-cache-last-modified","refentry"],["","function.http-chunked-decode","example"],["http_chunked_decode","function.http-chunked-decode","refentry"],["http_deflate","function.http-deflate","refentry"],["http_inflate","function.http-inflate","refentry"],["http_build_cookie","function.http-build-cookie","refentry"],["http_date","function.http-date","refentry"],["http_get_request_body_stream","function.http-get-request-body-stream","refentry"],["http_get_request_body","function.http-get-request-body","refentry"],["http_get_request_headers","function.http-get-request-headers","refentry"],["http_match_etag","function.http-match-etag","refentry"],["http_match_modified","function.http-match-modified","refentry"],["http_match_request_header","function.http-match-request-header","refentry"],["","function.http-support","example"],["http_support","function.http-support","refentry"],["","function.http-negotiate-charset","example"],["http_negotiate_charset","function.http-negotiate-charset","refentry"],["","function.http-negotiate-content-type","example"],["http_negotiate_content_type","function.http-negotiate-content-type","refentry"],["","function.http-negotiate-language","example"],["http_negotiate_language","function.http-negotiate-language","refentry"],["ob_deflatehandler","function.ob-deflatehandler","refentry"],["ob_etaghandler","function.ob-etaghandler","refentry"],["ob_inflatehandler","function.ob-inflatehandler","refentry"],["","function.http-parse-cookie","example"],["http_parse_cookie","function.http-parse-cookie","refentry"],["","function.http-parse-headers","example"],["http_parse_headers","function.http-parse-headers","refentry"],["","function.http-parse-message","example"],["http_parse_message","function.http-parse-message","refentry"],["","function.http-parse-params","example"],["http_parse_params","function.http-parse-params","refentry"],["http_persistent_handles_clean","function.http-persistent-handles-clean","refentry"],["","function.http-persistent-handles-count","example"],["http_persistent_handles_count","function.http-persistent-handles-count","refentry"],["","function.http-persistent-handles-ident","example"],["http_persistent_handles_ident","function.http-persistent-handles-ident","refentry"],["","function.http-get","listitem"],["","function.http-get","example"],["http_get","function.http-get","refentry"],["http_head","function.http-head","refentry"],["http_post_data","function.http-post-data","refentry"],["","function.http-post-fields","example"],["http_post_fields","function.http-post-fields","refentry"],["http_put_data","function.http-put-data","refentry"],["http_put_file","function.http-put-file","refentry"],["http_put_stream","function.http-put-stream","refentry"],["http_request_body_encode","function.http-request-body-encode","refentry"],["http_request_method_exists","function.http-request-method-exists","refentry"],["http_request_method_name","function.http-request-method-name","refentry"],["http_request_method_register","function.http-request-method-register","refentry"],["http_request_method_unregister","function.http-request-method-unregister","refentry"],["http_request","function.http-request","refentry"],["","function.http-redirect","example"],["http_redirect","function.http-redirect","refentry"],["http_send_content_disposition","function.http-send-content-disposition","refentry"],["http_send_content_type","function.http-send-content-type","refentry"],["http_send_data","function.http-send-data","refentry"],["","function.http-send-file","example"],["http_send_file","function.http-send-file","refentry"],["http_send_last_modified","function.http-send-last-modified","refentry"],["http_send_status","function.http-send-status","refentry"],["http_send_stream","function.http-send-stream","refentry"],["","function.http-throttle","example"],["http_throttle","function.http-throttle","refentry"],["http_build_str","function.http-build-str","refentry"],["","function.http-build-url","example"],["http_build_url","function.http-build-url","refentry"],["","ref.http","reference"],["","book.http","book"],["","intro.hw","preface"],["","hw.requirements","section"],["","hw.installation","section"],["","hw.configuration","section"],["","hw.resources","section"],["","hw.setup","chapter"],["","hw.constants","varlistentry"],["","hw.constants","varlistentry"],["","hw.constants","varlistentry"],["","hw.constants","appendix"],["","hw.apache","chapter"],["","ref.hw","section"],["hw_Array2Objrec","function.hw-array2objrec","refentry"],["hw_changeobject","function.hw-changeobject","refentry"],["hw_Children","function.hw-children","refentry"],["hw_ChildrenObj","function.hw-childrenobj","refentry"],["hw_Close","function.hw-close","refentry"],["hw_Connect","function.hw-connect","refentry"],["hw_connection_info","function.hw-connection-info","refentry"],["hw_cp","function.hw-cp","refentry"],["hw_Deleteobject","function.hw-deleteobject","refentry"],["hw_DocByAnchor","function.hw-docbyanchor","refentry"],["hw_DocByAnchorObj","function.hw-docbyanchorobj","refentry"],["hw_Document_Attributes","function.hw-document-attributes","refentry"],["hw_Document_BodyTag","function.hw-document-bodytag","refentry"],["hw_Document_Content","function.hw-document-content","refentry"],["hw_Document_SetContent","function.hw-document-setcontent","refentry"],["hw_Document_Size","function.hw-document-size","refentry"],["hw_dummy","function.hw-dummy","refentry"],["hw_EditText","function.hw-edittext","refentry"],["hw_Error","function.hw-error","refentry"],["hw_ErrorMsg","function.hw-errormsg","refentry"],["hw_Free_Document","function.hw-free-document","refentry"],["hw_GetAnchors","function.hw-getanchors","refentry"],["hw_GetAnchorsObj","function.hw-getanchorsobj","refentry"],["hw_GetAndLock","function.hw-getandlock","refentry"],["hw_GetChildColl","function.hw-getchildcoll","refentry"],["hw_GetChildCollObj","function.hw-getchildcollobj","refentry"],["hw_GetChildDocColl","function.hw-getchilddoccoll","refentry"],["hw_GetChildDocCollObj","function.hw-getchilddoccollobj","refentry"],["hw_GetObject","function.hw-getobject","refentry"],["hw_GetObjectByQuery","function.hw-getobjectbyquery","refentry"],["hw_GetObjectByQueryColl","function.hw-getobjectbyquerycoll","refentry"],["hw_GetObjectByQueryCollObj","function.hw-getobjectbyquerycollobj","refentry"],["hw_GetObjectByQueryObj","function.hw-getobjectbyqueryobj","refentry"],["hw_GetParents","function.hw-getparents","refentry"],["hw_GetParentsObj","function.hw-getparentsobj","refentry"],["hw_getrellink","function.hw-getrellink","refentry"],["hw_GetRemote","function.hw-getremote","refentry"],["hw_getremotechildren","function.hw-getremotechildren","refentry"],["hw_GetSrcByDestObj","function.hw-getsrcbydestobj","refentry"],["hw_GetText","function.hw-gettext","refentry"],["hw_getusername","function.hw-getusername","refentry"],["hw_Identify","function.hw-identify","refentry"],["hw_InCollections","function.hw-incollections","refentry"],["hw_Info","function.hw-info","refentry"],["hw_InsColl","function.hw-inscoll","refentry"],["hw_InsDoc","function.hw-insdoc","refentry"],["hw_insertanchors","function.hw-insertanchors","refentry"],["hw_InsertDocument","function.hw-insertdocument","refentry"],["hw_InsertObject","function.hw-insertobject","refentry"],["hw_mapid","function.hw-mapid","refentry"],["","function.hw-modifyobject","example"],["","function.hw-modifyobject","example"],["","function.hw-modifyobject","example"],["","function.hw-modifyobject","example"],["","function.hw-modifyobject","example"],["hw_Modifyobject","function.hw-modifyobject","refentry"],["hw_mv","function.hw-mv","refentry"],["hw_New_Document","function.hw-new-document","refentry"],["hw_objrec2array","function.hw-objrec2array","refentry"],["hw_Output_Document","function.hw-output-document","refentry"],["hw_pConnect","function.hw-pconnect","refentry"],["hw_PipeDocument","function.hw-pipedocument","refentry"],["hw_Root","function.hw-root","refentry"],["hw_setlinkroot","function.hw-setlinkroot","refentry"],["hw_stat","function.hw-stat","refentry"],["hw_Unlock","function.hw-unlock","refentry"],["hw_Who","function.hw-who","refentry"],["","ref.hw","reference"],["","book.hw","book"],["","intro.hwapi","preface"],["","hwapi.requirements","section"],["","hwapi.installation","section"],["","hwapi.configuration","section"],["","hwapi.resources","section"],["","hwapi.setup","chapter"],["","hwapi.constants","appendix"],["","ref.hwapi","section"],["","ref.hwapi","section"],["hw_api::checkin","hwapi.checkin","refentry"],["hw_api::checkout","hwapi.checkout","refentry"],["hw_api::children","hwapi.children","refentry"],["hw_api::content","hwapi.content","refentry"],["hw_api::copy","hwapi.copy","refentry"],["hw_api::dbstat","hwapi.dbstat","refentry"],["hw_api::dcstat","hwapi.dcstat","refentry"],["hw_api::dstanchors","hwapi.dstanchors","refentry"],["hw_api::dstofsrcanchor","hwapi.dstofsrcanchor","refentry"],["hw_api::find","hwapi.find","refentry"],["hw_api::ftstat","hwapi.ftstat","refentry"],["hw_api::hwstat","hwapi.hwstat","refentry"],["hw_api::identify","hwapi.identify","refentry"],["hw_api::info","hwapi.info","refentry"],["hw_api::insert","hwapi.insert","refentry"],["hw_api::insertanchor","hwapi.insertanchor","refentry"],["hw_api::insertcollection","hwapi.insertcollection","refentry"],["hw_api::insertdocument","hwapi.insertdocument","refentry"],["hw_api::link","hwapi.link","refentry"],["hw_api::lock","hwapi.lock","refentry"],["hw_api::move","hwapi.move","refentry"],["","hwapi.object","example"],["hw_api::object","hwapi.object","refentry"],["hw_api::objectbyanchor","hwapi.objectbyanchor","refentry"],["hw_api::parents","hwapi.parents","refentry"],["hw_api::remove","hwapi.remove","refentry"],["hw_api::replace","hwapi.replace","refentry"],["hw_api::setcommittedversion","hwapi.setcommittedversion","refentry"],["hw_api::srcanchors","hwapi.srcanchors","refentry"],["hw_api::srcsofdst","hwapi.srcsofdst","refentry"],["hw_api::unlock","hwapi.unlock","refentry"],["hw_api::user","hwapi.user","refentry"],["hw_api::userlist","hwapi.userlist","refentry"],["hw_api_attribute::key","hwapi.attribute-key","refentry"],["hw_api_attribute::langdepvalue","hwapi.attribute-langdepvalue","refentry"],["hw_api_attribute::value","hwapi.attribute-value","refentry"],["hw_api_attribute::values","hwapi.attribute-values","refentry"],["hw_api_content::mimetype","hwapi.content-mimetype","refentry"],["hw_api_content::read","hwapi.content-read","refentry"],["hw_api_error::count","hwapi.error-count","refentry"],["hw_api_error::reason","hwapi.error-reason","refentry"],["hw_api_object::assign","hwapi.object-assign","refentry"],["hw_api_object::attreditable","hwapi.object-attreditable","refentry"],["hw_api_object::count","hwapi.object-count","refentry"],["hw_api_object::insert","hwapi.object-insert","refentry"],["hw_api_object::remove","hwapi.object-remove","refentry"],["hw_api_object::title","hwapi.object-title","refentry"],["hw_api_object::value","hwapi.object-value","refentry"],["hw_api_reason::description","hwapi.reason-description","refentry"],["hw_api_reason::type","hwapi.reason-type","refentry"],["hwapi_attribute_new","function.hwapi-attribute-new","refentry"],["hwapi_content_new","function.hwapi-content-new","refentry"],["hwapi_hgcsp","function.hwapi-hgcsp","refentry"],["hwapi_object_new","function.hwapi-object-new","refentry"],["","ref.hwapi","reference"],["","book.hwapi","book"],["","intro.java","preface"],["","java.requirements","section"],["","java.installation","section"],["","java.configuration","section"],["","java.resources","section"],["","java.setup","chapter"],["","java.constants","appendix"],["","java.servlet","chapter"],["","java.examples-basic","example"],["","java.examples-basic","example"],["","java.examples-basic","section"],["","java.examples","chapter"],["java_last_exception_clear","function.java-last-exception-clear","refentry"],["","function.java-last-exception-get","example"],["java_last_exception_get","function.java-last-exception-get","refentry"],["","ref.java","reference"],["Java","book.java","book"],["","intro.ldap","preface"],["","ldap.requirements","section"],["","ldap.installation","section"],["","ldap.configuration","varlistentry"],["","ldap.configuration","section"],["","ldap.resources","section"],["","ldap.setup","chapter"],["","ldap.constants","varlistentry"],["","ldap.constants","varlistentry"],["","ldap.constants","varlistentry"],["","ldap.constants","varlistentry"],["","ldap.constants","varlistentry"],["","ldap.constants","varlistentry"],["","ldap.constants","varlistentry"],["","ldap.constants","varlistentry"],["","ldap.constants","varlistentry"],["","ldap.constants","varlistentry"],["","ldap.constants","varlistentry"],["","ldap.constants","varlistentry"],["","ldap.constants","varlistentry"],["","ldap.constants","varlistentry"],["","ldap.constants","varlistentry"],["","ldap.constants","varlistentry"],["","ldap.constants","varlistentry"],["","ldap.constants","varlistentry"],["","ldap.constants","varlistentry"],["","ldap.constants","varlistentry"],["","ldap.constants","varlistentry"],["","ldap.constants","appendix"],["","ldap.using","chapter"],["","ldap.examples-basic","example"],["","ldap.examples-basic","section"],["","ldap.examples","chapter"],["ldap_8859_to_t61","function.ldap-8859-to-t61","refentry"],["","function.ldap-add","example"],["ldap_add","function.ldap-add","refentry"],["","function.ldap-bind","example"],["","function.ldap-bind","example"],["ldap_bind","function.ldap-bind","refentry"],["ldap_close","function.ldap-close","refentry"],["","function.ldap-compare","example"],["ldap_compare","function.ldap-compare","refentry"],["","function.ldap-connect","example"],["","function.ldap-connect","example"],["ldap_connect","function.ldap-connect","refentry"],["ldap_control_paged_result_response","function.ldap-control-paged-result-response","refentry"],["","function.ldap-control-paged-result","example"],["","function.ldap-control-paged-result","example"],["ldap_control_paged_result","function.ldap-control-paged-result","refentry"],["","function.ldap-count-entries","example"],["ldap_count_entries","function.ldap-count-entries","refentry"],["ldap_delete","function.ldap-delete","refentry"],["ldap_dn2ufn","function.ldap-dn2ufn","refentry"],["","function.ldap-err2str","example"],["ldap_err2str","function.ldap-err2str","refentry"],["","function.ldap-errno","example"],["ldap_errno","function.ldap-errno","refentry"],["ldap_error","function.ldap-error","refentry"],["ldap_explode_dn","function.ldap-explode-dn","refentry"],["ldap_first_attribute","function.ldap-first-attribute","refentry"],["ldap_first_entry","function.ldap-first-entry","refentry"],["ldap_first_reference","function.ldap-first-reference","refentry"],["ldap_free_result","function.ldap-free-result","refentry"],["","function.ldap-get-attributes","example"],["ldap_get_attributes","function.ldap-get-attributes","refentry"],["ldap_get_dn","function.ldap-get-dn","refentry"],["ldap_get_entries","function.ldap-get-entries","refentry"],["","function.ldap-get-option","example"],["ldap_get_option","function.ldap-get-option","refentry"],["ldap_get_values_len","function.ldap-get-values-len","refentry"],["","function.ldap-get-values","example"],["ldap_get_values","function.ldap-get-values","refentry"],["","function.ldap-list","example"],["ldap_list","function.ldap-list","refentry"],["ldap_mod_add","function.ldap-mod-add","refentry"],["ldap_mod_del","function.ldap-mod-del","refentry"],["ldap_mod_replace","function.ldap-mod-replace","refentry"],["ldap_modify","function.ldap-modify","refentry"],["ldap_next_attribute","function.ldap-next-attribute","refentry"],["ldap_next_entry","function.ldap-next-entry","refentry"],["ldap_next_reference","function.ldap-next-reference","refentry"],["ldap_parse_reference","function.ldap-parse-reference","refentry"],["ldap_parse_result","function.ldap-parse-result","refentry"],["ldap_read","function.ldap-read","refentry"],["ldap_rename","function.ldap-rename","refentry"],["ldap_sasl_bind","function.ldap-sasl-bind","refentry"],["","function.ldap-search","example"],["ldap_search","function.ldap-search","refentry"],["","function.ldap-set-option","example"],["","function.ldap-set-option","example"],["ldap_set_option","function.ldap-set-option","refentry"],["ldap_set_rebind_proc","function.ldap-set-rebind-proc","refentry"],["","function.ldap-sort","example"],["ldap_sort","function.ldap-sort","refentry"],["ldap_start_tls","function.ldap-start-tls","refentry"],["ldap_t61_to_8859","function.ldap-t61-to-8859","refentry"],["ldap_unbind","function.ldap-unbind","refentry"],["","ref.ldap","reference"],["LDAP","book.ldap","book"],["","intro.notes","preface"],["","notes.requirements","section"],["","notes.installation","section"],["","notes.configuration","section"],["","notes.resources","section"],["","notes.setup","chapter"],["","notes.constants","appendix"],["notes_body","function.notes-body","refentry"],["notes_copy_db","function.notes-copy-db","refentry"],["notes_create_db","function.notes-create-db","refentry"],["notes_create_note","function.notes-create-note","refentry"],["notes_drop_db","function.notes-drop-db","refentry"],["notes_find_note","function.notes-find-note","refentry"],["notes_header_info","function.notes-header-info","refentry"],["notes_list_msgs","function.notes-list-msgs","refentry"],["notes_mark_read","function.notes-mark-read","refentry"],["notes_mark_unread","function.notes-mark-unread","refentry"],["notes_nav_create","function.notes-nav-create","refentry"],["notes_search","function.notes-search","refentry"],["notes_unread","function.notes-unread","refentry"],["notes_version","function.notes-version","refentry"],["","ref.notes","reference"],["","book.notes","book"],["","intro.memcache","preface"],["","memcache.requirements","section"],["","memcache.installation","section"],["","memcache.ini","varlistentry"],["","memcache.ini","varlistentry"],["","memcache.ini","varlistentry"],["","memcache.ini","varlistentry"],["","memcache.ini","varlistentry"],["","memcache.ini","varlistentry"],["","memcache.ini","varlistentry"],["","memcache.ini","varlistentry"],["","memcache.ini","varlistentry"],["","memcache.ini","varlistentry"],["","memcache.ini","varlistentry"],["","memcache.ini","varlistentry"],["","memcache.ini","varlistentry"],["","memcache.ini","section"],["","memcache.resources","section"],["","memcache.setup","chapter"],["","memcache.constants","constant"],["","memcache.constants","constant"],["","memcache.constants","constant"],["","memcache.constants","constant"],["","memcache.constants","constant"],["","memcache.constants","constant"],["","memcache.constants","appendix"],["","memcache.examples-overview","example"],["","memcache.examples-overview","example"],["","memcache.examples-overview","section"],["","memcache.examples","chapter"],["","class.memcache","section"],["","class.memcache","section"],["","memcache.add","example"],["Memcache::add","memcache.add","refentry"],["","memcache.addserver","example"],["Memcache::addServer","memcache.addserver","refentry"],["","memcache.close","example"],["Memcache::close","memcache.close","refentry"],["","memcache.connect","example"],["Memcache::connect","memcache.connect","refentry"],["","memcache.decrement","example"],["Memcache::decrement","memcache.decrement","refentry"],["","memcache.delete","example"],["Memcache::delete","memcache.delete","refentry"],["","memcache.flush","example"],["Memcache::flush","memcache.flush","refentry"],["","memcache.get","example"],["Memcache::get","memcache.get","refentry"],["","memcache.getextendedstats","example"],["Memcache::getExtendedStats","memcache.getextendedstats","refentry"],["","memcache.getserverstatus","example"],["Memcache::getServerStatus","memcache.getserverstatus","refentry"],["Memcache::getStats","memcache.getstats","refentry"],["","memcache.getversion","example"],["Memcache::getVersion","memcache.getversion","refentry"],["","memcache.increment","example"],["Memcache::increment","memcache.increment","refentry"],["","memcache.pconnect","example"],["Memcache::pconnect","memcache.pconnect","refentry"],["","memcache.replace","example"],["Memcache::replace","memcache.replace","refentry"],["","memcache.set","example"],["","memcache.set","example"],["Memcache::set","memcache.set","refentry"],["","memcache.setcompressthreshold","example"],["Memcache::setCompressThreshold","memcache.setcompressthreshold","refentry"],["","memcache.setserverparams","example"],["Memcache::setServerParams","memcache.setserverparams","refentry"],["Memcache","class.memcache","phpdoc:classref"],["memcache_debug","function.memcache-debug","refentry"],["","ref.memcache","reference"],["","book.memcache","book"],["","intro.memcached","preface"],["","memcached.requirements","section"],["","memcached.installation","section"],["","memcached.configuration","varlistentry"],["","memcached.configuration","varlistentry"],["","memcached.configuration","varlistentry"],["","memcached.configuration","varlistentry"],["","memcached.configuration","varlistentry"],["","memcached.configuration","varlistentry"],["","memcached.configuration","varlistentry"],["","memcached.configuration","varlistentry"],["","memcached.configuration","varlistentry"],["","memcached.configuration","varlistentry"],["","memcached.configuration","varlistentry"],["","memcached.configuration","varlistentry"],["","memcached.configuration","varlistentry"],["","memcached.configuration","section"],["","memcached.resources","section"],["","memcached.setup","chapter"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","varlistentry"],["","memcached.constants","appendix"],["","memcached.expiration","chapter"],["","memcached.callbacks.result","example"],["","memcached.callbacks.result","section"],["","memcached.callbacks.read-through","example"],["","memcached.callbacks.read-through","section"],["","memcached.callbacks","chapter"],["","memcached.sessions","varlistentry"],["","memcached.sessions","varlistentry"],["","memcached.sessions","chapter"],["","class.memcached","section"],["","class.memcached","section"],["Memcached::add","memcached.add","refentry"],["Memcached::addByKey","memcached.addbykey","refentry"],["","memcached.addserver","example"],["Memcached::addServer","memcached.addserver","refentry"],["","memcached.addservers","example"],["Memcached::addServers","memcached.addservers","refentry"],["","memcached.append","example"],["Memcached::append","memcached.append","refentry"],["Memcached::appendByKey","memcached.appendbykey","refentry"],["","memcached.cas","example"],["Memcached::cas","memcached.cas","refentry"],["Memcached::casByKey","memcached.casbykey","refentry"],["","memcached.construct","example"],["Memcached::__construct","memcached.construct","refentry"],["","memcached.decrement","example"],["Memcached::decrement","memcached.decrement","refentry"],["Memcached::decrementByKey","memcached.decrementbykey","refentry"],["","memcached.delete","example"],["Memcached::delete","memcached.delete","refentry"],["Memcached::deleteByKey","memcached.deletebykey","refentry"],["Memcached::deleteMulti","memcached.deletemulti","refentry"],["Memcached::deleteMultiByKey","memcached.deletemultibykey","refentry"],["","memcached.fetch","example"],["Memcached::fetch","memcached.fetch","refentry"],["","memcached.fetchall","example"],["Memcached::fetchAll","memcached.fetchall","refentry"],["","memcached.flush","example"],["Memcached::flush","memcached.flush","refentry"],["","memcached.get","example"],["","memcached.get","example"],["Memcached::get","memcached.get","refentry"],["Memcached::getAllKeys","memcached.getallkeys","refentry"],["Memcached::getByKey","memcached.getbykey","refentry"],["","memcached.getdelayed","example"],["Memcached::getDelayed","memcached.getdelayed","refentry"],["Memcached::getDelayedByKey","memcached.getdelayedbykey","refentry"],["","memcached.getmulti","example"],["","memcached.getmulti","example"],["Memcached::getMulti","memcached.getmulti","refentry"],["Memcached::getMultiByKey","memcached.getmultibykey","refentry"],["","memcached.getoption","example"],["Memcached::getOption","memcached.getoption","refentry"],["","memcached.getresultcode","example"],["Memcached::getResultCode","memcached.getresultcode","refentry"],["","memcached.getresultmessage","example"],["Memcached::getResultMessage","memcached.getresultmessage","refentry"],["","memcached.getserverbykey","example"],["Memcached::getServerByKey","memcached.getserverbykey","refentry"],["","memcached.getserverlist","example"],["Memcached::getServerList","memcached.getserverlist","refentry"],["","memcached.getstats","example"],["Memcached::getStats","memcached.getstats","refentry"],["","memcached.getversion","example"],["Memcached::getVersion","memcached.getversion","refentry"],["","memcached.increment","example"],["Memcached::increment","memcached.increment","refentry"],["Memcached::incrementByKey","memcached.incrementbykey","refentry"],["Memcached::isPersistent","memcached.ispersistent","refentry"],["Memcached::isPristine","memcached.ispristine","refentry"],["","memcached.prepend","example"],["Memcached::prepend","memcached.prepend","refentry"],["Memcached::prependByKey","memcached.prependbykey","refentry"],["Memcached::quit","memcached.quit","refentry"],["Memcached::replace","memcached.replace","refentry"],["Memcached::replaceByKey","memcached.replacebykey","refentry"],["Memcached::resetServerList","memcached.resetserverlist","refentry"],["","memcached.set","example"],["Memcached::set","memcached.set","refentry"],["","memcached.setbykey","example"],["Memcached::setByKey","memcached.setbykey","refentry"],["","memcached.setmulti","example"],["Memcached::setMulti","memcached.setmulti","refentry"],["Memcached::setMultiByKey","memcached.setmultibykey","refentry"],["","memcached.setoption","example"],["Memcached::setOption","memcached.setoption","refentry"],["","memcached.setoptions","example"],["Memcached::setOptions","memcached.setoptions","refentry"],["Memcached::setSaslAuthData","memcached.setsaslauthdata","refentry"],["Memcached::touch","memcached.touch","refentry"],["Memcached::touchByKey","memcached.touchbykey","refentry"],["Memcached","class.memcached","phpdoc:classref"],["","class.memcachedexception","section"],["","class.memcachedexception","section"],["MemcachedException","class.memcachedexception","phpdoc:classref"],["Memcached","book.memcached","book"],["","intro.mqseries","preface"],["","mqseries.requirements","section"],["","mqseries.configure","section"],["","mqseries.ini","section"],["","mqseries.resources","section"],["","mqseries.setup","chapter"],["","mqseries.constants","appendix"],["","function.mqseries-back","example"],["mqseries_back","function.mqseries-back","refentry"],["","function.mqseries-begin","example"],["mqseries_begin","function.mqseries-begin","refentry"],["","function.mqseries-close","example"],["mqseries_close","function.mqseries-close","refentry"],["","function.mqseries-cmit","example"],["mqseries_cmit","function.mqseries-cmit","refentry"],["","function.mqseries-conn","example"],["mqseries_conn","function.mqseries-conn","refentry"],["","function.mqseries-connx","example"],["","function.mqseries-connx","example"],["mqseries_connx","function.mqseries-connx","refentry"],["","function.mqseries-disc","example"],["mqseries_disc","function.mqseries-disc","refentry"],["","function.mqseries-get","example"],["mqseries_get","function.mqseries-get","refentry"],["","function.mqseries-inq","example"],["mqseries_inq","function.mqseries-inq","refentry"],["","function.mqseries-open","example"],["mqseries_open","function.mqseries-open","refentry"],["mqseries_put1","function.mqseries-put1","refentry"],["","function.mqseries-put","example"],["mqseries_put","function.mqseries-put","refentry"],["mqseries_set","function.mqseries-set","refentry"],["","function.mqseries-strerror","example"],["mqseries_strerror","function.mqseries-strerror","refentry"],["","ref.mqseries","reference"],["","book.mqseries","book"],["","intro.network","preface"],["","network.requirements","section"],["","network.installation","section"],["","network.configuration","varlistentry"],["","network.configuration","section"],["","network.resources","section"],["","network.setup","chapter"],["","network.constants","appendix"],["checkdnsrr","function.checkdnsrr","refentry"],["closelog","function.closelog","refentry"],["","function.define-syslog-variables","example"],["define_syslog_variables","function.define-syslog-variables","refentry"],["dns_check_record","function.dns-check-record","refentry"],["dns_get_mx","function.dns-get-mx","refentry"],["","function.dns-get-record","example"],["","function.dns-get-record","example"],["dns_get_record","function.dns-get-record","refentry"],["","function.fsockopen","example"],["","function.fsockopen","example"],["fsockopen","function.fsockopen","refentry"],["","function.gethostbyaddr","example"],["gethostbyaddr","function.gethostbyaddr","refentry"],["","function.gethostbyname","example"],["gethostbyname","function.gethostbyname","refentry"],["","function.gethostbynamel","example"],["gethostbynamel","function.gethostbynamel","refentry"],["","function.gethostname","example"],["gethostname","function.gethostname","refentry"],["getmxrr","function.getmxrr","refentry"],["","function.getprotobyname","example"],["getprotobyname","function.getprotobyname","refentry"],["getprotobynumber","function.getprotobynumber","refentry"],["","function.getservbyname","example"],["getservbyname","function.getservbyname","refentry"],["getservbyport","function.getservbyport","refentry"],["","function.header-register-callback","example"],["header_register_callback","function.header-register-callback","refentry"],["","function.header-remove","example"],["","function.header-remove","example"],["header_remove","function.header-remove","refentry"],["","function.header","example"],["","function.header","example"],["header","function.header","refentry"],["","function.headers-list","example"],["headers_list","function.headers-list","refentry"],["","function.headers-sent","example"],["headers_sent","function.headers-sent","refentry"],["","function.http-response-code","example"],["http_response_code","function.http-response-code","refentry"],["","function.inet-ntop","example"],["inet_ntop","function.inet-ntop","refentry"],["","function.inet-pton","example"],["inet_pton","function.inet-pton","refentry"],["","function.ip2long","example"],["","function.ip2long","example"],["ip2long","function.ip2long","refentry"],["long2ip","function.long2ip","refentry"],["openlog","function.openlog","refentry"],["pfsockopen","function.pfsockopen","refentry"],["","function.setcookie","example"],["","function.setcookie","example"],["","function.setcookie","example"],["setcookie","function.setcookie","refentry"],["setrawcookie","function.setrawcookie","refentry"],["socket_get_status","function.socket-get-status","refentry"],["socket_set_blocking","function.socket-set-blocking","refentry"],["socket_set_timeout","function.socket-set-timeout","refentry"],["","function.syslog","example"],["syslog","function.syslog","refentry"],["","ref.network","reference"],["","book.network","book"],["","intro.rrd","preface"],["","rrd.requirements","section"],["","rrd.installation","section"],["","rrd.configuration","section"],["","rrd.resources","section"],["","rrd.setup","chapter"],["","rrd.constants","appendix"],["","rrd.examples-procedural","example"],["","rrd.examples-procedural","section"],["","rrd.examples-oop","example"],["","rrd.examples-oop","section"],["","rrd.examples","chapter"],["rrd_create","function.rrd-create","refentry"],["rrd_error","function.rrd-error","refentry"],["rrd_fetch","function.rrd-fetch","refentry"],["rrd_first","function.rrd-first","refentry"],["rrd_graph","function.rrd-graph","refentry"],["rrd_info","function.rrd-info","refentry"],["rrd_last","function.rrd-last","refentry"],["rrd_lastupdate","function.rrd-lastupdate","refentry"],["rrd_restore","function.rrd-restore","refentry"],["rrd_tune","function.rrd-tune","refentry"],["rrd_update","function.rrd-update","refentry"],["rrd_version","function.rrd-version","refentry"],["rrd_xport","function.rrd-xport","refentry"],["rrdc_disconnect","function.rrdc-disconnect","refentry"],["","ref.rrd","reference"],["","class.rrdcreator","section"],["","class.rrdcreator","section"],["RRDCreator::addArchive","rrdcreator.addarchive","refentry"],["RRDCreator::addDataSource","rrdcreator.adddatasource","refentry"],["RRDCreator::__construct","rrdcreator.construct","refentry"],["RRDCreator::save","rrdcreator.save","refentry"],["RRDCreator","class.rrdcreator","phpdoc:classref"],["","class.rrdgraph","section"],["","class.rrdgraph","section"],["RRDGraph::__construct","rrdgraph.construct","refentry"],["RRDGraph::save","rrdgraph.save","refentry"],["RRDGraph::saveVerbose","rrdgraph.saveverbose","refentry"],["","rrdgraph.setoptions","example"],["","rrdgraph.setoptions","example"],["RRDGraph::setOptions","rrdgraph.setoptions","refentry"],["RRDGraph","class.rrdgraph","phpdoc:classref"],["","class.rrdupdater","section"],["","class.rrdupdater","section"],["RRDUpdater::__construct","rrdupdater.construct","refentry"],["","rrdupdater.update","example"],["RRDUpdater::update","rrdupdater.update","refentry"],["RRDUpdater","class.rrdupdater","phpdoc:classref"],["RRD","book.rrd","book"],["","intro.sam","preface"],["","sam.requirements","section"],["","sam.installation","section"],["","sam.configuration","section"],["","sam.configuration","section"],["","sam.resources","section"],["","sam.setup","chapter"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","varlistentry"],["","sam.constants","appendix"],["","sam.connections","example"],["","sam.connections","example"],["","sam.connections","example"],["","sam.connections","section"],["","sam.messages","example"],["","sam.messages","example"],["","sam.messages","example"],["","sam.messages","example"],["","sam.messages","section"],["","sam.operations","example"],["","sam.operations","section"],["","sam.pubsub","example"],["","sam.pubsub","example"],["","sam.pubsub","example"],["","sam.pubsub","example"],["","sam.pubsub","section"],["","sam.errors","example"],["","sam.errors","example"],["","sam.errors","section"],["","sam.examples","chapter"],["","ref.sam","section"],["","ref.sam","section"],["","ref.sam","section"],["","samconnection.commit","example"],["SAMConnection::commit","samconnection.commit","refentry"],["","samconnection.connect","example"],["","samconnection.connect","example"],["","samconnection.connect","example"],["SAMConnection::connect","samconnection.connect","refentry"],["","samconnection.construct","example"],["SAMConnection::__construct","samconnection.construct","refentry"],["","samconnection.disconnect","example"],["SAMConnection::disconnect","samconnection.disconnect","refentry"],["","samconnection.errno","example"],["SAMConnection::errno","samconnection.errno","refentry"],["","samconnection.error","example"],["SAMConnection::error","samconnection.error","refentry"],["","samconnection.isconnected","example"],["SAMConnection::isConnected","samconnection.isconnected","refentry"],["","samconnection.peek","example"],["","samconnection.peek","example"],["SAMConnection::peek","samconnection.peek","refentry"],["","samconnection.peekall","example"],["","samconnection.peekall","example"],["SAMConnection::peekAll","samconnection.peekall","refentry"],["","samconnection.receive","example"],["","samconnection.receive","example"],["","samconnection.receive","example"],["SAMConnection::receive","samconnection.receive","refentry"],["","samconnection.remove","example"],["SAMConnection::remove","samconnection.remove","refentry"],["","samconnection.rollback","example"],["SAMConnection::rollback","samconnection.rollback","refentry"],["","samconnection.send","example"],["","samconnection.send","example"],["","samconnection.send","example"],["SAMConnection::send","samconnection.send","refentry"],["","samconnection.setdebug","example"],["","samconnection.setdebug","example"],["SAMConnection::setDebug","samconnection.setdebug","refentry"],["","samconnection.subscribe","example"],["SAMConnection::subscribe","samconnection.subscribe","refentry"],["","samconnection.unsubscribe","example"],["SAMConnection::unsubscribe","samconnection.unsubscribe","refentry"],["","sammessage.body","example"],["SAMMessage::body","sammessage.body","refentry"],["","sammessage.construct","example"],["","sammessage.construct","example"],["SAMMessage::__construct","sammessage.construct","refentry"],["","sammessage.header","example"],["","sammessage.header","example"],["","sammessage.header","example"],["","sammessage.header","example"],["SAMMessage::header","sammessage.header","refentry"],["","ref.sam","reference"],["SAM","book.sam","book"],["","intro.snmp","preface"],["","snmp.requirements","section"],["","snmp.installation","section"],["","snmp.configuration","section"],["","snmp.resources","section"],["","snmp.setup","chapter"],["","snmp.constants","varlistentry"],["","snmp.constants","varlistentry"],["","snmp.constants","varlistentry"],["","snmp.constants","varlistentry"],["","snmp.constants","varlistentry"],["","snmp.constants","varlistentry"],["","snmp.constants","varlistentry"],["","snmp.constants","varlistentry"],["","snmp.constants","varlistentry"],["","snmp.constants","varlistentry"],["","snmp.constants","varlistentry"],["","snmp.constants","varlistentry"],["","snmp.constants","varlistentry"],["","snmp.constants","varlistentry"],["","snmp.constants","varlistentry"],["","snmp.constants","varlistentry"],["","snmp.constants","varlistentry"],["","snmp.constants","varlistentry"],["","snmp.constants","varlistentry"],["","snmp.constants","varlistentry"],["","snmp.constants","varlistentry"],["","snmp.constants","appendix"],["","function.snmp-get-quick-print","example"],["snmp_get_quick_print","function.snmp-get-quick-print","refentry"],["","function.snmp-get-valueretrieval","example"],["snmp_get_valueretrieval","function.snmp-get-valueretrieval","refentry"],["","function.snmp-read-mib","example"],["snmp_read_mib","function.snmp-read-mib","refentry"],["","function.snmp-set-enum-print","example"],["snmp_set_enum_print","function.snmp-set-enum-print","refentry"],["snmp_set_oid_numeric_print","function.snmp-set-oid-numeric-print","refentry"],["","function.snmp-set-oid-output-format","example"],["snmp_set_oid_output_format","function.snmp-set-oid-output-format","refentry"],["","function.snmp-set-quick-print","example"],["snmp_set_quick_print","function.snmp-set-quick-print","refentry"],["","function.snmp-set-valueretrieval","example"],["snmp_set_valueretrieval","function.snmp-set-valueretrieval","refentry"],["","function.snmp2-get","example"],["snmp2_get","function.snmp2-get","refentry"],["","function.snmp2-getnext","example"],["snmp2_getnext","function.snmp2-getnext","refentry"],["","function.snmp2-real-walk","example"],["snmp2_real_walk","function.snmp2-real-walk","refentry"],["","function.snmp2-set","example"],["","function.snmp2-set","example"],["snmp2_set","function.snmp2-set","refentry"],["","function.snmp2-walk","example"],["snmp2_walk","function.snmp2-walk","refentry"],["","function.snmp3-get","example"],["snmp3_get","function.snmp3-get","refentry"],["","function.snmp3-getnext","example"],["snmp3_getnext","function.snmp3-getnext","refentry"],["","function.snmp3-real-walk","example"],["snmp3_real_walk","function.snmp3-real-walk","refentry"],["","function.snmp3-set","example"],["","function.snmp3-set","example"],["snmp3_set","function.snmp3-set","refentry"],["","function.snmp3-walk","example"],["snmp3_walk","function.snmp3-walk","refentry"],["","function.snmpget","example"],["snmpget","function.snmpget","refentry"],["","function.snmpgetnext","example"],["snmpgetnext","function.snmpgetnext","refentry"],["","function.snmprealwalk","example"],["snmprealwalk","function.snmprealwalk","refentry"],["","function.snmpset","example"],["","function.snmpset","example"],["snmpset","function.snmpset","refentry"],["","function.snmpwalk","example"],["snmpwalk","function.snmpwalk","refentry"],["","function.snmpwalkoid","example"],["snmpwalkoid","function.snmpwalkoid","refentry"],["","ref.snmp","reference"],["","class.snmp","section"],["","class.snmp","section"],["","class.snmp","varlistentry"],["","class.snmp","varlistentry"],["","class.snmp","varlistentry"],["","class.snmp","varlistentry"],["","class.snmp","varlistentry"],["","class.snmp","varlistentry"],["","class.snmp","varlistentry"],["","class.snmp","varlistentry"],["","class.snmp","section"],["","class.snmp","varlistentry"],["","class.snmp","varlistentry"],["","class.snmp","varlistentry"],["","class.snmp","varlistentry"],["","class.snmp","varlistentry"],["","class.snmp","varlistentry"],["","class.snmp","varlistentry"],["","class.snmp","varlistentry"],["","class.snmp","section"],["","class.snmp","varlistentry"],["","class.snmp","varlistentry"],["","class.snmp","varlistentry"],["","class.snmp","section"],["","class.snmp","section"],["","snmp.close","example"],["SNMP::close","snmp.close","refentry"],["","snmp.construct","example"],["SNMP::__construct","snmp.construct","refentry"],["","snmp.get","example"],["","snmp.get","example"],["SNMP::get","snmp.get","refentry"],["","snmp.geterrno","example"],["SNMP::getErrno","snmp.geterrno","refentry"],["","snmp.geterror","example"],["SNMP::getError","snmp.geterror","refentry"],["","snmp.getnext","example"],["","snmp.getnext","example"],["SNMP::getnext","snmp.getnext","refentry"],["","snmp.set","example"],["","snmp.set","example"],["","snmp.set","example"],["SNMP::set","snmp.set","refentry"],["","snmp.setsecurity","example"],["SNMP::setSecurity","snmp.setsecurity","refentry"],["","snmp.walk","example"],["","snmp.walk","example"],["SNMP::walk","snmp.walk","refentry"],["SNMP","class.snmp","phpdoc:classref"],["","class.snmpexception","section"],["","class.snmpexception","section"],["","class.snmpexception","varlistentry"],["","class.snmpexception","section"],["SNMPException","class.snmpexception","phpdoc:exceptionref"],["","book.snmp","book"],["","intro.sockets","preface"],["","sockets.requirements","section"],["","sockets.installation","section"],["","sockets.configuration","section"],["","sockets.resources","section"],["","sockets.setup","chapter"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","varlistentry"],["","sockets.constants","appendix"],["","sockets.examples","example"],["","sockets.examples","example"],["","sockets.examples","chapter"],["","sockets.errors","chapter"],["socket_accept","function.socket-accept","refentry"],["","function.socket-bind","example"],["socket_bind","function.socket-bind","refentry"],["socket_clear_error","function.socket-clear-error","refentry"],["socket_close","function.socket-close","refentry"],["socket_cmsg_space","function.socket-cmsg-space","refentry"],["socket_connect","function.socket-connect","refentry"],["socket_create_listen","function.socket-create-listen","refentry"],["","function.socket-create-pair","example"],["","function.socket-create-pair","example"],["socket_create_pair","function.socket-create-pair","refentry"],["socket_create","function.socket-create","refentry"],["","function.socket-get-option","example"],["socket_get_option","function.socket-get-option","refentry"],["socket_getpeername","function.socket-getpeername","refentry"],["socket_getsockname","function.socket-getsockname","refentry"],["","function.socket-import-stream","example"],["socket_import_stream","function.socket-import-stream","refentry"],["","function.socket-last-error","example"],["socket_last_error","function.socket-last-error","refentry"],["socket_listen","function.socket-listen","refentry"],["socket_read","function.socket-read","refentry"],["","function.socket-recv","example"],["socket_recv","function.socket-recv","refentry"],["","function.socket-recvfrom","example"],["socket_recvfrom","function.socket-recvfrom","refentry"],["socket_recvmsg","function.socket-recvmsg","refentry"],["","function.socket-select","example"],["","function.socket-select","example"],["","function.socket-select","example"],["socket_select","function.socket-select","refentry"],["socket_send","function.socket-send","refentry"],["socket_sendmsg","function.socket-sendmsg","refentry"],["","function.socket-sendto","example"],["socket_sendto","function.socket-sendto","refentry"],["","function.socket-set-block","example"],["socket_set_block","function.socket-set-block","refentry"],["","function.socket-set-nonblock","example"],["socket_set_nonblock","function.socket-set-nonblock","refentry"],["","function.socket-set-option","example"],["socket_set_option","function.socket-set-option","refentry"],["socket_shutdown","function.socket-shutdown","refentry"],["","function.socket-strerror","example"],["socket_strerror","function.socket-strerror","refentry"],["socket_write","function.socket-write","refentry"],["","ref.sockets","reference"],["","book.sockets","book"],["","intro.ssh2","preface"],["","ssh2.requirements","section"],["","ssh2.installation","section"],["","ssh2.configuration","section"],["","ssh2.resources","section"],["","ssh2.setup","chapter"],["","ssh2.constants","varlistentry"],["","ssh2.constants","varlistentry"],["","ssh2.constants","varlistentry"],["","ssh2.constants","varlistentry"],["","ssh2.constants","varlistentry"],["","ssh2.constants","varlistentry"],["","ssh2.constants","varlistentry"],["","ssh2.constants","varlistentry"],["","ssh2.constants","varlistentry"],["","ssh2.constants","varlistentry"],["","ssh2.constants","varlistentry"],["","ssh2.constants","varlistentry"],["","ssh2.constants","appendix"],["","function.ssh2-auth-agent","example"],["ssh2_auth_agent","function.ssh2-auth-agent","refentry"],["","function.ssh2-auth-hostbased-file","example"],["ssh2_auth_hostbased_file","function.ssh2-auth-hostbased-file","refentry"],["","function.ssh2-auth-none","example"],["ssh2_auth_none","function.ssh2-auth-none","refentry"],["","function.ssh2-auth-password","example"],["ssh2_auth_password","function.ssh2-auth-password","refentry"],["","function.ssh2-auth-pubkey-file","example"],["ssh2_auth_pubkey_file","function.ssh2-auth-pubkey-file","refentry"],["","function.ssh2-connect","example"],["ssh2_connect","function.ssh2-connect","refentry"],["","function.ssh2-exec","example"],["ssh2_exec","function.ssh2-exec","refentry"],["","function.ssh2-fetch-stream","example"],["ssh2_fetch_stream","function.ssh2-fetch-stream","refentry"],["","function.ssh2-fingerprint","example"],["ssh2_fingerprint","function.ssh2-fingerprint","refentry"],["","function.ssh2-methods-negotiated","example"],["ssh2_methods_negotiated","function.ssh2-methods-negotiated","refentry"],["","function.ssh2-publickey-add","example"],["ssh2_publickey_add","function.ssh2-publickey-add","refentry"],["ssh2_publickey_init","function.ssh2-publickey-init","refentry"],["","function.ssh2-publickey-list","example"],["ssh2_publickey_list","function.ssh2-publickey-list","refentry"],["ssh2_publickey_remove","function.ssh2-publickey-remove","refentry"],["","function.ssh2-scp-recv","example"],["ssh2_scp_recv","function.ssh2-scp-recv","refentry"],["","function.ssh2-scp-send","example"],["ssh2_scp_send","function.ssh2-scp-send","refentry"],["","function.ssh2-sftp-chmod","example"],["ssh2_sftp_chmod","function.ssh2-sftp-chmod","refentry"],["","function.ssh2-sftp-lstat","example"],["ssh2_sftp_lstat","function.ssh2-sftp-lstat","refentry"],["","function.ssh2-sftp-mkdir","example"],["ssh2_sftp_mkdir","function.ssh2-sftp-mkdir","refentry"],["","function.ssh2-sftp-readlink","example"],["ssh2_sftp_readlink","function.ssh2-sftp-readlink","refentry"],["","function.ssh2-sftp-realpath","example"],["ssh2_sftp_realpath","function.ssh2-sftp-realpath","refentry"],["","function.ssh2-sftp-rename","example"],["ssh2_sftp_rename","function.ssh2-sftp-rename","refentry"],["","function.ssh2-sftp-rmdir","example"],["ssh2_sftp_rmdir","function.ssh2-sftp-rmdir","refentry"],["","function.ssh2-sftp-stat","example"],["ssh2_sftp_stat","function.ssh2-sftp-stat","refentry"],["","function.ssh2-sftp-symlink","example"],["ssh2_sftp_symlink","function.ssh2-sftp-symlink","refentry"],["","function.ssh2-sftp-unlink","example"],["ssh2_sftp_unlink","function.ssh2-sftp-unlink","refentry"],["","function.ssh2-sftp","example"],["ssh2_sftp","function.ssh2-sftp","refentry"],["","function.ssh2-shell","example"],["ssh2_shell","function.ssh2-shell","refentry"],["","function.ssh2-tunnel","example"],["ssh2_tunnel","function.ssh2-tunnel","refentry"],["","ref.ssh2","reference"],["SSH2","book.ssh2","book"],["","intro.stomp","preface"],["","stomp.requirements","section"],["","stomp.installation","section"],["","stomp.configuration","varlistentry"],["","stomp.configuration","varlistentry"],["","stomp.configuration","varlistentry"],["","stomp.configuration","varlistentry"],["","stomp.configuration","varlistentry"],["","stomp.configuration","section"],["","stomp.resources","section"],["","stomp.setup","chapter"],["","stomp.examples","example"],["","stomp.examples","example"],["","stomp.examples","chapter"],["","function.stomp-connect-error","example"],["stomp_connect_error","function.stomp-connect-error","refentry"],["","function.stomp-version","example"],["stomp_version","function.stomp-version","refentry"],["","ref.stomp","reference"],["","class.stomp","section"],["","class.stomp","section"],["","stomp.abort","example"],["","stomp.abort","example"],["Stomp::abort","stomp.abort","refentry"],["","stomp.ack","example"],["","stomp.ack","example"],["Stomp::ack","stomp.ack","refentry"],["Stomp::begin","stomp.begin","refentry"],["","stomp.commit","example"],["","stomp.commit","example"],["Stomp::commit","stomp.commit","refentry"],["","stomp.construct","example"],["","stomp.construct","example"],["Stomp::__construct","stomp.construct","refentry"],["Stomp::__destruct","stomp.destruct","refentry"],["","stomp.error","example"],["","stomp.error","example"],["Stomp::error","stomp.error","refentry"],["","stomp.getreadtimeout","example"],["","stomp.getreadtimeout","example"],["Stomp::getReadTimeout","stomp.getreadtimeout","refentry"],["","stomp.getsessionid","example"],["","stomp.getsessionid","example"],["Stomp::getSessionId","stomp.getsessionid","refentry"],["Stomp::hasFrame","stomp.hasframe","refentry"],["","stomp.readframe","example"],["","stomp.readframe","example"],["Stomp::readFrame","stomp.readframe","refentry"],["Stomp::send","stomp.send","refentry"],["","stomp.setreadtimeout","example"],["","stomp.setreadtimeout","example"],["Stomp::setReadTimeout","stomp.setreadtimeout","refentry"],["Stomp::subscribe","stomp.subscribe","refentry"],["Stomp::unsubscribe","stomp.unsubscribe","refentry"],["Stomp","class.stomp","phpdoc:classref"],["","class.stompframe","section"],["","class.stompframe","section"],["","class.stompframe","varlistentry"],["","class.stompframe","varlistentry"],["","class.stompframe","varlistentry"],["","class.stompframe","section"],["StompFrame::__construct","stompframe.construct","refentry"],["StompFrame","class.stompframe","phpdoc:classref"],["","class.stompexception","section"],["","class.stompexception","section"],["StompException::getDetails","stomp.getdetails","refentry"],["StompException","class.stompexception","phpdoc:classref"],["Stomp","book.stomp","book"],["","intro.svm","preface"],["","svm.requirements","section"],["","svm.installation","section"],["","svm.configuration","section"],["","svm.resources","section"],["","svm.setup","chapter"],["","svm.examples","example"],["","svm.examples","example"],["","svm.examples","chapter"],["","class.svm","section"],["","class.svm","section"],["","class.svm","varlistentry"],["","class.svm","varlistentry"],["","class.svm","varlistentry"],["","class.svm","varlistentry"],["","class.svm","varlistentry"],["","class.svm","varlistentry"],["","class.svm","varlistentry"],["","class.svm","varlistentry"],["","class.svm","varlistentry"],["","class.svm","varlistentry"],["","class.svm","varlistentry"],["","class.svm","varlistentry"],["","class.svm","varlistentry"],["","class.svm","varlistentry"],["","class.svm","varlistentry"],["","class.svm","varlistentry"],["","class.svm","varlistentry"],["","class.svm","varlistentry"],["","class.svm","varlistentry"],["","class.svm","varlistentry"],["","class.svm","varlistentry"],["","class.svm","varlistentry"],["","class.svm","section"],["","class.svm","section"],["SVM::__construct","svm.construct","refentry"],["SVM::crossvalidate","svm.crossvalidate","refentry"],["SVM::getOptions","svm.getoptions","refentry"],["SVM::setOptions","svm.setoptions","refentry"],["SVM::train","svm.train","refentry"],["SVM","class.svm","phpdoc:classref"],["","class.svmmodel","section"],["","class.svmmodel","section"],["SVMModel::checkProbabilityModel","svmmodel.checkprobabilitymodel","refentry"],["SVMModel::__construct","svmmodel.construct","refentry"],["SVMModel::getLabels","svmmodel.getlabels","refentry"],["SVMModel::getNrClass","svmmodel.getnrclass","refentry"],["SVMModel::getSvmType","svmmodel.getsvmtype","refentry"],["SVMModel::getSvrProbability","svmmodel.getsvrprobability","refentry"],["SVMModel::load","svmmodel.load","refentry"],["SVMModel::predict_probability","svmmodel.predict-probability","refentry"],["SVMModel::predict","svmmodel.predict","refentry"],["SVMModel::save","svmmodel.save","refentry"],["SVMModel","class.svmmodel","phpdoc:classref"],["SVM","book.svm","book"],["","intro.svn","preface"],["","svn.requirements","section"],["","svn.installation","section"],["","svn.configuration","section"],["","svn.resources","section"],["","svn.setup","chapter"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","variablelist"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","variablelist"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","varlistentry"],["","svn.constants","variablelist"],["","svn.constants","appendix"],["","function.svn-add","example"],["svn_add","function.svn-add","refentry"],["svn_auth_get_parameter","function.svn-auth-get-parameter","refentry"],["","function.svn-auth-set-parameter","example"],["svn_auth_set_parameter","function.svn-auth-set-parameter","refentry"],["","function.svn-blame","example"],["svn_blame","function.svn-blame","refentry"],["","function.svn-cat","example"],["svn_cat","function.svn-cat","refentry"],["","function.svn-checkout","example"],["svn_checkout","function.svn-checkout","refentry"],["","function.svn-cleanup","example"],["svn_cleanup","function.svn-cleanup","refentry"],["","function.svn-client-version","example"],["svn_client_version","function.svn-client-version","refentry"],["","function.svn-commit","example"],["svn_commit","function.svn-commit","refentry"],["svn_delete","function.svn-delete","refentry"],["","function.svn-diff","example"],["","function.svn-diff","example"],["","function.svn-diff","example"],["svn_diff","function.svn-diff","refentry"],["","function.svn-export","example"],["svn_export","function.svn-export","refentry"],["svn_fs_abort_txn","function.svn-fs-abort-txn","refentry"],["svn_fs_apply_text","function.svn-fs-apply-text","refentry"],["svn_fs_begin_txn2","function.svn-fs-begin-txn2","refentry"],["svn_fs_change_node_prop","function.svn-fs-change-node-prop","refentry"],["svn_fs_check_path","function.svn-fs-check-path","refentry"],["svn_fs_contents_changed","function.svn-fs-contents-changed","refentry"],["svn_fs_copy","function.svn-fs-copy","refentry"],["svn_fs_delete","function.svn-fs-delete","refentry"],["svn_fs_dir_entries","function.svn-fs-dir-entries","refentry"],["svn_fs_file_contents","function.svn-fs-file-contents","refentry"],["svn_fs_file_length","function.svn-fs-file-length","refentry"],["svn_fs_is_dir","function.svn-fs-is-dir","refentry"],["svn_fs_is_file","function.svn-fs-is-file","refentry"],["svn_fs_make_dir","function.svn-fs-make-dir","refentry"],["svn_fs_make_file","function.svn-fs-make-file","refentry"],["svn_fs_node_created_rev","function.svn-fs-node-created-rev","refentry"],["svn_fs_node_prop","function.svn-fs-node-prop","refentry"],["svn_fs_props_changed","function.svn-fs-props-changed","refentry"],["svn_fs_revision_prop","function.svn-fs-revision-prop","refentry"],["svn_fs_revision_root","function.svn-fs-revision-root","refentry"],["svn_fs_txn_root","function.svn-fs-txn-root","refentry"],["svn_fs_youngest_rev","function.svn-fs-youngest-rev","refentry"],["","function.svn-import","example"],["svn_import","function.svn-import","refentry"],["","function.svn-log","example"],["svn_log","function.svn-log","refentry"],["","function.svn-ls","example"],["svn_ls","function.svn-ls","refentry"],["svn_mkdir","function.svn-mkdir","refentry"],["svn_repos_create","function.svn-repos-create","refentry"],["svn_repos_fs_begin_txn_for_commit","function.svn-repos-fs-begin-txn-for-commit","refentry"],["svn_repos_fs_commit_txn","function.svn-repos-fs-commit-txn","refentry"],["svn_repos_fs","function.svn-repos-fs","refentry"],["svn_repos_hotcopy","function.svn-repos-hotcopy","refentry"],["svn_repos_open","function.svn-repos-open","refentry"],["svn_repos_recover","function.svn-repos-recover","refentry"],["svn_revert","function.svn-revert","refentry"],["","function.svn-status","example"],["svn_status","function.svn-status","refentry"],["","function.svn-update","example"],["svn_update","function.svn-update","refentry"],["","ref.svn","reference"],["SVN","book.svn","book"],["","intro.tcpwrap","preface"],["","tcpwrap.requirements","section"],["","tcpwrap.installation","section"],["","tcpwrap.configuration","section"],["","tcpwrap.resources","section"],["","tcpwrap.setup","chapter"],["","tcpwrap.constants","appendix"],["","function.tcpwrap-check","example"],["tcpwrap_check","function.tcpwrap-check","refentry"],["","ref.tcpwrap","reference"],["TCP","book.tcpwrap","book"],["","intro.varnish","preface"],["","varnish.requirements","section"],["","varnish.installation","section"],["","varnish.configuration","section"],["","varnish.resources","section"],["","varnish.setup","chapter"],["","varnish.constants","varlistentry"],["","varnish.constants","varlistentry"],["","varnish.constants","varlistentry"],["","varnish.constants","varlistentry"],["","varnish.constants","varlistentry"],["","varnish.constants","varlistentry"],["","varnish.constants","varlistentry"],["","varnish.constants","varlistentry"],["","varnish.constants","varlistentry"],["","varnish.constants","varlistentry"],["","varnish.constants","varlistentry"],["","varnish.constants","varlistentry"],["","varnish.constants","varlistentry"],["","varnish.constants","varlistentry"],["","varnish.constants","varlistentry"],["","varnish.constants","varlistentry"],["","varnish.constants","varlistentry"],["","varnish.constants","varlistentry"],["","varnish.constants","varlistentry"],["","varnish.constants","appendix"],["","varnish.example.admin","example"],["","varnish.example.admin","section"],["","varnish.example.stat","example"],["","varnish.example.stat","section"],["","varnish.example.log","example"],["","varnish.example.log","section"],["","varnish.examples","chapter"],["","class.varnishadmin","section"],["","class.varnishadmin","section"],["VarnishAdmin::auth","varnishadmin.auth","refentry"],["VarnishAdmin::ban","varnishadmin.ban","refentry"],["VarnishAdmin::banUrl","varnishadmin.banurl","refentry"],["VarnishAdmin::clearPanic","varnishadmin.clearpanic","refentry"],["VarnishAdmin::connect","varnishadmin.connect","refentry"],["","varnishadmin.construct","example"],["VarnishAdmin::__construct","varnishadmin.construct","refentry"],["VarnishAdmin::disconnect","varnishadmin.disconnect","refentry"],["VarnishAdmin::getPanic","varnishadmin.getpanic","refentry"],["VarnishAdmin::getParams","varnishadmin.getparams","refentry"],["VarnishAdmin::isRunning","varnishadmin.isrunning","refentry"],["VarnishAdmin::setCompat","varnishadmin.setcompat","refentry"],["VarnishAdmin::setHost","varnishadmin.sethost","refentry"],["VarnishAdmin::setIdent","varnishadmin.setident","refentry"],["VarnishAdmin::setParam","varnishadmin.setparam","refentry"],["VarnishAdmin::setPort","varnishadmin.setport","refentry"],["VarnishAdmin::setSecret","varnishadmin.setsecret","refentry"],["VarnishAdmin::setTimeout","varnishadmin.settimeout","refentry"],["VarnishAdmin::start","varnishadmin.start","refentry"],["VarnishAdmin::stop","varnishadmin.stop","refentry"],["VarnishAdmin","class.varnishadmin","phpdoc:classref"],["","class.varnishstat","section"],["","class.varnishstat","section"],["VarnishStat::__construct","varnishstat.construct","refentry"],["VarnishStat::getSnapshot","varnishstat.getsnapshot","refentry"],["VarnishStat","class.varnishstat","phpdoc:classref"],["","class.varnishlog","section"],["","class.varnishlog","section"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","varlistentry"],["","class.varnishlog","section"],["VarnishLog::__construct","varnishlog.construct","refentry"],["VarnishLog::getLine","varnishlog.getline","refentry"],["VarnishLog::getTagName","varnishlog.gettagname","refentry"],["VarnishLog","class.varnishlog","phpdoc:classref"],["Varnish","book.varnish","book"],["","intro.yaz","preface"],["","yaz.requirements","section"],["","yaz.installation","section"],["","yaz.configuration","section"],["","yaz.resources","section"],["","yaz.setup","chapter"],["","yaz.constants","appendix"],["","yaz.examples","example"],["","yaz.examples","chapter"],["yaz_addinfo","function.yaz-addinfo","refentry"],["","function.yaz-ccl-conf","example"],["yaz_ccl_conf","function.yaz-ccl-conf","refentry"],["","function.yaz-ccl-parse","example"],["yaz_ccl_parse","function.yaz-ccl-parse","refentry"],["yaz_close","function.yaz-close","refentry"],["yaz_connect","function.yaz-connect","refentry"],["yaz_database","function.yaz-database","refentry"],["yaz_element","function.yaz-element","refentry"],["yaz_errno","function.yaz-errno","refentry"],["yaz_error","function.yaz-error","refentry"],["yaz_es_result","function.yaz-es-result","refentry"],["","function.yaz-es","example"],["yaz_es","function.yaz-es","refentry"],["yaz_get_option","function.yaz-get-option","refentry"],["yaz_hits","function.yaz-hits","refentry"],["yaz_itemorder","function.yaz-itemorder","refentry"],["yaz_present","function.yaz-present","refentry"],["yaz_range","function.yaz-range","refentry"],["","function.yaz-record","example"],["","function.yaz-record","example"],["yaz_record","function.yaz-record","refentry"],["yaz_scan_result","function.yaz-scan-result","refentry"],["","function.yaz-scan","example"],["yaz_scan","function.yaz-scan","refentry"],["yaz_schema","function.yaz-schema","refentry"],["","function.yaz-search","example"],["yaz_search","function.yaz-search","refentry"],["yaz_set_option","function.yaz-set-option","refentry"],["","function.yaz-sort","example"],["yaz_sort","function.yaz-sort","refentry"],["yaz_syntax","function.yaz-syntax","refentry"],["yaz_wait","function.yaz-wait","refentry"],["","ref.yaz","reference"],["","book.yaz","book"],["","intro.nis","preface"],["","nis.requirements","section"],["","nis.installation","section"],["","nis.configuration","section"],["","nis.resources","section"],["","nis.setup","chapter"],["","nis.constants","varlistentry"],["","nis.constants","varlistentry"],["","nis.constants","varlistentry"],["","nis.constants","varlistentry"],["","nis.constants","varlistentry"],["","nis.constants","varlistentry"],["","nis.constants","varlistentry"],["","nis.constants","varlistentry"],["","nis.constants","varlistentry"],["","nis.constants","varlistentry"],["","nis.constants","varlistentry"],["","nis.constants","varlistentry"],["","nis.constants","varlistentry"],["","nis.constants","varlistentry"],["","nis.constants","varlistentry"],["","nis.constants","varlistentry"],["","nis.constants","appendix"],["yp_all","function.yp-all","refentry"],["yp_cat","function.yp-cat","refentry"],["","function.yp-err-string","example"],["yp_err_string","function.yp-err-string","refentry"],["yp_errno","function.yp-errno","refentry"],["","function.yp-first","example"],["yp_first","function.yp-first","refentry"],["","function.yp-get-default-domain","example"],["yp_get_default_domain","function.yp-get-default-domain","refentry"],["","function.yp-master","example"],["yp_master","function.yp-master","refentry"],["","function.yp-match","example"],["yp_match","function.yp-match","refentry"],["","function.yp-next","example"],["yp_next","function.yp-next","refentry"],["","function.yp-order","example"],["yp_order","function.yp-order","refentry"],["","ref.nis","reference"],["","book.nis","book"],["","intro.zmq","preface"],["","zmq.requirements","section"],["","zmq.requirements","section"],["","zmq.setup","chapter"],["","class.zmq","section"],["","class.zmq","section"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","varlistentry"],["","class.zmq","section"],["","class.zmq","section"],["ZMQ::__construct","zmq.construct","refentry"],["ZMQ","class.zmq","phpdoc:classref"],["","class.zmqcontext","section"],["","class.zmqcontext","section"],["","zmqcontext.construct","example"],["ZMQContext::__construct","zmqcontext.construct","refentry"],["ZMQContext::getOpt","zmqcontext.getopt","refentry"],["","zmqcontext.getsocket","example"],["ZMQContext::getSocket","zmqcontext.getsocket","refentry"],["ZMQContext::isPersistent","zmqcontext.ispersistent","refentry"],["ZMQContext::setOpt","zmqcontext.setopt","refentry"],["ZMQContext","class.zmqcontext","phpdoc:classref"],["","class.zmqsocket","section"],["","class.zmqsocket","section"],["ZMQSocket::bind","zmqsocket.bind","refentry"],["","zmqsocket.connect","example"],["ZMQSocket::connect","zmqsocket.connect","refentry"],["","zmqsocket.construct","example"],["ZMQSocket::__construct","zmqsocket.construct","refentry"],["ZMQSocket::disconnect","zmqsocket.disconnect","refentry"],["ZMQSocket::getEndpoints","zmqsocket.getendpoints","refentry"],["ZMQSocket::getPersistentId","zmqsocket.getpersistentid","refentry"],["ZMQSocket::getSocketType","zmqsocket.getsockettype","refentry"],["ZMQSocket::getSockOpt","zmqsocket.getsockopt","refentry"],["ZMQSocket::isPersistent","zmqsocket.ispersistent","refentry"],["","zmqsocket.recv","example"],["ZMQSocket::recv","zmqsocket.recv","refentry"],["ZMQSocket::recvMulti","zmqsocket.recvmulti","refentry"],["ZMQSocket::send","zmqsocket.send","refentry"],["ZMQSocket::sendmulti","zmqsocket.sendmulti","refentry"],["ZMQSocket::setSockOpt","zmqsocket.setsockopt","refentry"],["ZMQSocket::unbind","zmqsocket.unbind","refentry"],["ZMQSocket","class.zmqsocket","phpdoc:classref"],["","class.zmqpoll","section"],["","class.zmqpoll","section"],["ZMQPoll::add","zmqpoll.add","refentry"],["ZMQPoll::clear","zmqpoll.clear","refentry"],["ZMQPoll::count","zmqpoll.count","refentry"],["ZMQPoll::getLastErrors","zmqpoll.getlasterrors","refentry"],["","zmqpoll.poll","example"],["ZMQPoll::poll","zmqpoll.poll","refentry"],["ZMQPoll::remove","zmqpoll.remove","refentry"],["ZMQPoll","class.zmqpoll","phpdoc:classref"],["","class.zmqdevice","section"],["","class.zmqdevice","section"],["ZMQDevice::__construct","zmqdevice.construct","refentry"],["ZMQDevice::getIdleTimeout","zmqdevice.getidletimeout","refentry"],["ZMQDevice::getTimerTimeout","zmqdevice.gettimertimeout","refentry"],["ZMQDevice::run","zmqdevice.run","refentry"],["ZMQDevice::setIdleCallback","zmqdevice.setidlecallback","refentry"],["ZMQDevice::setIdleTimeout","zmqdevice.setidletimeout","refentry"],["ZMQDevice::setTimerCallback","zmqdevice.settimercallback","refentry"],["ZMQDevice::setTimerTimeout","zmqdevice.settimertimeout","refentry"],["ZMQDevice","class.zmqdevice","phpdoc:classref"],["0MQ messaging","book.zmq","book"],["","refs.remote.other","set"],["","intro.mnogosearch","preface"],["","mnogosearch.requirements","section"],["","mnogosearch.installation","section"],["","mnogosearch.configuration","section"],["","mnogosearch.resources","section"],["","mnogosearch.setup","chapter"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","varlistentry"],["","mnogosearch.constants","appendix"],["","function.udm-add-search-limit","example"],["udm_add_search_limit","function.udm-add-search-limit","refentry"],["udm_alloc_agent_array","function.udm-alloc-agent-array","refentry"],["udm_alloc_agent","function.udm-alloc-agent","refentry"],["","function.udm-api-version","example"],["udm_api_version","function.udm-api-version","refentry"],["","function.udm-cat-list","example"],["udm_cat_list","function.udm-cat-list","refentry"],["","function.udm-cat-path","example"],["udm_cat_path","function.udm-cat-path","refentry"],["udm_check_charset","function.udm-check-charset","refentry"],["udm_check_stored","function.udm-check-stored","refentry"],["udm_clear_search_limits","function.udm-clear-search-limits","refentry"],["udm_close_stored","function.udm-close-stored","refentry"],["udm_crc32","function.udm-crc32","refentry"],["udm_errno","function.udm-errno","refentry"],["udm_error","function.udm-error","refentry"],["udm_find","function.udm-find","refentry"],["udm_free_agent","function.udm-free-agent","refentry"],["udm_free_ispell_data","function.udm-free-ispell-data","refentry"],["udm_free_res","function.udm-free-res","refentry"],["udm_get_doc_count","function.udm-get-doc-count","refentry"],["udm_get_res_field","function.udm-get-res-field","refentry"],["udm_get_res_param","function.udm-get-res-param","refentry"],["udm_hash32","function.udm-hash32","refentry"],["","function.udm-load-ispell-data","example"],["","function.udm-load-ispell-data","example"],["udm_load_ispell_data","function.udm-load-ispell-data","refentry"],["udm_open_stored","function.udm-open-stored","refentry"],["udm_set_agent_param","function.udm-set-agent-param","refentry"],["","ref.mnogosearch","reference"],["","book.mnogosearch","book"],["","intro.solr","preface"],["","solr.requirements","section"],["","solr.installation","section"],["","solr.configuration","section"],["","solr.resources","section"],["","solr.setup","chapter"],["","solr.constants","varlistentry"],["","solr.constants","varlistentry"],["","solr.constants","varlistentry"],["","solr.constants","varlistentry"],["","solr.constants","appendix"],["","function.solr-get-version","example"],["solr_get_version","function.solr-get-version","refentry"],["","ref.solr","reference"],["","solr.examples","example"],["","solr.examples","example"],["","solr.examples","example"],["","solr.examples","example"],["","solr.examples","example"],["","solr.examples","example"],["","solr.examples","example"],["","solr.examples","example"],["","solr.examples","example"],["","solr.examples","example"],["","solr.examples","example"],["","solr.examples","chapter"],["","class.solrutils","section"],["","class.solrutils","section"],["SolrUtils::digestXmlResponse","solrutils.digestxmlresponse","refentry"],["SolrUtils::escapeQueryChars","solrutils.escapequerychars","refentry"],["SolrUtils::getSolrVersion","solrutils.getsolrversion","refentry"],["SolrUtils::queryPhrase","solrutils.queryphrase","refentry"],["SolrUtils","class.solrutils","phpdoc:classref"],["","class.solrinputdocument","section"],["","class.solrinputdocument","section"],["","class.solrinputdocument","varlistentry"],["","class.solrinputdocument","varlistentry"],["","class.solrinputdocument","varlistentry"],["","class.solrinputdocument","varlistentry"],["","class.solrinputdocument","varlistentry"],["","class.solrinputdocument","varlistentry"],["","class.solrinputdocument","section"],["","class.solrinputdocument","section"],["SolrInputDocument::addField","solrinputdocument.addfield","refentry"],["SolrInputDocument::clear","solrinputdocument.clear","refentry"],["SolrInputDocument::__clone","solrinputdocument.clone","refentry"],["SolrInputDocument::__construct","solrinputdocument.construct","refentry"],["SolrInputDocument::deleteField","solrinputdocument.deletefield","refentry"],["SolrInputDocument::__destruct","solrinputdocument.destruct","refentry"],["SolrInputDocument::fieldExists","solrinputdocument.fieldexists","refentry"],["SolrInputDocument::getBoost","solrinputdocument.getboost","refentry"],["SolrInputDocument::getField","solrinputdocument.getfield","refentry"],["SolrInputDocument::getFieldBoost","solrinputdocument.getfieldboost","refentry"],["SolrInputDocument::getFieldCount","solrinputdocument.getfieldcount","refentry"],["SolrInputDocument::getFieldNames","solrinputdocument.getfieldnames","refentry"],["SolrInputDocument::merge","solrinputdocument.merge","refentry"],["SolrInputDocument::reset","solrinputdocument.reset","refentry"],["SolrInputDocument::setBoost","solrinputdocument.setboost","refentry"],["SolrInputDocument::setFieldBoost","solrinputdocument.setfieldboost","refentry"],["SolrInputDocument::sort","solrinputdocument.sort","refentry"],["SolrInputDocument::toArray","solrinputdocument.toarray","refentry"],["SolrInputDocument","class.solrinputdocument","phpdoc:classref"],["","class.solrdocument","section"],["","class.solrdocument","section"],["","class.solrdocument","varlistentry"],["","class.solrdocument","varlistentry"],["","class.solrdocument","varlistentry"],["","class.solrdocument","varlistentry"],["","class.solrdocument","varlistentry"],["","class.solrdocument","varlistentry"],["","class.solrdocument","section"],["SolrDocument::addField","solrdocument.addfield","refentry"],["SolrDocument::clear","solrdocument.clear","refentry"],["SolrDocument::__clone","solrdocument.clone","refentry"],["SolrDocument::__construct","solrdocument.construct","refentry"],["SolrDocument::current","solrdocument.current","refentry"],["SolrDocument::deleteField","solrdocument.deletefield","refentry"],["SolrDocument::__destruct","solrdocument.destruct","refentry"],["SolrDocument::fieldExists","solrdocument.fieldexists","refentry"],["SolrDocument::__get","solrdocument.get","refentry"],["SolrDocument::getField","solrdocument.getfield","refentry"],["SolrDocument::getFieldCount","solrdocument.getfieldcount","refentry"],["SolrDocument::getFieldNames","solrdocument.getfieldnames","refentry"],["SolrDocument::getInputDocument","solrdocument.getinputdocument","refentry"],["SolrDocument::__isset","solrdocument.isset","refentry"],["SolrDocument::key","solrdocument.key","refentry"],["SolrDocument::merge","solrdocument.merge","refentry"],["SolrDocument::next","solrdocument.next","refentry"],["SolrDocument::offsetExists","solrdocument.offsetexists","refentry"],["SolrDocument::offsetGet","solrdocument.offsetget","refentry"],["SolrDocument::offsetSet","solrdocument.offsetset","refentry"],["SolrDocument::offsetUnset","solrdocument.offsetunset","refentry"],["SolrDocument::reset","solrdocument.reset","refentry"],["SolrDocument::rewind","solrdocument.rewind","refentry"],["SolrDocument::serialize","solrdocument.serialize","refentry"],["SolrDocument::__set","solrdocument.set","refentry"],["SolrDocument::sort","solrdocument.sort","refentry"],["","solrdocument.toarray","example"],["SolrDocument::toArray","solrdocument.toarray","refentry"],["SolrDocument::unserialize","solrdocument.unserialize","refentry"],["SolrDocument::__unset","solrdocument.unset","refentry"],["SolrDocument::valid","solrdocument.valid","refentry"],["SolrDocument","class.solrdocument","phpdoc:classref"],["","class.solrdocumentfield","section"],["","class.solrdocumentfield","section"],["","class.solrdocumentfield","varlistentry"],["","class.solrdocumentfield","varlistentry"],["","class.solrdocumentfield","varlistentry"],["","class.solrdocumentfield","section"],["SolrDocumentField::__construct","solrdocumentfield.construct","refentry"],["SolrDocumentField::__destruct","solrdocumentfield.destruct","refentry"],["SolrDocumentField","class.solrdocumentfield","phpdoc:classref"],["","class.solrobject","section"],["","class.solrobject","section"],["","solrobject.construct","example"],["SolrObject::__construct","solrobject.construct","refentry"],["SolrObject::__destruct","solrobject.destruct","refentry"],["SolrObject::getPropertyNames","solrobject.getpropertynames","refentry"],["SolrObject::offsetExists","solrobject.offsetexists","refentry"],["SolrObject::offsetGet","solrobject.offsetget","refentry"],["SolrObject::offsetSet","solrobject.offsetset","refentry"],["","solrobject.offsetunset","example"],["SolrObject::offsetUnset","solrobject.offsetunset","refentry"],["SolrObject","class.solrobject","phpdoc:classref"],["","class.solrclient","section"],["","class.solrclient","section"],["","class.solrclient","varlistentry"],["","class.solrclient","varlistentry"],["","class.solrclient","varlistentry"],["","class.solrclient","varlistentry"],["","class.solrclient","varlistentry"],["","class.solrclient","varlistentry"],["","class.solrclient","varlistentry"],["","class.solrclient","varlistentry"],["","class.solrclient","varlistentry"],["","class.solrclient","varlistentry"],["","class.solrclient","section"],["","solrclient.adddocument","example"],["SolrClient::addDocument","solrclient.adddocument","refentry"],["","solrclient.adddocuments","example"],["SolrClient::addDocuments","solrclient.adddocuments","refentry"],["SolrClient::commit","solrclient.commit","refentry"],["","solrclient.construct","example"],["SolrClient::__construct","solrclient.construct","refentry"],["SolrClient::deleteById","solrclient.deletebyid","refentry"],["SolrClient::deleteByIds","solrclient.deletebyids","refentry"],["SolrClient::deleteByQueries","solrclient.deletebyqueries","refentry"],["","solrclient.deletebyquery","example"],["SolrClient::deleteByQuery","solrclient.deletebyquery","refentry"],["SolrClient::__destruct","solrclient.destruct","refentry"],["SolrClient::getDebug","solrclient.getdebug","refentry"],["SolrClient::getOptions","solrclient.getoptions","refentry"],["SolrClient::optimize","solrclient.optimize","refentry"],["","solrclient.ping","example"],["SolrClient::ping","solrclient.ping","refentry"],["","solrclient.query","example"],["SolrClient::query","solrclient.query","refentry"],["","solrclient.request","example"],["SolrClient::request","solrclient.request","refentry"],["SolrClient::rollback","solrclient.rollback","refentry"],["","solrclient.setresponsewriter","example"],["SolrClient::setResponseWriter","solrclient.setresponsewriter","refentry"],["SolrClient::setServlet","solrclient.setservlet","refentry"],["SolrClient::threads","solrclient.threads","refentry"],["SolrClient","class.solrclient","phpdoc:classref"],["","class.solrresponse","section"],["","class.solrresponse","section"],["","class.solrresponse","varlistentry"],["","class.solrresponse","varlistentry"],["","class.solrresponse","varlistentry"],["","class.solrresponse","varlistentry"],["","class.solrresponse","varlistentry"],["","class.solrresponse","varlistentry"],["","class.solrresponse","varlistentry"],["","class.solrresponse","varlistentry"],["","class.solrresponse","varlistentry"],["","class.solrresponse","varlistentry"],["","class.solrresponse","section"],["","class.solrresponse","varlistentry"],["","class.solrresponse","varlistentry"],["","class.solrresponse","section"],["","class.solrresponse","section"],["SolrResponse::getDigestedResponse","solrresponse.getdigestedresponse","refentry"],["SolrResponse::getHttpStatus","solrresponse.gethttpstatus","refentry"],["SolrResponse::getHttpStatusMessage","solrresponse.gethttpstatusmessage","refentry"],["SolrResponse::getRawRequest","solrresponse.getrawrequest","refentry"],["SolrResponse::getRawRequestHeaders","solrresponse.getrawrequestheaders","refentry"],["SolrResponse::getRawResponse","solrresponse.getrawresponse","refentry"],["SolrResponse::getRawResponseHeaders","solrresponse.getrawresponseheaders","refentry"],["SolrResponse::getRequestUrl","solrresponse.getrequesturl","refentry"],["SolrResponse::getResponse","solrresponse.getresponse","refentry"],["SolrResponse::setParseMode","solrresponse.setparsemode","refentry"],["SolrResponse::success","solrresponse.success","refentry"],["SolrResponse","class.solrresponse","phpdoc:classref"],["","class.solrqueryresponse","section"],["","class.solrqueryresponse","section"],["","class.solrqueryresponse","varlistentry"],["","class.solrqueryresponse","varlistentry"],["","class.solrqueryresponse","section"],["","class.solrqueryresponse","section"],["SolrQueryResponse::__construct","solrqueryresponse.construct","refentry"],["SolrQueryResponse::__destruct","solrqueryresponse.destruct","refentry"],["SolrQueryResponse","class.solrqueryresponse","phpdoc:classref"],["","class.solrupdateresponse","section"],["","class.solrupdateresponse","section"],["","class.solrupdateresponse","varlistentry"],["","class.solrupdateresponse","varlistentry"],["","class.solrupdateresponse","section"],["","class.solrupdateresponse","section"],["SolrUpdateResponse::__construct","solrupdateresponse.construct","refentry"],["SolrUpdateResponse::__destruct","solrupdateresponse.destruct","refentry"],["SolrUpdateResponse","class.solrupdateresponse","phpdoc:classref"],["","class.solrpingresponse","section"],["","class.solrpingresponse","section"],["","class.solrpingresponse","varlistentry"],["","class.solrpingresponse","varlistentry"],["","class.solrpingresponse","varlistentry"],["","class.solrpingresponse","varlistentry"],["","class.solrpingresponse","varlistentry"],["","class.solrpingresponse","varlistentry"],["","class.solrpingresponse","varlistentry"],["","class.solrpingresponse","varlistentry"],["","class.solrpingresponse","varlistentry"],["","class.solrpingresponse","varlistentry"],["","class.solrpingresponse","section"],["","class.solrpingresponse","varlistentry"],["","class.solrpingresponse","varlistentry"],["","class.solrpingresponse","section"],["","class.solrpingresponse","section"],["SolrPingResponse::__construct","solrpingresponse.construct","refentry"],["SolrPingResponse::__destruct","solrpingresponse.destruct","refentry"],["SolrPingResponse::getResponse","solrpingresponse.getresponse","refentry"],["SolrPingResponse","class.solrpingresponse","phpdoc:classref"],["","class.solrgenericresponse","section"],["","class.solrgenericresponse","section"],["","class.solrgenericresponse","varlistentry"],["","class.solrgenericresponse","varlistentry"],["","class.solrgenericresponse","section"],["","class.solrgenericresponse","section"],["SolrGenericResponse::__construct","solrgenericresponse.construct","refentry"],["SolrGenericResponse::__destruct","solrgenericresponse.destruct","refentry"],["SolrGenericResponse","class.solrgenericresponse","phpdoc:classref"],["","class.solrparams","section"],["","class.solrparams","section"],["SolrParams::add","solrparams.add","refentry"],["SolrParams::addParam","solrparams.addparam","refentry"],["SolrParams::get","solrparams.get","refentry"],["SolrParams::getParam","solrparams.getparam","refentry"],["SolrParams::getParams","solrparams.getparams","refentry"],["SolrParams::getPreparedParams","solrparams.getpreparedparams","refentry"],["SolrParams::serialize","solrparams.serialize","refentry"],["SolrParams::set","solrparams.set","refentry"],["","solrparams.setparam","example"],["SolrParams::setParam","solrparams.setparam","refentry"],["SolrParams::toString","solrparams.tostring","refentry"],["SolrParams::unserialize","solrparams.unserialize","refentry"],["SolrParams","class.solrparams","phpdoc:classref"],["","class.solrmodifiableparams","section"],["","class.solrmodifiableparams","section"],["SolrModifiableParams::__construct","solrmodifiableparams.construct","refentry"],["SolrModifiableParams::__destruct","solrmodifiableparams.destruct","refentry"],["SolrModifiableParams","class.solrmodifiableparams","phpdoc:classref"],["","class.solrquery","section"],["","class.solrquery","section"],["","class.solrquery","varlistentry"],["","class.solrquery","varlistentry"],["","class.solrquery","varlistentry"],["","class.solrquery","varlistentry"],["","class.solrquery","varlistentry"],["","class.solrquery","varlistentry"],["","class.solrquery","section"],["SolrQuery::addFacetDateField","solrquery.addfacetdatefield","refentry"],["SolrQuery::addFacetDateOther","solrquery.addfacetdateother","refentry"],["","solrquery.addfacetfield","example"],["SolrQuery::addFacetField","solrquery.addfacetfield","refentry"],["SolrQuery::addFacetQuery","solrquery.addfacetquery","refentry"],["SolrQuery::addField","solrquery.addfield","refentry"],["","solrquery.addfilterquery","example"],["SolrQuery::addFilterQuery","solrquery.addfilterquery","refentry"],["SolrQuery::addHighlightField","solrquery.addhighlightfield","refentry"],["SolrQuery::addMltField","solrquery.addmltfield","refentry"],["SolrQuery::addMltQueryField","solrquery.addmltqueryfield","refentry"],["SolrQuery::addSortField","solrquery.addsortfield","refentry"],["SolrQuery::addStatsFacet","solrquery.addstatsfacet","refentry"],["SolrQuery::addStatsField","solrquery.addstatsfield","refentry"],["SolrQuery::__construct","solrquery.construct","refentry"],["SolrQuery::__destruct","solrquery.destruct","refentry"],["SolrQuery::getFacet","solrquery.getfacet","refentry"],["SolrQuery::getFacetDateEnd","solrquery.getfacetdateend","refentry"],["SolrQuery::getFacetDateFields","solrquery.getfacetdatefields","refentry"],["SolrQuery::getFacetDateGap","solrquery.getfacetdategap","refentry"],["SolrQuery::getFacetDateHardEnd","solrquery.getfacetdatehardend","refentry"],["SolrQuery::getFacetDateOther","solrquery.getfacetdateother","refentry"],["SolrQuery::getFacetDateStart","solrquery.getfacetdatestart","refentry"],["SolrQuery::getFacetFields","solrquery.getfacetfields","refentry"],["SolrQuery::getFacetLimit","solrquery.getfacetlimit","refentry"],["SolrQuery::getFacetMethod","solrquery.getfacetmethod","refentry"],["SolrQuery::getFacetMinCount","solrquery.getfacetmincount","refentry"],["SolrQuery::getFacetMissing","solrquery.getfacetmissing","refentry"],["SolrQuery::getFacetOffset","solrquery.getfacetoffset","refentry"],["SolrQuery::getFacetPrefix","solrquery.getfacetprefix","refentry"],["SolrQuery::getFacetQueries","solrquery.getfacetqueries","refentry"],["SolrQuery::getFacetSort","solrquery.getfacetsort","refentry"],["SolrQuery::getFields","solrquery.getfields","refentry"],["SolrQuery::getFilterQueries","solrquery.getfilterqueries","refentry"],["SolrQuery::getHighlight","solrquery.gethighlight","refentry"],["SolrQuery::getHighlightAlternateField","solrquery.gethighlightalternatefield","refentry"],["SolrQuery::getHighlightFields","solrquery.gethighlightfields","refentry"],["SolrQuery::getHighlightFormatter","solrquery.gethighlightformatter","refentry"],["SolrQuery::getHighlightFragmenter","solrquery.gethighlightfragmenter","refentry"],["SolrQuery::getHighlightFragsize","solrquery.gethighlightfragsize","refentry"],["SolrQuery::getHighlightHighlightMultiTerm","solrquery.gethighlighthighlightmultiterm","refentry"],["SolrQuery::getHighlightMaxAlternateFieldLength","solrquery.gethighlightmaxalternatefieldlength","refentry"],["SolrQuery::getHighlightMaxAnalyzedChars","solrquery.gethighlightmaxanalyzedchars","refentry"],["SolrQuery::getHighlightMergeContiguous","solrquery.gethighlightmergecontiguous","refentry"],["SolrQuery::getHighlightRegexMaxAnalyzedChars","solrquery.gethighlightregexmaxanalyzedchars","refentry"],["SolrQuery::getHighlightRegexPattern","solrquery.gethighlightregexpattern","refentry"],["SolrQuery::getHighlightRegexSlop","solrquery.gethighlightregexslop","refentry"],["SolrQuery::getHighlightRequireFieldMatch","solrquery.gethighlightrequirefieldmatch","refentry"],["SolrQuery::getHighlightSimplePost","solrquery.gethighlightsimplepost","refentry"],["SolrQuery::getHighlightSimplePre","solrquery.gethighlightsimplepre","refentry"],["SolrQuery::getHighlightSnippets","solrquery.gethighlightsnippets","refentry"],["SolrQuery::getHighlightUsePhraseHighlighter","solrquery.gethighlightusephrasehighlighter","refentry"],["SolrQuery::getMlt","solrquery.getmlt","refentry"],["SolrQuery::getMltBoost","solrquery.getmltboost","refentry"],["SolrQuery::getMltCount","solrquery.getmltcount","refentry"],["SolrQuery::getMltFields","solrquery.getmltfields","refentry"],["SolrQuery::getMltMaxNumQueryTerms","solrquery.getmltmaxnumqueryterms","refentry"],["SolrQuery::getMltMaxNumTokens","solrquery.getmltmaxnumtokens","refentry"],["SolrQuery::getMltMaxWordLength","solrquery.getmltmaxwordlength","refentry"],["SolrQuery::getMltMinDocFrequency","solrquery.getmltmindocfrequency","refentry"],["SolrQuery::getMltMinTermFrequency","solrquery.getmltmintermfrequency","refentry"],["SolrQuery::getMltMinWordLength","solrquery.getmltminwordlength","refentry"],["SolrQuery::getMltQueryFields","solrquery.getmltqueryfields","refentry"],["SolrQuery::getQuery","solrquery.getquery","refentry"],["SolrQuery::getRows","solrquery.getrows","refentry"],["SolrQuery::getSortFields","solrquery.getsortfields","refentry"],["SolrQuery::getStart","solrquery.getstart","refentry"],["SolrQuery::getStats","solrquery.getstats","refentry"],["SolrQuery::getStatsFacets","solrquery.getstatsfacets","refentry"],["SolrQuery::getStatsFields","solrquery.getstatsfields","refentry"],["SolrQuery::getTerms","solrquery.getterms","refentry"],["SolrQuery::getTermsField","solrquery.gettermsfield","refentry"],["SolrQuery::getTermsIncludeLowerBound","solrquery.gettermsincludelowerbound","refentry"],["SolrQuery::getTermsIncludeUpperBound","solrquery.gettermsincludeupperbound","refentry"],["SolrQuery::getTermsLimit","solrquery.gettermslimit","refentry"],["SolrQuery::getTermsLowerBound","solrquery.gettermslowerbound","refentry"],["SolrQuery::getTermsMaxCount","solrquery.gettermsmaxcount","refentry"],["SolrQuery::getTermsMinCount","solrquery.gettermsmincount","refentry"],["SolrQuery::getTermsPrefix","solrquery.gettermsprefix","refentry"],["SolrQuery::getTermsReturnRaw","solrquery.gettermsreturnraw","refentry"],["SolrQuery::getTermsSort","solrquery.gettermssort","refentry"],["SolrQuery::getTermsUpperBound","solrquery.gettermsupperbound","refentry"],["SolrQuery::getTimeAllowed","solrquery.gettimeallowed","refentry"],["SolrQuery::removeFacetDateField","solrquery.removefacetdatefield","refentry"],["SolrQuery::removeFacetDateOther","solrquery.removefacetdateother","refentry"],["SolrQuery::removeFacetField","solrquery.removefacetfield","refentry"],["SolrQuery::removeFacetQuery","solrquery.removefacetquery","refentry"],["SolrQuery::removeField","solrquery.removefield","refentry"],["SolrQuery::removeFilterQuery","solrquery.removefilterquery","refentry"],["SolrQuery::removeHighlightField","solrquery.removehighlightfield","refentry"],["SolrQuery::removeMltField","solrquery.removemltfield","refentry"],["SolrQuery::removeMltQueryField","solrquery.removemltqueryfield","refentry"],["SolrQuery::removeSortField","solrquery.removesortfield","refentry"],["SolrQuery::removeStatsFacet","solrquery.removestatsfacet","refentry"],["SolrQuery::removeStatsField","solrquery.removestatsfield","refentry"],["SolrQuery::setEchoHandler","solrquery.setechohandler","refentry"],["SolrQuery::setEchoParams","solrquery.setechoparams","refentry"],["SolrQuery::setExplainOther","solrquery.setexplainother","refentry"],["SolrQuery::setFacet","solrquery.setfacet","refentry"],["SolrQuery::setFacetDateEnd","solrquery.setfacetdateend","refentry"],["SolrQuery::setFacetDateGap","solrquery.setfacetdategap","refentry"],["SolrQuery::setFacetDateHardEnd","solrquery.setfacetdatehardend","refentry"],["SolrQuery::setFacetDateStart","solrquery.setfacetdatestart","refentry"],["SolrQuery::setFacetEnumCacheMinDefaultFrequency","solrquery.setfacetenumcachemindefaultfrequency","refentry"],["SolrQuery::setFacetLimit","solrquery.setfacetlimit","refentry"],["SolrQuery::setFacetMethod","solrquery.setfacetmethod","refentry"],["SolrQuery::setFacetMinCount","solrquery.setfacetmincount","refentry"],["SolrQuery::setFacetMissing","solrquery.setfacetmissing","refentry"],["SolrQuery::setFacetOffset","solrquery.setfacetoffset","refentry"],["SolrQuery::setFacetPrefix","solrquery.setfacetprefix","refentry"],["SolrQuery::setFacetSort","solrquery.setfacetsort","refentry"],["SolrQuery::setHighlight","solrquery.sethighlight","refentry"],["SolrQuery::setHighlightAlternateField","solrquery.sethighlightalternatefield","refentry"],["SolrQuery::setHighlightFormatter","solrquery.sethighlightformatter","refentry"],["SolrQuery::setHighlightFragmenter","solrquery.sethighlightfragmenter","refentry"],["SolrQuery::setHighlightFragsize","solrquery.sethighlightfragsize","refentry"],["SolrQuery::setHighlightHighlightMultiTerm","solrquery.sethighlighthighlightmultiterm","refentry"],["SolrQuery::setHighlightMaxAlternateFieldLength","solrquery.sethighlightmaxalternatefieldlength","refentry"],["SolrQuery::setHighlightMaxAnalyzedChars","solrquery.sethighlightmaxanalyzedchars","refentry"],["SolrQuery::setHighlightMergeContiguous","solrquery.sethighlightmergecontiguous","refentry"],["SolrQuery::setHighlightRegexMaxAnalyzedChars","solrquery.sethighlightregexmaxanalyzedchars","refentry"],["SolrQuery::setHighlightRegexPattern","solrquery.sethighlightregexpattern","refentry"],["SolrQuery::setHighlightRegexSlop","solrquery.sethighlightregexslop","refentry"],["SolrQuery::setHighlightRequireFieldMatch","solrquery.sethighlightrequirefieldmatch","refentry"],["SolrQuery::setHighlightSimplePost","solrquery.sethighlightsimplepost","refentry"],["SolrQuery::setHighlightSimplePre","solrquery.sethighlightsimplepre","refentry"],["SolrQuery::setHighlightSnippets","solrquery.sethighlightsnippets","refentry"],["SolrQuery::setHighlightUsePhraseHighlighter","solrquery.sethighlightusephrasehighlighter","refentry"],["SolrQuery::setMlt","solrquery.setmlt","refentry"],["SolrQuery::setMltBoost","solrquery.setmltboost","refentry"],["SolrQuery::setMltCount","solrquery.setmltcount","refentry"],["SolrQuery::setMltMaxNumQueryTerms","solrquery.setmltmaxnumqueryterms","refentry"],["SolrQuery::setMltMaxNumTokens","solrquery.setmltmaxnumtokens","refentry"],["SolrQuery::setMltMaxWordLength","solrquery.setmltmaxwordlength","refentry"],["SolrQuery::setMltMinDocFrequency","solrquery.setmltmindocfrequency","refentry"],["SolrQuery::setMltMinTermFrequency","solrquery.setmltmintermfrequency","refentry"],["SolrQuery::setMltMinWordLength","solrquery.setmltminwordlength","refentry"],["SolrQuery::setOmitHeader","solrquery.setomitheader","refentry"],["SolrQuery::setQuery","solrquery.setquery","refentry"],["SolrQuery::setRows","solrquery.setrows","refentry"],["SolrQuery::setShowDebugInfo","solrquery.setshowdebuginfo","refentry"],["SolrQuery::setStart","solrquery.setstart","refentry"],["SolrQuery::setStats","solrquery.setstats","refentry"],["SolrQuery::setTerms","solrquery.setterms","refentry"],["SolrQuery::setTermsField","solrquery.settermsfield","refentry"],["SolrQuery::setTermsIncludeLowerBound","solrquery.settermsincludelowerbound","refentry"],["SolrQuery::setTermsIncludeUpperBound","solrquery.settermsincludeupperbound","refentry"],["SolrQuery::setTermsLimit","solrquery.settermslimit","refentry"],["SolrQuery::setTermsLowerBound","solrquery.settermslowerbound","refentry"],["SolrQuery::setTermsMaxCount","solrquery.settermsmaxcount","refentry"],["SolrQuery::setTermsMinCount","solrquery.settermsmincount","refentry"],["SolrQuery::setTermsPrefix","solrquery.settermsprefix","refentry"],["SolrQuery::setTermsReturnRaw","solrquery.settermsreturnraw","refentry"],["SolrQuery::setTermsSort","solrquery.settermssort","refentry"],["SolrQuery::setTermsUpperBound","solrquery.settermsupperbound","refentry"],["SolrQuery::setTimeAllowed","solrquery.settimeallowed","refentry"],["SolrQuery","class.solrquery","phpdoc:classref"],["","class.solrexception","section"],["","class.solrexception","section"],["","class.solrexception","varlistentry"],["","class.solrexception","varlistentry"],["","class.solrexception","varlistentry"],["","class.solrexception","section"],["SolrException::getInternalInfo","solrexception.getinternalinfo","refentry"],["SolrException","class.solrexception","phpdoc:classref"],["","class.solrclientexception","section"],["","class.solrclientexception","section"],["SolrClientException::getInternalInfo","solrclientexception.getinternalinfo","refentry"],["SolrClientException","class.solrclientexception","phpdoc:classref"],["","class.solrillegalargumentexception","section"],["","class.solrillegalargumentexception","section"],["SolrIllegalArgumentException::getInternalInfo","solrillegalargumentexception.getinternalinfo","refentry"],["SolrIllegalArgumentException","class.solrillegalargumentexception","phpdoc:classref"],["","class.solrillegaloperationexception","section"],["","class.solrillegaloperationexception","section"],["SolrIllegalOperationException::getInternalInfo","solrillegaloperationexception.getinternalinfo","refentry"],["SolrIllegalOperationException","class.solrillegaloperationexception","phpdoc:classref"],["Solr","book.solr","book"],["","intro.sphinx","preface"],["","sphinx.requirements","section"],["","sphinx.installation","section"],["","sphinx.configuration","section"],["","sphinx.resources","section"],["","sphinx.setup","chapter"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","varlistentry"],["","sphinx.constants","appendix"],["","sphinx.examples","example"],["","sphinx.examples","chapter"],["","class.sphinxclient","section"],["","class.sphinxclient","section"],["SphinxClient::addQuery","sphinxclient.addquery","refentry"],["SphinxClient::buildExcerpts","sphinxclient.buildexcerpts","refentry"],["SphinxClient::buildKeywords","sphinxclient.buildkeywords","refentry"],["SphinxClient::close","sphinxclient.close","refentry"],["SphinxClient::__construct","sphinxclient.construct","refentry"],["SphinxClient::escapeString","sphinxclient.escapestring","refentry"],["SphinxClient::getLastError","sphinxclient.getlasterror","refentry"],["SphinxClient::getLastWarning","sphinxclient.getlastwarning","refentry"],["SphinxClient::open","sphinxclient.open","refentry"],["SphinxClient::query","sphinxclient.query","refentry"],["SphinxClient::resetFilters","sphinxclient.resetfilters","refentry"],["SphinxClient::resetGroupBy","sphinxclient.resetgroupby","refentry"],["SphinxClient::runQueries","sphinxclient.runqueries","refentry"],["SphinxClient::setArrayResult","sphinxclient.setarrayresult","refentry"],["SphinxClient::setConnectTimeout","sphinxclient.setconnecttimeout","refentry"],["SphinxClient::setFieldWeights","sphinxclient.setfieldweights","refentry"],["SphinxClient::setFilter","sphinxclient.setfilter","refentry"],["SphinxClient::setFilterFloatRange","sphinxclient.setfilterfloatrange","refentry"],["SphinxClient::setFilterRange","sphinxclient.setfilterrange","refentry"],["SphinxClient::setGeoAnchor","sphinxclient.setgeoanchor","refentry"],["SphinxClient::setGroupBy","sphinxclient.setgroupby","refentry"],["SphinxClient::setGroupDistinct","sphinxclient.setgroupdistinct","refentry"],["SphinxClient::setIDRange","sphinxclient.setidrange","refentry"],["SphinxClient::setIndexWeights","sphinxclient.setindexweights","refentry"],["SphinxClient::setLimits","sphinxclient.setlimits","refentry"],["SphinxClient::setMatchMode","sphinxclient.setmatchmode","refentry"],["SphinxClient::setMaxQueryTime","sphinxclient.setmaxquerytime","refentry"],["SphinxClient::setOverride","sphinxclient.setoverride","refentry"],["SphinxClient::setRankingMode","sphinxclient.setrankingmode","refentry"],["SphinxClient::setRetries","sphinxclient.setretries","refentry"],["SphinxClient::setSelect","sphinxclient.setselect","refentry"],["SphinxClient::setServer","sphinxclient.setserver","refentry"],["SphinxClient::setSortMode","sphinxclient.setsortmode","refentry"],["SphinxClient::status","sphinxclient.status","refentry"],["SphinxClient::updateAttributes","sphinxclient.updateattributes","refentry"],["SphinxClient","class.sphinxclient","phpdoc:classref"],["Sphinx","book.sphinx","book"],["","intro.swish","preface"],["","swish.requirements","section"],["","swish.installation","section"],["","swish.configuration","section"],["","swish.resources","section"],["","swish.setup","chapter"],["","swish.constants","varlistentry"],["","swish.constants","varlistentry"],["","swish.constants","varlistentry"],["","swish.constants","varlistentry"],["","swish.constants","varlistentry"],["","swish.constants","varlistentry"],["","swish.constants","varlistentry"],["","swish.constants","varlistentry"],["","swish.constants","varlistentry"],["","swish.constants","varlistentry"],["","swish.constants","varlistentry"],["","swish.constants","varlistentry"],["","swish.constants","varlistentry"],["","swish.constants","varlistentry"],["","swish.constants","varlistentry"],["","swish.constants","varlistentry"],["","swish.constants","varlistentry"],["","swish.constants","varlistentry"],["","swish.constants","varlistentry"],["","swish.constants","varlistentry"],["","swish.constants","varlistentry"],["","swish.constants","appendix"],["","swish.examples-basic","example"],["","swish.examples-basic","section"],["","swish.examples","chapter"],["","swish.construct","example"],["Swish::__construct","swish.construct","refentry"],["","swish.getmetalist","example"],["Swish::getMetaList","swish.getmetalist","refentry"],["","swish.getpropertylist","example"],["Swish::getPropertyList","swish.getpropertylist","refentry"],["","swish.prepare","example"],["Swish::prepare","swish.prepare","refentry"],["","swish.query","example"],["Swish::query","swish.query","refentry"],["SwishResult::getMetaList","swishresult.getmetalist","refentry"],["","swishresult.stem","example"],["SwishResult::stem","swishresult.stem","refentry"],["","swishresults.getparsedwords","example"],["SwishResults::getParsedWords","swishresults.getparsedwords","refentry"],["SwishResults::getRemovedStopwords","swishresults.getremovedstopwords","refentry"],["","swishresults.nextresult","example"],["SwishResults::nextResult","swishresults.nextresult","refentry"],["","swishresults.seekresult","example"],["SwishResults::seekResult","swishresults.seekresult","refentry"],["","swishsearch.execute","example"],["SwishSearch::execute","swishsearch.execute","refentry"],["","swishsearch.resetlimit","example"],["SwishSearch::resetLimit","swishsearch.resetlimit","refentry"],["","swishsearch.setlimit","example"],["SwishSearch::setLimit","swishsearch.setlimit","refentry"],["","swishsearch.setphrasedelimiter","example"],["SwishSearch::setPhraseDelimiter","swishsearch.setphrasedelimiter","refentry"],["","swishsearch.setsort","example"],["SwishSearch::setSort","swishsearch.setsort","refentry"],["","swishsearch.setstructure","example"],["SwishSearch::setStructure","swishsearch.setstructure","refentry"],["","ref.swish","reference"],["Swish","book.swish","book"],["","refs.search","set"],["","intro.apache","preface"],["","apache.requirements","section"],["","apache.installation","section"],["","apache.configuration","example"],["","apache.configuration","varlistentry"],["","apache.configuration","varlistentry"],["","apache.configuration","varlistentry"],["","apache.configuration","varlistentry"],["","apache.configuration","section"],["","apache.resources","section"],["","apache.setup","chapter"],["","apache.constants","appendix"],["apache_child_terminate","function.apache-child-terminate","refentry"],["","function.apache-get-modules","example"],["apache_get_modules","function.apache-get-modules","refentry"],["","function.apache-get-version","example"],["apache_get_version","function.apache-get-version","refentry"],["","function.apache-getenv","example"],["apache_getenv","function.apache-getenv","refentry"],["","function.apache-lookup-uri","example"],["apache_lookup_uri","function.apache-lookup-uri","refentry"],["","function.apache-note","example"],["","function.apache-note","example"],["apache_note","function.apache-note","refentry"],["","function.apache-request-headers","example"],["apache_request_headers","function.apache-request-headers","refentry"],["apache_reset_timeout","function.apache-reset-timeout","refentry"],["","function.apache-response-headers","example"],["apache_response_headers","function.apache-response-headers","refentry"],["","function.apache-setenv","example"],["apache_setenv","function.apache-setenv","refentry"],["","function.getallheaders","example"],["getallheaders","function.getallheaders","refentry"],["virtual","function.virtual","refentry"],["","ref.apache","reference"],["","book.apache","book"],["","intro.fpm","preface"],["","fpm.setup","chapter"],["fastcgi_finish_request","function.fastcgi-finish-request","refentry"],["","ref.fpm","reference"],["","book.fpm","book"],["","intro.iisfunc","preface"],["","iisfunc.requirements","section"],["","iisfunc.installation","section"],["","iisfunc.configuration","section"],["","iisfunc.resources","section"],["","iisfunc.setup","chapter"],["","iisfunc.constants","varlistentry"],["","iisfunc.constants","varlistentry"],["","iisfunc.constants","varlistentry"],["","iisfunc.constants","varlistentry"],["","iisfunc.constants","varlistentry"],["","iisfunc.constants","varlistentry"],["","iisfunc.constants","varlistentry"],["","iisfunc.constants","varlistentry"],["","iisfunc.constants","varlistentry"],["","iisfunc.constants","varlistentry"],["","iisfunc.constants","varlistentry"],["","iisfunc.constants","appendix"],["iis_add_server","function.iis-add-server","refentry"],["iis_get_dir_security","function.iis-get-dir-security","refentry"],["iis_get_script_map","function.iis-get-script-map","refentry"],["iis_get_server_by_comment","function.iis-get-server-by-comment","refentry"],["iis_get_server_by_path","function.iis-get-server-by-path","refentry"],["iis_get_server_rights","function.iis-get-server-rights","refentry"],["iis_get_service_state","function.iis-get-service-state","refentry"],["iis_remove_server","function.iis-remove-server","refentry"],["iis_set_app_settings","function.iis-set-app-settings","refentry"],["iis_set_dir_security","function.iis-set-dir-security","refentry"],["iis_set_script_map","function.iis-set-script-map","refentry"],["iis_set_server_rights","function.iis-set-server-rights","refentry"],["iis_start_server","function.iis-start-server","refentry"],["iis_start_service","function.iis-start-service","refentry"],["iis_stop_server","function.iis-stop-server","refentry"],["iis_stop_service","function.iis-stop-service","refentry"],["","ref.iisfunc","reference"],["IIS","book.iisfunc","book"],["","intro.nsapi","preface"],["","nsapi.requirements","section"],["","nsapi.installation","section"],["","nsapi.configuration","varlistentry"],["","nsapi.configuration","section"],["","nsapi.resources","section"],["","nsapi.setup","chapter"],["","nsapi.constants","appendix"],["","function.nsapi-request-headers","example"],["nsapi_request_headers","function.nsapi-request-headers","refentry"],["nsapi_response_headers","function.nsapi-response-headers","refentry"],["nsapi_virtual","function.nsapi-virtual","refentry"],["","ref.nsapi","reference"],["","book.nsapi","book"],["","refs.utilspec.server","set"],["","intro.msession","preface"],["","msession.requirements","section"],["","msession.installation","section"],["","msession.configuration","section"],["","msession.resources","section"],["","msession.setup","chapter"],["","msession.constants","appendix"],["msession_connect","function.msession-connect","refentry"],["msession_count","function.msession-count","refentry"],["msession_create","function.msession-create","refentry"],["msession_destroy","function.msession-destroy","refentry"],["msession_disconnect","function.msession-disconnect","refentry"],["msession_find","function.msession-find","refentry"],["msession_get_array","function.msession-get-array","refentry"],["msession_get_data","function.msession-get-data","refentry"],["msession_get","function.msession-get","refentry"],["msession_inc","function.msession-inc","refentry"],["msession_list","function.msession-list","refentry"],["msession_listvar","function.msession-listvar","refentry"],["msession_lock","function.msession-lock","refentry"],["msession_plugin","function.msession-plugin","refentry"],["msession_randstr","function.msession-randstr","refentry"],["msession_set_array","function.msession-set-array","refentry"],["msession_set_data","function.msession-set-data","refentry"],["msession_set","function.msession-set","refentry"],["msession_timeout","function.msession-timeout","refentry"],["msession_uniq","function.msession-uniq","refentry"],["msession_unlock","function.msession-unlock","refentry"],["","ref.msession","reference"],["Msession","book.msession","book"],["","intro.session","preface"],["","session.requirements","section"],["","session.installation","section"],["","session.configuration","varlistentry"],["","session.configuration","varlistentry"],["","session.configuration","varlistentry"],["","session.configuration","varlistentry"],["","session.configuration","varlistentry"],["","session.configuration","varlistentry"],["","session.configuration","varlistentry"],["","session.configuration","varlistentry"],["","session.configuration","varlistentry"],["","session.configuration","varlistentry"],["","session.configuration","varlistentry"],["","session.configuration","varlistentry"],["","session.configuration","varlistentry"],["","session.configuration","varlistentry"],["","session.configuration","varlistentry"],["","session.configuration","varlistentry"],["","session.configuration","varlistentry"],["","session.configuration","varlistentry"],["","session.configuration","varlistentry"],["","session.configuration","varlistentry"],["","session.configuration","varlistentry"],["","session.configuration","varlistentry"],["","session.configuration","varlistentry"],["","session.configuration","varlistentry"],["","session.configuration","varlistentry"],["","session.configuration","varlistentry"],["","session.configuration","varlistentry"],["","session.configuration","varlistentry"],["","session.configuration","varlistentry"],["","session.configuration","varlistentry"],["","session.configuration","varlistentry"],["","session.configuration","varlistentry"],["","session.configuration","varlistentry"],["","session.configuration","section"],["","session.resources","section"],["","session.setup","chapter"],["","session.constants","varlistentry"],["","session.constants","varlistentry"],["","session.constants","varlistentry"],["","session.constants","varlistentry"],["","session.constants","appendix"],["","session.examples.basic","example"],["","session.examples.basic","example"],["","session.examples.basic","section"],["","session.idpassing","example"],["","session.idpassing","section"],["","session.customhandler","section"],["","session.examples","appendix"],["","session.upload-progress","programlisting"],["","session.upload-progress","programlisting"],["","session.upload-progress","example"],["","session.upload-progress","chapter"],["","session.security","chapter"],["","function.session-cache-expire","example"],["session_cache_expire","function.session-cache-expire","refentry"],["","function.session-cache-limiter","example"],["session_cache_limiter","function.session-cache-limiter","refentry"],["session_commit","function.session-commit","refentry"],["session_decode","function.session-decode","refentry"],["","function.session-destroy","example"],["session_destroy","function.session-destroy","refentry"],["session_encode","function.session-encode","refentry"],["session_get_cookie_params","function.session-get-cookie-params","refentry"],["session_id","function.session-id","refentry"],["session_is_registered","function.session-is-registered","refentry"],["session_module_name","function.session-module-name","refentry"],["","function.session-name","example"],["session_name","function.session-name","refentry"],["","function.session-regenerate-id","example"],["session_regenerate_id","function.session-regenerate-id","refentry"],["session_register_shutdown","function.session-register-shutdown","refentry"],["session_register","function.session-register","refentry"],["session_save_path","function.session-save-path","refentry"],["session_set_cookie_params","function.session-set-cookie-params","refentry"],["","function.session-set-save-handler","example"],["","function.session-set-save-handler","example"],["session_set_save_handler","function.session-set-save-handler","refentry"],["","function.session-start","example"],["","function.session-start","example"],["session_start","function.session-start","refentry"],["session_status","function.session-status","refentry"],["session_unregister","function.session-unregister","refentry"],["session_unset","function.session-unset","refentry"],["session_write_close","function.session-write-close","refentry"],["","ref.session","reference"],["","class.sessionhandler","section"],["","class.sessionhandler","section"],["","class.sessionhandler","section"],["","class.sessionhandler","example"],["","class.sessionhandler","section"],["SessionHandler::close","sessionhandler.close","refentry"],["SessionHandler::destroy","sessionhandler.destroy","refentry"],["SessionHandler::gc","sessionhandler.gc","refentry"],["SessionHandler::open","sessionhandler.open","refentry"],["SessionHandler::read","sessionhandler.read","refentry"],["SessionHandler::write","sessionhandler.write","refentry"],["SessionHandler","class.sessionhandler","phpdoc:classref"],["","class.sessionhandlerinterface","section"],["","class.sessionhandlerinterface","section"],["","class.sessionhandlerinterface","example"],["","class.sessionhandlerinterface","section"],["SessionHandlerInterface::close","sessionhandlerinterface.close","refentry"],["SessionHandlerInterface::destroy","sessionhandlerinterface.destroy","refentry"],["SessionHandlerInterface::gc","sessionhandlerinterface.gc","refentry"],["SessionHandlerInterface::open","sessionhandlerinterface.open","refentry"],["SessionHandlerInterface::read","sessionhandlerinterface.read","refentry"],["SessionHandlerInterface::write","sessionhandlerinterface.write","refentry"],["SessionHandlerInterface","class.sessionhandlerinterface","phpdoc:classref"],["Sessions","book.session","book"],["","intro.session-pgsql","preface"],["","session-pgsql.requirements","section"],["","session-pgsql.installation","section"],["","session-pgsql.configuration","section"],["","session-pgsql.resources","section"],["","session-pgsql.setup","chapter"],["","session-pgsql.tables","chapter"],["","session-pgsql.constants","appendix"],["","ref.session-pgsql","partintro"],["session_pgsql_add_error","function.session-pgsql-add-error","refentry"],["session_pgsql_get_error","function.session-pgsql-get-error","refentry"],["session_pgsql_get_field","function.session-pgsql-get-field","refentry"],["session_pgsql_reset","function.session-pgsql-reset","refentry"],["session_pgsql_set_field","function.session-pgsql-set-field","refentry"],["session_pgsql_status","function.session-pgsql-status","refentry"],["","ref.session-pgsql","reference"],["Session PgSQL","book.session-pgsql","book"],["","refs.basic.session","set"],["","intro.bbcode","preface"],["","bbcode.requirements","section"],["","bbcode.installation","section"],["","bbcode.configuration","section"],["","bbcode.resources","section"],["","bbcode.setup","chapter"],["","bbcode.constants","varlistentry"],["","bbcode.constants","varlistentry"],["","bbcode.constants","varlistentry"],["","bbcode.constants","varlistentry"],["","bbcode.constants","varlistentry"],["","bbcode.constants","varlistentry"],["","bbcode.constants","varlistentry"],["","bbcode.constants","varlistentry"],["","bbcode.constants","varlistentry"],["","bbcode.constants","varlistentry"],["","bbcode.constants","varlistentry"],["","bbcode.constants","varlistentry"],["","bbcode.constants","varlistentry"],["","bbcode.constants","varlistentry"],["","bbcode.constants","varlistentry"],["","bbcode.constants","varlistentry"],["","bbcode.constants","varlistentry"],["","bbcode.constants","varlistentry"],["","bbcode.constants","varlistentry"],["","bbcode.constants","varlistentry"],["","bbcode.constants","varlistentry"],["","bbcode.constants","varlistentry"],["","bbcode.constants","varlistentry"],["","bbcode.constants","varlistentry"],["","bbcode.constants","varlistentry"],["","bbcode.constants","varlistentry"],["","bbcode.constants","appendix"],["bbcode_add_element","function.bbcode-add-element","refentry"],["","function.bbcode-add-smiley","example"],["bbcode_add_smiley","function.bbcode-add-smiley","refentry"],["","function.bbcode-create","example"],["bbcode_create","function.bbcode-create","refentry"],["bbcode_destroy","function.bbcode-destroy","refentry"],["bbcode_parse","function.bbcode-parse","refentry"],["","function.bbcode-set-arg-parser","example"],["bbcode_set_arg_parser","function.bbcode-set-arg-parser","refentry"],["","function.bbcode-set-flags","example"],["bbcode_set_flags","function.bbcode-set-flags","refentry"],["","ref.bbcode","reference"],["BBCode","book.bbcode","book"],["","intro.pcre","preface"],["","pcre.requirements","section"],["","pcre.installation","section"],["","pcre.configuration","varlistentry"],["","pcre.configuration","varlistentry"],["","pcre.configuration","section"],["","pcre.resources","section"],["","pcre.setup","chapter"],["","pcre.constants","appendix"],["","pcre.examples","example"],["","pcre.examples","example"],["","pcre.examples","appendix"],["","regexp.introduction","section"],["","regexp.reference.delimiters","section"],["","regexp.reference.meta","section"],["","regexp.reference.escape","section"],["","regexp.reference.unicode","section"],["","regexp.reference.anchors","section"],["","regexp.reference.dot","section"],["","regexp.reference.character-classes","section"],["","regexp.reference.alternation","section"],["","regexp.reference.internal-options","section"],["","regexp.reference.subpatterns","section"],["","regexp.reference.repetition","section"],["","regexp.reference.back-references","section"],["","regexp.reference.assertions","section"],["","regexp.reference.onlyonce","section"],["","regexp.reference.conditional","section"],["","regexp.reference.comments","section"],["","regexp.reference.recursive","section"],["","regexp.reference.performance","section"],["PCRE regex syntax","reference.pcre.pattern.syntax","chapter"],["","reference.pcre.pattern.modifiers","varlistentry"],["Possible modifiers in regex patterns","reference.pcre.pattern.modifiers","article"],["Differences From Perl","reference.pcre.pattern.differences","article"],["","reference.pcre.pattern.posix","article"],["","pcre.pattern","part"],["","function.preg-filter","example"],["preg_filter","function.preg-filter","refentry"],["","function.preg-grep","example"],["preg_grep","function.preg-grep","refentry"],["","function.preg-last-error","example"],["preg_last_error","function.preg-last-error","refentry"],["","function.preg-match-all","example"],["","function.preg-match-all","example"],["","function.preg-match-all","example"],["preg_match_all","function.preg-match-all","refentry"],["","function.preg-match","example"],["","function.preg-match","example"],["","function.preg-match","example"],["","function.preg-match","example"],["preg_match","function.preg-match","refentry"],["","function.preg-quote","example"],["","function.preg-quote","example"],["preg_quote","function.preg-quote","refentry"],["","function.preg-replace-callback","example"],["","function.preg-replace-callback","example"],["","function.preg-replace-callback","example"],["preg_replace_callback","function.preg-replace-callback","refentry"],["","function.preg-replace","example"],["","function.preg-replace","example"],["","function.preg-replace","example"],["","function.preg-replace","example"],["","function.preg-replace","example"],["preg_replace","function.preg-replace","refentry"],["","function.preg-split","example"],["","function.preg-split","example"],["","function.preg-split","example"],["preg_split","function.preg-split","refentry"],["","ref.pcre","reference"],["PCRE","book.pcre","book"],["","intro.regex","preface"],["","regex.requirements","section"],["","regex.installation","section"],["","regex.configuration","section"],["","regex.resources","section"],["","regex.setup","chapter"],["","regex.constants","appendix"],["","regex.examples","example"],["","regex.examples","appendix"],["","ref.regex","partintro"],["","function.ereg-replace","example"],["","function.ereg-replace","example"],["","function.ereg-replace","example"],["ereg_replace","function.ereg-replace","refentry"],["","function.ereg","example"],["ereg","function.ereg","refentry"],["","function.eregi-replace","example"],["eregi_replace","function.eregi-replace","refentry"],["","function.eregi","example"],["eregi","function.eregi","refentry"],["","function.split","example"],["","function.split","example"],["split","function.split","refentry"],["","function.spliti","example"],["spliti","function.spliti","refentry"],["","function.sql-regcase","example"],["sql_regcase","function.sql-regcase","refentry"],["","ref.regex","reference"],["POSIX Regex","book.regex","book"],["","intro.ssdeep","preface"],["","ssdeep.requirements","section"],["","ssdeep.installation","section"],["","ssdeep.configuration","section"],["","ssdeep.resources","section"],["","ssdeep.setup","chapter"],["","ssdeep.constants","appendix"],["ssdeep_fuzzy_compare","function.ssdeep-fuzzy-compare","refentry"],["ssdeep_fuzzy_hash_filename","function.ssdeep-fuzzy-hash-filename","refentry"],["ssdeep_fuzzy_hash","function.ssdeep-fuzzy-hash","refentry"],["","ref.ssdeep","reference"],["ssdeep","book.ssdeep","book"],["","intro.strings","preface"],["","strings.requirements","section"],["","strings.installation","section"],["","strings.configuration","section"],["","strings.resources","section"],["","strings.setup","chapter"],["","string.constants","varlistentry"],["","string.constants","varlistentry"],["","string.constants","varlistentry"],["","string.constants","varlistentry"],["","string.constants","varlistentry"],["","string.constants","varlistentry"],["","string.constants","varlistentry"],["","string.constants","varlistentry"],["","string.constants","varlistentry"],["","string.constants","varlistentry"],["","string.constants","varlistentry"],["","string.constants","varlistentry"],["","string.constants","varlistentry"],["","string.constants","varlistentry"],["","string.constants","varlistentry"],["","string.constants","varlistentry"],["","string.constants","varlistentry"],["","string.constants","varlistentry"],["","string.constants","varlistentry"],["","string.constants","varlistentry"],["","string.constants","varlistentry"],["","string.constants","varlistentry"],["","string.constants","varlistentry"],["","string.constants","varlistentry"],["","string.constants","varlistentry"],["","string.constants","varlistentry"],["","string.constants","varlistentry"],["","string.constants","varlistentry"],["","string.constants","appendix"],["","ref.strings","partintro"],["","function.addcslashes","example"],["addcslashes","function.addcslashes","refentry"],["","function.addslashes","example"],["addslashes","function.addslashes","refentry"],["bin2hex","function.bin2hex","refentry"],["chop","function.chop","refentry"],["","function.chr","example"],["chr","function.chr","refentry"],["","function.chunk-split","example"],["chunk_split","function.chunk-split","refentry"],["convert_cyr_string","function.convert-cyr-string","refentry"],["","function.convert-uudecode","example"],["convert_uudecode","function.convert-uudecode","refentry"],["","function.convert-uuencode","example"],["convert_uuencode","function.convert-uuencode","refentry"],["","function.count-chars","example"],["count_chars","function.count-chars","refentry"],["","function.crc32","example"],["crc32","function.crc32","refentry"],["","function.crypt","example"],["","function.crypt","example"],["","function.crypt","example"],["crypt","function.crypt","refentry"],["","function.echo","example"],["echo","function.echo","refentry"],["","function.explode","example"],["","function.explode","example"],["","function.explode","example"],["explode","function.explode","refentry"],["","function.fprintf","example"],["","function.fprintf","example"],["fprintf","function.fprintf","refentry"],["","function.get-html-translation-table","example"],["get_html_translation_table","function.get-html-translation-table","refentry"],["hebrev","function.hebrev","refentry"],["hebrevc","function.hebrevc","refentry"],["","function.hex2bin","example"],["hex2bin","function.hex2bin","refentry"],["","function.html-entity-decode","example"],["html_entity_decode","function.html-entity-decode","refentry"],["","function.htmlentities","example"],["","function.htmlentities","example"],["htmlentities","function.htmlentities","refentry"],["","function.htmlspecialchars-decode","example"],["htmlspecialchars_decode","function.htmlspecialchars-decode","refentry"],["","function.htmlspecialchars","example"],["htmlspecialchars","function.htmlspecialchars","refentry"],["","function.implode","example"],["implode","function.implode","refentry"],["join","function.join","refentry"],["","function.lcfirst","example"],["lcfirst","function.lcfirst","refentry"],["","function.levenshtein","example"],["levenshtein","function.levenshtein","refentry"],["","function.localeconv","example"],["localeconv","function.localeconv","refentry"],["","function.ltrim","example"],["ltrim","function.ltrim","refentry"],["","function.md5-file","example"],["md5_file","function.md5-file","refentry"],["","function.md5","example"],["md5","function.md5","refentry"],["","function.metaphone","example"],["","function.metaphone","example"],["metaphone","function.metaphone","refentry"],["","function.money-format","example"],["money_format","function.money-format","refentry"],["nl_langinfo","function.nl-langinfo","refentry"],["","function.nl2br","example"],["","function.nl2br","example"],["","function.nl2br","example"],["nl2br","function.nl2br","refentry"],["","function.number-format","example"],["number_format","function.number-format","refentry"],["","function.ord","example"],["ord","function.ord","refentry"],["","function.parse-str","example"],["parse_str","function.parse-str","refentry"],["","function.print","example"],["print","function.print","refentry"],["printf","function.printf","refentry"],["quoted_printable_decode","function.quoted-printable-decode","refentry"],["quoted_printable_encode","function.quoted-printable-encode","refentry"],["quotemeta","function.quotemeta","refentry"],["","function.rtrim","example"],["rtrim","function.rtrim","refentry"],["","function.setlocale","example"],["","function.setlocale","example"],["setlocale","function.setlocale","refentry"],["","function.sha1-file","example"],["sha1_file","function.sha1-file","refentry"],["","function.sha1","example"],["sha1","function.sha1","refentry"],["similar_text","function.similar-text","refentry"],["","function.soundex","example"],["soundex","function.soundex","refentry"],["","function.sprintf","table"],["","function.sprintf","example"],["","function.sprintf","example"],["","function.sprintf","example"],["","function.sprintf","example"],["","function.sprintf","example"],["","function.sprintf","example"],["","function.sprintf","example"],["","function.sprintf","example"],["","function.sprintf","example"],["","function.sprintf","example"],["sprintf","function.sprintf","refentry"],["","function.sscanf","example"],["","function.sscanf","example"],["sscanf","function.sscanf","refentry"],["str_getcsv","function.str-getcsv","refentry"],["","function.str-ireplace","example"],["str_ireplace","function.str-ireplace","refentry"],["","function.str-pad","example"],["str_pad","function.str-pad","refentry"],["","function.str-repeat","example"],["str_repeat","function.str-repeat","refentry"],["","function.str-replace","example"],["","function.str-replace","example"],["str_replace","function.str-replace","refentry"],["","function.str-rot13","example"],["str_rot13","function.str-rot13","refentry"],["","function.str-shuffle","example"],["str_shuffle","function.str-shuffle","refentry"],["","function.str-split","example"],["str_split","function.str-split","refentry"],["","function.str-word-count","example"],["str_word_count","function.str-word-count","refentry"],["","function.strcasecmp","example"],["strcasecmp","function.strcasecmp","refentry"],["strchr","function.strchr","refentry"],["strcmp","function.strcmp","refentry"],["strcoll","function.strcoll","refentry"],["","function.strcspn","example"],["strcspn","function.strcspn","refentry"],["","function.strip-tags","example"],["strip_tags","function.strip-tags","refentry"],["stripcslashes","function.stripcslashes","refentry"],["","function.stripos","example"],["stripos","function.stripos","refentry"],["","function.stripslashes","example"],["","function.stripslashes","example"],["stripslashes","function.stripslashes","refentry"],["","function.stristr","example"],["","function.stristr","example"],["","function.stristr","example"],["stristr","function.stristr","refentry"],["","function.strlen","example"],["strlen","function.strlen","refentry"],["strnatcasecmp","function.strnatcasecmp","refentry"],["strnatcmp","function.strnatcmp","refentry"],["strncasecmp","function.strncasecmp","refentry"],["strncmp","function.strncmp","refentry"],["","function.strpbrk","example"],["strpbrk","function.strpbrk","refentry"],["","function.strpos","example"],["","function.strpos","example"],["","function.strpos","example"],["strpos","function.strpos","refentry"],["","function.strrchr","example"],["strrchr","function.strrchr","refentry"],["","function.strrev","example"],["strrev","function.strrev","refentry"],["","function.strripos","example"],["strripos","function.strripos","refentry"],["","function.strrpos","example"],["","function.strrpos","example"],["strrpos","function.strrpos","refentry"],["","function.strspn","example"],["strspn","function.strspn","refentry"],["","function.strstr","example"],["strstr","function.strstr","refentry"],["","function.strtok","example"],["","function.strtok","example"],["","function.strtok","example"],["strtok","function.strtok","refentry"],["","function.strtolower","example"],["strtolower","function.strtolower","refentry"],["","function.strtoupper","example"],["strtoupper","function.strtoupper","refentry"],["","function.strtr","example"],["","function.strtr","example"],["","function.strtr","example"],["strtr","function.strtr","refentry"],["","function.substr-compare","example"],["substr_compare","function.substr-compare","refentry"],["","function.substr-count","example"],["substr_count","function.substr-count","refentry"],["","function.substr-replace","example"],["","function.substr-replace","example"],["substr_replace","function.substr-replace","refentry"],["","function.substr","example"],["","function.substr","example"],["","function.substr","example"],["","function.substr","example"],["","function.substr","example"],["substr","function.substr","refentry"],["","function.trim","example"],["","function.trim","example"],["trim","function.trim","refentry"],["","function.ucfirst","example"],["ucfirst","function.ucfirst","refentry"],["","function.ucwords","example"],["ucwords","function.ucwords","refentry"],["","function.vfprintf","example"],["vfprintf","function.vfprintf","refentry"],["","function.vprintf","example"],["vprintf","function.vprintf","refentry"],["","function.vsprintf","example"],["vsprintf","function.vsprintf","refentry"],["","function.wordwrap","example"],["","function.wordwrap","example"],["wordwrap","function.wordwrap","refentry"],["","ref.strings","reference"],["","changelog.strings","appendix"],["","book.strings","book"],["","refs.basic.text","set"],["","intro.array","preface"],["","array.requirements","section"],["","array.installation","section"],["","array.configuration","section"],["","array.resources","section"],["","array.setup","chapter"],["","array.constants","varlistentry"],["","array.constants","varlistentry"],["","array.constants","varlistentry"],["","array.constants","varlistentry"],["","array.constants","varlistentry"],["","array.constants","varlistentry"],["","array.constants","varlistentry"],["","array.constants","varlistentry"],["","array.constants","varlistentry"],["","array.constants","varlistentry"],["","array.constants","varlistentry"],["","array.constants","varlistentry"],["","array.constants","varlistentry"],["","array.constants","varlistentry"],["","array.constants","varlistentry"],["","array.constants","varlistentry"],["","array.constants","varlistentry"],["","array.constants","varlistentry"],["","array.constants","varlistentry"],["","array.constants","varlistentry"],["","array.constants","appendix"],["","array.sorting","chapter"],["","ref.array","partintro"],["","function.array-change-key-case","example"],["array_change_key_case","function.array-change-key-case","refentry"],["","function.array-chunk","example"],["array_chunk","function.array-chunk","refentry"],["","function.array-column","example"],["","function.array-column","example"],["array_column","function.array-column","refentry"],["","function.array-combine","example"],["array_combine","function.array-combine","refentry"],["","function.array-count-values","example"],["array_count_values","function.array-count-values","refentry"],["","function.array-diff-assoc","example"],["","function.array-diff-assoc","example"],["array_diff_assoc","function.array-diff-assoc","refentry"],["","function.array-diff-key","example"],["array_diff_key","function.array-diff-key","refentry"],["","function.array-diff-uassoc","example"],["array_diff_uassoc","function.array-diff-uassoc","refentry"],["","function.array-diff-ukey","example"],["array_diff_ukey","function.array-diff-ukey","refentry"],["","function.array-diff","example"],["array_diff","function.array-diff","refentry"],["","function.array-fill-keys","example"],["array_fill_keys","function.array-fill-keys","refentry"],["","function.array-fill","example"],["array_fill","function.array-fill","refentry"],["","function.array-filter","example"],["","function.array-filter","example"],["array_filter","function.array-filter","refentry"],["","function.array-flip","example"],["","function.array-flip","example"],["array_flip","function.array-flip","refentry"],["","function.array-intersect-assoc","example"],["array_intersect_assoc","function.array-intersect-assoc","refentry"],["","function.array-intersect-key","example"],["array_intersect_key","function.array-intersect-key","refentry"],["","function.array-intersect-uassoc","example"],["array_intersect_uassoc","function.array-intersect-uassoc","refentry"],["","function.array-intersect-ukey","example"],["array_intersect_ukey","function.array-intersect-ukey","refentry"],["","function.array-intersect","example"],["array_intersect","function.array-intersect","refentry"],["","function.array-key-exists","example"],["","function.array-key-exists","example"],["array_key_exists","function.array-key-exists","refentry"],["","function.array-keys","example"],["array_keys","function.array-keys","refentry"],["","function.array-map","example"],["","function.array-map","example"],["","function.array-map","example"],["","function.array-map","example"],["","function.array-map","example"],["array_map","function.array-map","refentry"],["","function.array-merge-recursive","example"],["array_merge_recursive","function.array-merge-recursive","refentry"],["","function.array-merge","example"],["","function.array-merge","example"],["","function.array-merge","example"],["array_merge","function.array-merge","refentry"],["","function.array-multisort","example"],["","function.array-multisort","example"],["","function.array-multisort","example"],["","function.array-multisort","example"],["array_multisort","function.array-multisort","refentry"],["","function.array-pad","example"],["array_pad","function.array-pad","refentry"],["","function.array-pop","example"],["array_pop","function.array-pop","refentry"],["","function.array-product","example"],["array_product","function.array-product","refentry"],["","function.array-push","example"],["array_push","function.array-push","refentry"],["","function.array-rand","example"],["array_rand","function.array-rand","refentry"],["","function.array-reduce","example"],["array_reduce","function.array-reduce","refentry"],["","function.array-replace-recursive","example"],["","function.array-replace-recursive","example"],["array_replace_recursive","function.array-replace-recursive","refentry"],["","function.array-replace","example"],["array_replace","function.array-replace","refentry"],["","function.array-reverse","example"],["array_reverse","function.array-reverse","refentry"],["","function.array-search","example"],["array_search","function.array-search","refentry"],["","function.array-shift","example"],["array_shift","function.array-shift","refentry"],["","function.array-slice","example"],["array_slice","function.array-slice","refentry"],["","function.array-splice","example"],["","function.array-splice","example"],["array_splice","function.array-splice","refentry"],["","function.array-sum","example"],["array_sum","function.array-sum","refentry"],["","function.array-udiff-assoc","example"],["array_udiff_assoc","function.array-udiff-assoc","refentry"],["","function.array-udiff-uassoc","example"],["array_udiff_uassoc","function.array-udiff-uassoc","refentry"],["","function.array-udiff","example"],["","function.array-udiff","example"],["array_udiff","function.array-udiff","refentry"],["","function.array-uintersect-assoc","example"],["array_uintersect_assoc","function.array-uintersect-assoc","refentry"],["","function.array-uintersect-uassoc","example"],["array_uintersect_uassoc","function.array-uintersect-uassoc","refentry"],["","function.array-uintersect","example"],["array_uintersect","function.array-uintersect","refentry"],["","function.array-unique","example"],["","function.array-unique","example"],["array_unique","function.array-unique","refentry"],["","function.array-unshift","example"],["array_unshift","function.array-unshift","refentry"],["","function.array-values","example"],["array_values","function.array-values","refentry"],["","function.array-walk-recursive","example"],["array_walk_recursive","function.array-walk-recursive","refentry"],["","function.array-walk","example"],["array_walk","function.array-walk","refentry"],["","function.array","example"],["","function.array","example"],["","function.array","example"],["","function.array","example"],["array","function.array","refentry"],["","function.arsort","example"],["arsort","function.arsort","refentry"],["","function.asort","example"],["asort","function.asort","refentry"],["","function.compact","example"],["compact","function.compact","refentry"],["","function.count","example"],["","function.count","example"],["count","function.count","refentry"],["","function.current","example"],["current","function.current","refentry"],["","function.each","example"],["","function.each","example"],["each","function.each","refentry"],["","function.end","example"],["end","function.end","refentry"],["","function.extract","example"],["extract","function.extract","refentry"],["","function.in-array","example"],["","function.in-array","example"],["","function.in-array","example"],["in_array","function.in-array","refentry"],["key_exists","function.key-exists","refentry"],["","function.key","example"],["key","function.key","refentry"],["","function.krsort","example"],["krsort","function.krsort","refentry"],["","function.ksort","example"],["ksort","function.ksort","refentry"],["","function.list","example"],["","function.list","example"],["","function.list","example"],["","function.list","example"],["list","function.list","refentry"],["","function.natcasesort","example"],["natcasesort","function.natcasesort","refentry"],["","function.natsort","example"],["","function.natsort","example"],["natsort","function.natsort","refentry"],["","function.next","example"],["next","function.next","refentry"],["pos","function.pos","refentry"],["","function.prev","example"],["prev","function.prev","refentry"],["","function.range","example"],["range","function.range","refentry"],["","function.reset","example"],["reset","function.reset","refentry"],["","function.rsort","example"],["rsort","function.rsort","refentry"],["","function.shuffle","example"],["shuffle","function.shuffle","refentry"],["sizeof","function.sizeof","refentry"],["","function.sort","example"],["","function.sort","example"],["sort","function.sort","refentry"],["","function.uasort","example"],["uasort","function.uasort","refentry"],["","function.uksort","example"],["uksort","function.uksort","refentry"],["","function.usort","example"],["","function.usort","example"],["","function.usort","example"],["","function.usort","example"],["usort","function.usort","refentry"],["","ref.array","reference"],["","book.array","book"],["","intro.classobj","preface"],["","classobj.requirements","section"],["","classobj.installation","section"],["","classobj.configuration","section"],["","classobj.resources","section"],["","classobj.setup","chapter"],["","classobj.constants","appendix"],["","classobj.examples","example"],["","classobj.examples","example"],["","classobj.examples","appendix"],["__autoload","function.autoload","refentry"],["","function.call-user-method-array","example"],["call_user_method_array","function.call-user-method-array","refentry"],["","function.call-user-method","example"],["call_user_method","function.call-user-method","refentry"],["","function.class-alias","example"],["class_alias","function.class-alias","refentry"],["","function.class-exists","example"],["","function.class-exists","example"],["class_exists","function.class-exists","refentry"],["","function.get-called-class","example"],["get_called_class","function.get-called-class","refentry"],["","function.get-class-methods","example"],["get_class_methods","function.get-class-methods","refentry"],["","function.get-class-vars","example"],["","function.get-class-vars","example"],["get_class_vars","function.get-class-vars","refentry"],["","function.get-class","example"],["","function.get-class","example"],["get_class","function.get-class","refentry"],["","function.get-declared-classes","example"],["get_declared_classes","function.get-declared-classes","refentry"],["","function.get-declared-interfaces","example"],["get_declared_interfaces","function.get-declared-interfaces","refentry"],["get_declared_traits","function.get-declared-traits","refentry"],["","function.get-object-vars","example"],["get_object_vars","function.get-object-vars","refentry"],["","function.get-parent-class","example"],["get_parent_class","function.get-parent-class","refentry"],["","function.interface-exists","example"],["interface_exists","function.interface-exists","refentry"],["","function.is-a","example"],["","function.is-a","example"],["is_a","function.is-a","refentry"],["","function.is-subclass-of","example"],["","function.is-subclass-of","example"],["is_subclass_of","function.is-subclass-of","refentry"],["","function.method-exists","example"],["","function.method-exists","example"],["method_exists","function.method-exists","refentry"],["","function.property-exists","example"],["property_exists","function.property-exists","refentry"],["trait_exists","function.trait-exists","refentry"],["","ref.classobj","reference"],["Classes\/Objects","book.classobj","book"],["","intro.classkit","preface"],["","classkit.requirements","section"],["","classkit.installation","section"],["","classkit.configuration","section"],["","classkit.resources","section"],["","classkit.setup","chapter"],["","classkit.constants","varlistentry"],["","classkit.constants","varlistentry"],["","classkit.constants","varlistentry"],["","classkit.constants","appendix"],["","function.classkit-import","example"],["classkit_import","function.classkit-import","refentry"],["","function.classkit-method-add","example"],["classkit_method_add","function.classkit-method-add","refentry"],["","function.classkit-method-copy","example"],["classkit_method_copy","function.classkit-method-copy","refentry"],["","function.classkit-method-redefine","example"],["classkit_method_redefine","function.classkit-method-redefine","refentry"],["","function.classkit-method-remove","example"],["classkit_method_remove","function.classkit-method-remove","refentry"],["","function.classkit-method-rename","example"],["classkit_method_rename","function.classkit-method-rename","refentry"],["","ref.classkit","reference"],["","book.classkit","book"],["","intro.ctype","preface"],["","ctype.requirements","section"],["","ctype.installation","section"],["","ctype.configuration","section"],["","ctype.resources","section"],["","ctype.setup","chapter"],["","ctype.constants","appendix"],["","function.ctype-alnum","example"],["ctype_alnum","function.ctype-alnum","refentry"],["","function.ctype-alpha","example"],["ctype_alpha","function.ctype-alpha","refentry"],["","function.ctype-cntrl","example"],["ctype_cntrl","function.ctype-cntrl","refentry"],["","function.ctype-digit","example"],["","function.ctype-digit","example"],["ctype_digit","function.ctype-digit","refentry"],["","function.ctype-graph","example"],["ctype_graph","function.ctype-graph","refentry"],["","function.ctype-lower","example"],["ctype_lower","function.ctype-lower","refentry"],["","function.ctype-print","example"],["ctype_print","function.ctype-print","refentry"],["","function.ctype-punct","example"],["ctype_punct","function.ctype-punct","refentry"],["","function.ctype-space","example"],["ctype_space","function.ctype-space","refentry"],["","function.ctype-upper","example"],["ctype_upper","function.ctype-upper","refentry"],["","function.ctype-xdigit","example"],["ctype_xdigit","function.ctype-xdigit","refentry"],["","ref.ctype","reference"],["Ctype","book.ctype","book"],["","intro.filter","preface"],["","filter.requirements","section"],["","filter.installation","section"],["","filter.configuration","example"],["","filter.configuration","varlistentry"],["","filter.configuration","varlistentry"],["","filter.configuration","section"],["","filter.resources","section"],["","filter.setup","chapter"],["","filter.filters.validate","section"],["","filter.filters.sanitize","example"],["","filter.filters.sanitize","section"],["","filter.filters.misc","section"],["","filter.filters.flags","section"],["","filter.filters","chapter"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","varlistentry"],["","filter.constants","appendix"],["","filter.examples.validation","programlisting"],["","filter.examples.validation","example"],["","filter.examples.validation","programlisting"],["","filter.examples.validation","example"],["","filter.examples.validation","programlisting"],["","filter.examples.validation","example"],["","filter.examples.validation","section"],["","filter.examples.sanitization","programlisting"],["","filter.examples.sanitization","example"],["","filter.examples.sanitization","programlisting"],["","filter.examples.sanitization","example"],["","filter.examples.sanitization","section"],["","filter.examples","chapter"],["filter_has_var","function.filter-has-var","refentry"],["filter_id","function.filter-id","refentry"],["","function.filter-input-array","example"],["filter_input_array","function.filter-input-array","refentry"],["","function.filter-input","example"],["filter_input","function.filter-input","refentry"],["","function.filter-list","example"],["filter_list","function.filter-list","refentry"],["","function.filter-var-array","example"],["filter_var_array","function.filter-var-array","refentry"],["","function.filter-var","example"],["filter_var","function.filter-var","refentry"],["","ref.filter","reference"],["Filter","book.filter","book"],["","intro.funchand","preface"],["","funchand.requirements","section"],["","funchand.installation","section"],["","funchand.configuration","section"],["","funchand.resources","section"],["","funchand.setup","chapter"],["","funchand.constants","appendix"],["","function.call-user-func-array","example"],["","function.call-user-func-array","example"],["","function.call-user-func-array","example"],["call_user_func_array","function.call-user-func-array","refentry"],["","function.call-user-func","example"],["","function.call-user-func","example"],["","function.call-user-func","example"],["","function.call-user-func","example"],["","function.call-user-func","example"],["call_user_func","function.call-user-func","refentry"],["","function.create-function","example"],["","function.create-function","example"],["","function.create-function","example"],["create_function","function.create-function","refentry"],["","function.forward-static-call-array","example"],["forward_static_call_array","function.forward-static-call-array","refentry"],["","function.forward-static-call","example"],["forward_static_call","function.forward-static-call","refentry"],["","function.func-get-arg","example"],["","function.func-get-arg","example"],["","function.func-get-arg","example"],["func_get_arg","function.func-get-arg","refentry"],["","function.func-get-args","example"],["","function.func-get-args","example"],["","function.func-get-args","example"],["func_get_args","function.func-get-args","refentry"],["","function.func-num-args","example"],["","function.func-num-args","example"],["func_num_args","function.func-num-args","refentry"],["","function.function-exists","example"],["function_exists","function.function-exists","refentry"],["","function.get-defined-functions","example"],["get_defined_functions","function.get-defined-functions","refentry"],["","function.register-shutdown-function","example"],["register_shutdown_function","function.register-shutdown-function","refentry"],["","function.register-tick-function","example"],["register_tick_function","function.register-tick-function","refentry"],["unregister_tick_function","function.unregister-tick-function","refentry"],["","ref.funchand","reference"],["","book.funchand","book"],["","intro.objaggregation","preface"],["","objaggregation.examples.association","example"],["","objaggregation.examples.association","example"],["","objaggregation.examples.association","section"],["","objaggregation.examples2","example"],["","objaggregation.examples2","example"],["","objaggregation.examples2","section"],["","objaggregation.examples","appendix"],["","function.aggregate-info","example"],["aggregate_info","function.aggregate-info","refentry"],["aggregate_methods_by_list","function.aggregate-methods-by-list","refentry"],["aggregate_methods_by_regexp","function.aggregate-methods-by-regexp","refentry"],["aggregate_methods","function.aggregate-methods","refentry"],["aggregate_properties_by_list","function.aggregate-properties-by-list","refentry"],["aggregate_properties_by_regexp","function.aggregate-properties-by-regexp","refentry"],["aggregate_properties","function.aggregate-properties","refentry"],["aggregate","function.aggregate","refentry"],["aggregation_info","function.aggregation-info","refentry"],["deaggregate","function.deaggregate","refentry"],["","ref.objaggregation","reference"],["Object Aggregation","book.objaggregation","book"],["","intro.quickhash","preface"],["","quickhash.requirements","section"],["","quickhash.installation","section"],["","quickhash.configuration","section"],["","quickhash.setup","chapter"],["","quickhash.constants","appendix"],["","quickhash.examples","example"],["","quickhash.examples","example"],["","quickhash.examples","example"],["","quickhash.examples","example"],["","quickhash.examples","chapter"],["","class.quickhashintset","section"],["","class.quickhashintset","section"],["","class.quickhashintset","varlistentry"],["","class.quickhashintset","varlistentry"],["","class.quickhashintset","varlistentry"],["","class.quickhashintset","varlistentry"],["","class.quickhashintset","varlistentry"],["","class.quickhashintset","section"],["","quickhashintset.add","example"],["QuickHashIntSet::add","quickhashintset.add","refentry"],["","quickhashintset.construct","example"],["QuickHashIntSet::__construct","quickhashintset.construct","refentry"],["","quickhashintset.delete","example"],["QuickHashIntSet::delete","quickhashintset.delete","refentry"],["","quickhashintset.exists","example"],["QuickHashIntSet::exists","quickhashintset.exists","refentry"],["","quickhashintset.getsize","example"],["QuickHashIntSet::getSize","quickhashintset.getsize","refentry"],["","quickhashintset.loadfromfile","example"],["QuickHashIntSet::loadFromFile","quickhashintset.loadfromfile","refentry"],["","quickhashintset.loadfromstring","example"],["QuickHashIntSet::loadFromString","quickhashintset.loadfromstring","refentry"],["","quickhashintset.savetofile","example"],["QuickHashIntSet::saveToFile","quickhashintset.savetofile","refentry"],["","quickhashintset.savetostring","example"],["QuickHashIntSet::saveToString","quickhashintset.savetostring","refentry"],["QuickHashIntSet","class.quickhashintset","phpdoc:classref"],["","class.quickhashinthash","section"],["","class.quickhashinthash","section"],["","class.quickhashinthash","varlistentry"],["","class.quickhashinthash","varlistentry"],["","class.quickhashinthash","varlistentry"],["","class.quickhashinthash","varlistentry"],["","class.quickhashinthash","varlistentry"],["","class.quickhashinthash","section"],["","quickhashinthash.add","example"],["QuickHashIntHash::add","quickhashinthash.add","refentry"],["","quickhashinthash.construct","example"],["QuickHashIntHash::__construct","quickhashinthash.construct","refentry"],["","quickhashinthash.delete","example"],["QuickHashIntHash::delete","quickhashinthash.delete","refentry"],["","quickhashinthash.exists","example"],["QuickHashIntHash::exists","quickhashinthash.exists","refentry"],["","quickhashinthash.get","example"],["QuickHashIntHash::get","quickhashinthash.get","refentry"],["","quickhashinthash.getsize","example"],["QuickHashIntHash::getSize","quickhashinthash.getsize","refentry"],["","quickhashinthash.loadfromfile","example"],["","quickhashinthash.loadfromfile","example"],["","quickhashinthash.loadfromfile","example"],["QuickHashIntHash::loadFromFile","quickhashinthash.loadfromfile","refentry"],["","quickhashinthash.loadfromstring","example"],["QuickHashIntHash::loadFromString","quickhashinthash.loadfromstring","refentry"],["","quickhashinthash.savetofile","example"],["QuickHashIntHash::saveToFile","quickhashinthash.savetofile","refentry"],["","quickhashinthash.savetostring","example"],["QuickHashIntHash::saveToString","quickhashinthash.savetostring","refentry"],["","quickhashinthash.set","example"],["QuickHashIntHash::set","quickhashinthash.set","refentry"],["","quickhashinthash.update","example"],["QuickHashIntHash::update","quickhashinthash.update","refentry"],["QuickHashIntHash","class.quickhashinthash","phpdoc:classref"],["","class.quickhashstringinthash","section"],["","class.quickhashstringinthash","section"],["","class.quickhashstringinthash","varlistentry"],["","class.quickhashstringinthash","varlistentry"],["","class.quickhashstringinthash","section"],["","quickhashstringinthash.add","example"],["QuickHashStringIntHash::add","quickhashstringinthash.add","refentry"],["","quickhashstringinthash.construct","example"],["QuickHashStringIntHash::__construct","quickhashstringinthash.construct","refentry"],["","quickhashstringinthash.delete","example"],["QuickHashStringIntHash::delete","quickhashstringinthash.delete","refentry"],["QuickHashStringIntHash::exists","quickhashstringinthash.exists","refentry"],["","quickhashstringinthash.get","example"],["QuickHashStringIntHash::get","quickhashstringinthash.get","refentry"],["","quickhashstringinthash.getsize","example"],["QuickHashStringIntHash::getSize","quickhashstringinthash.getsize","refentry"],["","quickhashstringinthash.loadfromfile","example"],["","quickhashstringinthash.loadfromfile","example"],["","quickhashstringinthash.loadfromfile","example"],["QuickHashStringIntHash::loadFromFile","quickhashstringinthash.loadfromfile","refentry"],["","quickhashstringinthash.loadfromstring","example"],["QuickHashStringIntHash::loadFromString","quickhashstringinthash.loadfromstring","refentry"],["","quickhashstringinthash.savetofile","example"],["QuickHashStringIntHash::saveToFile","quickhashstringinthash.savetofile","refentry"],["","quickhashstringinthash.savetostring","example"],["QuickHashStringIntHash::saveToString","quickhashstringinthash.savetostring","refentry"],["","quickhashstringinthash.set","example"],["QuickHashStringIntHash::set","quickhashstringinthash.set","refentry"],["","quickhashstringinthash.update","example"],["QuickHashStringIntHash::update","quickhashstringinthash.update","refentry"],["QuickHashStringIntHash","class.quickhashstringinthash","phpdoc:classref"],["","class.quickhashintstringhash","section"],["","class.quickhashintstringhash","section"],["","class.quickhashintstringhash","varlistentry"],["","class.quickhashintstringhash","varlistentry"],["","class.quickhashintstringhash","varlistentry"],["","class.quickhashintstringhash","varlistentry"],["","class.quickhashintstringhash","varlistentry"],["","class.quickhashintstringhash","section"],["","quickhashintstringhash.add","example"],["QuickHashIntStringHash::add","quickhashintstringhash.add","refentry"],["","quickhashintstringhash.construct","example"],["QuickHashIntStringHash::__construct","quickhashintstringhash.construct","refentry"],["","quickhashintstringhash.delete","example"],["QuickHashIntStringHash::delete","quickhashintstringhash.delete","refentry"],["QuickHashIntStringHash::exists","quickhashintstringhash.exists","refentry"],["","quickhashintstringhash.get","example"],["QuickHashIntStringHash::get","quickhashintstringhash.get","refentry"],["","quickhashintstringhash.getsize","example"],["QuickHashIntStringHash::getSize","quickhashintstringhash.getsize","refentry"],["","quickhashintstringhash.loadfromfile","example"],["","quickhashintstringhash.loadfromfile","example"],["","quickhashintstringhash.loadfromfile","example"],["QuickHashIntStringHash::loadFromFile","quickhashintstringhash.loadfromfile","refentry"],["","quickhashintstringhash.loadfromstring","example"],["QuickHashIntStringHash::loadFromString","quickhashintstringhash.loadfromstring","refentry"],["","quickhashintstringhash.savetofile","example"],["QuickHashIntStringHash::saveToFile","quickhashintstringhash.savetofile","refentry"],["","quickhashintstringhash.savetostring","example"],["QuickHashIntStringHash::saveToString","quickhashintstringhash.savetostring","refentry"],["","quickhashintstringhash.set","example"],["QuickHashIntStringHash::set","quickhashintstringhash.set","refentry"],["","quickhashintstringhash.update","example"],["QuickHashIntStringHash::update","quickhashintstringhash.update","refentry"],["QuickHashIntStringHash","class.quickhashintstringhash","phpdoc:classref"],["Quickhash","book.quickhash","book"],["","intro.reflection","preface"],["","reflection.requirements","section"],["","reflection.installation","section"],["","reflection.configuration","section"],["","reflection.resources","section"],["","reflection.setup","chapter"],["","reflection.constants","appendix"],["","reflection.examples","example"],["","reflection.examples","chapter"],["","reflection.extending","example"],["","reflection.extending","chapter"],["","class.reflection","section"],["","class.reflection","section"],["Reflection::export","reflection.export","refentry"],["Reflection::getModifierNames","reflection.getmodifiernames","refentry"],["Reflection","class.reflection","phpdoc:classref"],["","class.reflectionclass","section"],["","class.reflectionclass","section"],["","class.reflectionclass","varlistentry"],["","class.reflectionclass","section"],["","class.reflectionclass","varlistentry"],["","class.reflectionclass","varlistentry"],["","class.reflectionclass","varlistentry"],["","class.reflectionclass","section"],["","class.reflectionclass","section"],["","reflectionclass.construct","example"],["ReflectionClass::__construct","reflectionclass.construct","refentry"],["","reflectionclass.export","example"],["ReflectionClass::export","reflectionclass.export","refentry"],["","reflectionclass.getattribute","example"],["ReflectionClass::getAttribute","reflectionclass.getattribute","refentry"],["","reflectionclass.getattributerecursive","example"],["","reflectionclass.getattributerecursive","example"],["ReflectionClass::getAttributeRecursive","reflectionclass.getattributerecursive","refentry"],["","reflectionclass.getattributes","example"],["ReflectionClass::getAttributes","reflectionclass.getattributes","refentry"],["","reflectionclass.getattributesrecursive","example"],["ReflectionClass::getAttributesRecursive","reflectionclass.getattributesrecursive","refentry"],["ReflectionClass::getConstant","reflectionclass.getconstant","refentry"],["ReflectionClass::getConstants","reflectionclass.getconstants","refentry"],["","reflectionclass.getconstructor","example"],["ReflectionClass::getConstructor","reflectionclass.getconstructor","refentry"],["","reflectionclass.getdefaultproperties","example"],["ReflectionClass::getDefaultProperties","reflectionclass.getdefaultproperties","refentry"],["","reflectionclass.getdoccomment","example"],["ReflectionClass::getDocComment","reflectionclass.getdoccomment","refentry"],["","reflectionclass.getendline","example"],["ReflectionClass::getEndLine","reflectionclass.getendline","refentry"],["","reflectionclass.getextension","example"],["ReflectionClass::getExtension","reflectionclass.getextension","refentry"],["","reflectionclass.getextensionname","example"],["ReflectionClass::getExtensionName","reflectionclass.getextensionname","refentry"],["ReflectionClass::getFileName","reflectionclass.getfilename","refentry"],["","reflectionclass.getinterfacenames","example"],["ReflectionClass::getInterfaceNames","reflectionclass.getinterfacenames","refentry"],["","reflectionclass.getinterfaces","example"],["ReflectionClass::getInterfaces","reflectionclass.getinterfaces","refentry"],["","reflectionclass.getmethod","example"],["ReflectionClass::getMethod","reflectionclass.getmethod","refentry"],["","reflectionclass.getmethods","example"],["","reflectionclass.getmethods","example"],["ReflectionClass::getMethods","reflectionclass.getmethods","refentry"],["ReflectionClass::getModifiers","reflectionclass.getmodifiers","refentry"],["","reflectionclass.getname","example"],["ReflectionClass::getName","reflectionclass.getname","refentry"],["","reflectionclass.getnamespacename","example"],["ReflectionClass::getNamespaceName","reflectionclass.getnamespacename","refentry"],["ReflectionClass::getParentClass","reflectionclass.getparentclass","refentry"],["","reflectionclass.getproperties","example"],["ReflectionClass::getProperties","reflectionclass.getproperties","refentry"],["","reflectionclass.getproperty","example"],["ReflectionClass::getProperty","reflectionclass.getproperty","refentry"],["","reflectionclass.getshortname","example"],["ReflectionClass::getShortName","reflectionclass.getshortname","refentry"],["ReflectionClass::getStartLine","reflectionclass.getstartline","refentry"],["ReflectionClass::getStaticProperties","reflectionclass.getstaticproperties","refentry"],["","reflectionclass.getstaticpropertyvalue","example"],["ReflectionClass::getStaticPropertyValue","reflectionclass.getstaticpropertyvalue","refentry"],["ReflectionClass::getTraitAliases","reflectionclass.gettraitaliases","refentry"],["ReflectionClass::getTraitNames","reflectionclass.gettraitnames","refentry"],["ReflectionClass::getTraits","reflectionclass.gettraits","refentry"],["","reflectionclass.hasconstant","example"],["ReflectionClass::hasConstant","reflectionclass.hasconstant","refentry"],["","reflectionclass.hasmethod","example"],["ReflectionClass::hasMethod","reflectionclass.hasmethod","refentry"],["","reflectionclass.hasproperty","example"],["ReflectionClass::hasProperty","reflectionclass.hasproperty","refentry"],["ReflectionClass::implementsInterface","reflectionclass.implementsinterface","refentry"],["","reflectionclass.innamespace","example"],["ReflectionClass::inNamespace","reflectionclass.innamespace","refentry"],["","reflectionclass.isabstract","example"],["ReflectionClass::isAbstract","reflectionclass.isabstract","refentry"],["","reflectionclass.iscloneable","example"],["ReflectionClass::isCloneable","reflectionclass.iscloneable","refentry"],["","reflectionclass.isfinal","example"],["ReflectionClass::isFinal","reflectionclass.isfinal","refentry"],["","reflectionclass.isinstance","example"],["ReflectionClass::isInstance","reflectionclass.isinstance","refentry"],["","reflectionclass.isinstantiable","example"],["ReflectionClass::isInstantiable","reflectionclass.isinstantiable","refentry"],["","reflectionclass.isinterface","example"],["ReflectionClass::isInterface","reflectionclass.isinterface","refentry"],["","reflectionclass.isinternal","example"],["ReflectionClass::isInternal","reflectionclass.isinternal","refentry"],["","reflectionclass.isiterateable","example"],["ReflectionClass::isIterateable","reflectionclass.isiterateable","refentry"],["ReflectionClass::isSubclassOf","reflectionclass.issubclassof","refentry"],["ReflectionClass::isTrait","reflectionclass.istrait","refentry"],["ReflectionClass::isUserDefined","reflectionclass.isuserdefined","refentry"],["ReflectionClass::newInstance","reflectionclass.newinstance","refentry"],["","reflectionclass.newinstanceargs","example"],["ReflectionClass::newInstanceArgs","reflectionclass.newinstanceargs","refentry"],["ReflectionClass::newInstanceWithoutConstructor","reflectionclass.newinstancewithoutconstructor","refentry"],["ReflectionClass::setStaticPropertyValue","reflectionclass.setstaticpropertyvalue","refentry"],["","reflectionclass.tostring","example"],["ReflectionClass::__toString","reflectionclass.tostring","refentry"],["ReflectionClass","class.reflectionclass","phpdoc:classref"],["","class.reflectionzendextension","section"],["","class.reflectionzendextension","section"],["","class.reflectionzendextension","varlistentry"],["","class.reflectionzendextension","section"],["ReflectionZendExtension::__clone","reflectionzendextension.clone","refentry"],["ReflectionZendExtension::__construct","reflectionzendextension.construct","refentry"],["ReflectionZendExtension::export","reflectionzendextension.export","refentry"],["ReflectionZendExtension::getAuthor","reflectionzendextension.getauthor","refentry"],["ReflectionZendExtension::getCopyright","reflectionzendextension.getcopyright","refentry"],["ReflectionZendExtension::getName","reflectionzendextension.getname","refentry"],["ReflectionZendExtension::getURL","reflectionzendextension.geturl","refentry"],["ReflectionZendExtension::getVersion","reflectionzendextension.getversion","refentry"],["ReflectionZendExtension::__toString","reflectionzendextension.tostring","refentry"],["ReflectionZendExtension","class.reflectionzendextension","phpdoc:classref"],["","class.reflectionextension","section"],["","class.reflectionextension","section"],["","class.reflectionextension","varlistentry"],["","class.reflectionextension","section"],["ReflectionExtension::__clone","reflectionextension.clone","refentry"],["","reflectionextension.construct","example"],["ReflectionExtension::__construct","reflectionextension.construct","refentry"],["ReflectionExtension::export","reflectionextension.export","refentry"],["","reflectionextension.getclasses","example"],["ReflectionExtension::getClasses","reflectionextension.getclasses","refentry"],["","reflectionextension.getclassnames","example"],["ReflectionExtension::getClassNames","reflectionextension.getclassnames","refentry"],["","reflectionextension.getconstants","example"],["ReflectionExtension::getConstants","reflectionextension.getconstants","refentry"],["","reflectionextension.getdependencies","example"],["ReflectionExtension::getDependencies","reflectionextension.getdependencies","refentry"],["","reflectionextension.getfunctions","example"],["ReflectionExtension::getFunctions","reflectionextension.getfunctions","refentry"],["","reflectionextension.getinientries","example"],["ReflectionExtension::getINIEntries","reflectionextension.getinientries","refentry"],["","reflectionextension.getname","example"],["ReflectionExtension::getName","reflectionextension.getname","refentry"],["","reflectionextension.getversion","example"],["ReflectionExtension::getVersion","reflectionextension.getversion","refentry"],["","reflectionextension.info","example"],["ReflectionExtension::info","reflectionextension.info","refentry"],["ReflectionExtension::isPersistent","reflectionextension.ispersistent","refentry"],["ReflectionExtension::isTemporary","reflectionextension.istemporary","refentry"],["ReflectionExtension::__toString","reflectionextension.tostring","refentry"],["ReflectionExtension","class.reflectionextension","phpdoc:classref"],["","class.reflectionfunction","section"],["","class.reflectionfunction","section"],["","class.reflectionfunction","varlistentry"],["","class.reflectionfunction","section"],["","class.reflectionfunction","varlistentry"],["","class.reflectionfunction","section"],["","class.reflectionfunction","section"],["","reflectionfunction.construct","example"],["ReflectionFunction::__construct","reflectionfunction.construct","refentry"],["ReflectionFunction::export","reflectionfunction.export","refentry"],["ReflectionFunction::getClosure","reflectionfunction.getclosure","refentry"],["","reflectionfunction.invoke","example"],["ReflectionFunction::invoke","reflectionfunction.invoke","refentry"],["","reflectionfunction.invokeargs","example"],["","reflectionfunction.invokeargs","example"],["ReflectionFunction::invokeArgs","reflectionfunction.invokeargs","refentry"],["ReflectionFunction::isDisabled","reflectionfunction.isdisabled","refentry"],["","reflectionfunction.tostring","example"],["ReflectionFunction::__toString","reflectionfunction.tostring","refentry"],["ReflectionFunction","class.reflectionfunction","phpdoc:classref"],["","class.reflectionfunctionabstract","section"],["","class.reflectionfunctionabstract","section"],["","class.reflectionfunctionabstract","varlistentry"],["","class.reflectionfunctionabstract","section"],["ReflectionFunctionAbstract::__clone","reflectionfunctionabstract.clone","refentry"],["","reflectionfunctionabstract.getattribute","example"],["ReflectionFunctionAbstract::getAttribute","reflectionfunctionabstract.getattribute","refentry"],["","reflectionfunctionabstract.getattributes","example"],["ReflectionFunctionAbstract::getAttributes","reflectionfunctionabstract.getattributes","refentry"],["ReflectionFunctionAbstract::getClosureScopeClass","reflectionfunctionabstract.getclosurescopeclass","refentry"],["ReflectionFunctionAbstract::getClosureThis","reflectionfunctionabstract.getclosurethis","refentry"],["ReflectionFunctionAbstract::getDocComment","reflectionfunctionabstract.getdoccomment","refentry"],["ReflectionFunctionAbstract::getEndLine","reflectionfunctionabstract.getendline","refentry"],["ReflectionFunctionAbstract::getExtension","reflectionfunctionabstract.getextension","refentry"],["ReflectionFunctionAbstract::getExtensionName","reflectionfunctionabstract.getextensionname","refentry"],["ReflectionFunctionAbstract::getFileName","reflectionfunctionabstract.getfilename","refentry"],["ReflectionFunctionAbstract::getName","reflectionfunctionabstract.getname","refentry"],["ReflectionFunctionAbstract::getNamespaceName","reflectionfunctionabstract.getnamespacename","refentry"],["ReflectionFunctionAbstract::getNumberOfParameters","reflectionfunctionabstract.getnumberofparameters","refentry"],["ReflectionFunctionAbstract::getNumberOfRequiredParameters","reflectionfunctionabstract.getnumberofrequiredparameters","refentry"],["ReflectionFunctionAbstract::getParameters","reflectionfunctionabstract.getparameters","refentry"],["ReflectionFunctionAbstract::getShortName","reflectionfunctionabstract.getshortname","refentry"],["ReflectionFunctionAbstract::getStartLine","reflectionfunctionabstract.getstartline","refentry"],["ReflectionFunctionAbstract::getStaticVariables","reflectionfunctionabstract.getstaticvariables","refentry"],["ReflectionFunctionAbstract::inNamespace","reflectionfunctionabstract.innamespace","refentry"],["ReflectionFunctionAbstract::isClosure","reflectionfunctionabstract.isclosure","refentry"],["","reflectionfunctionabstract.isdeprecated","example"],["ReflectionFunctionAbstract::isDeprecated","reflectionfunctionabstract.isdeprecated","refentry"],["ReflectionFunctionAbstract::isGenerator","reflectionfunctionabstract.isgenerator","refentry"],["ReflectionFunctionAbstract::isInternal","reflectionfunctionabstract.isinternal","refentry"],["ReflectionFunctionAbstract::isUserDefined","reflectionfunctionabstract.isuserdefined","refentry"],["ReflectionFunctionAbstract::returnsReference","reflectionfunctionabstract.returnsreference","refentry"],["ReflectionFunctionAbstract::__toString","reflectionfunctionabstract.tostring","refentry"],["ReflectionFunctionAbstract","class.reflectionfunctionabstract","phpdoc:classref"],["","class.reflectionmethod","section"],["","class.reflectionmethod","section"],["","class.reflectionmethod","varlistentry"],["","class.reflectionmethod","varlistentry"],["","class.reflectionmethod","section"],["","class.reflectionmethod","varlistentry"],["","class.reflectionmethod","varlistentry"],["","class.reflectionmethod","varlistentry"],["","class.reflectionmethod","varlistentry"],["","class.reflectionmethod","varlistentry"],["","class.reflectionmethod","varlistentry"],["","class.reflectionmethod","section"],["","class.reflectionmethod","section"],["","reflectionmethod.construct","example"],["ReflectionMethod::__construct","reflectionmethod.construct","refentry"],["ReflectionMethod::export","reflectionmethod.export","refentry"],["","reflectionmethod.getattributerecursive","example"],["","reflectionmethod.getattributerecursive","example"],["ReflectionMethod::getAttributeRecursive","reflectionmethod.getattributerecursive","refentry"],["","reflectionmethod.getattributesrecursive","example"],["ReflectionMethod::getAttributesRecursive","reflectionmethod.getattributesrecursive","refentry"],["ReflectionMethod::getClosure","reflectionmethod.getclosure","refentry"],["","reflectionmethod.getdeclaringclass","example"],["ReflectionMethod::getDeclaringClass","reflectionmethod.getdeclaringclass","refentry"],["","reflectionmethod.getmodifiers","example"],["ReflectionMethod::getModifiers","reflectionmethod.getmodifiers","refentry"],["","reflectionmethod.getprototype","example"],["ReflectionMethod::getPrototype","reflectionmethod.getprototype","refentry"],["","reflectionmethod.invoke","example"],["ReflectionMethod::invoke","reflectionmethod.invoke","refentry"],["","reflectionmethod.invokeargs","example"],["ReflectionMethod::invokeArgs","reflectionmethod.invokeargs","refentry"],["ReflectionMethod::isAbstract","reflectionmethod.isabstract","refentry"],["ReflectionMethod::isConstructor","reflectionmethod.isconstructor","refentry"],["ReflectionMethod::isDestructor","reflectionmethod.isdestructor","refentry"],["ReflectionMethod::isFinal","reflectionmethod.isfinal","refentry"],["ReflectionMethod::isPrivate","reflectionmethod.isprivate","refentry"],["ReflectionMethod::isProtected","reflectionmethod.isprotected","refentry"],["ReflectionMethod::isPublic","reflectionmethod.ispublic","refentry"],["ReflectionMethod::isStatic","reflectionmethod.isstatic","refentry"],["ReflectionMethod::setAccessible","reflectionmethod.setaccessible","refentry"],["","reflectionmethod.tostring","example"],["ReflectionMethod::__toString","reflectionmethod.tostring","refentry"],["ReflectionMethod","class.reflectionmethod","phpdoc:classref"],["","class.reflectionobject","section"],["","class.reflectionobject","section"],["","class.reflectionobject","varlistentry"],["","class.reflectionobject","section"],["ReflectionObject::__construct","reflectionobject.construct","refentry"],["ReflectionObject::export","reflectionobject.export","refentry"],["ReflectionObject","class.reflectionobject","phpdoc:classref"],["","class.reflectionparameter","section"],["","class.reflectionparameter","section"],["","class.reflectionparameter","varlistentry"],["","class.reflectionparameter","section"],["ReflectionParameter::allowsNull","reflectionparameter.allowsnull","refentry"],["ReflectionParameter::canBePassedByValue","reflectionparameter.canbepassedbyvalue","refentry"],["ReflectionParameter::__clone","reflectionparameter.clone","refentry"],["","reflectionparameter.construct","example"],["ReflectionParameter::__construct","reflectionparameter.construct","refentry"],["ReflectionParameter::export","reflectionparameter.export","refentry"],["","reflectionparameter.getclass","example"],["ReflectionParameter::getClass","reflectionparameter.getclass","refentry"],["ReflectionParameter::getDeclaringClass","reflectionparameter.getdeclaringclass","refentry"],["ReflectionParameter::getDeclaringFunction","reflectionparameter.getdeclaringfunction","refentry"],["","reflectionparameter.getdefaultvalue","example"],["ReflectionParameter::getDefaultValue","reflectionparameter.getdefaultvalue","refentry"],["ReflectionParameter::getDefaultValueConstantName","reflectionparameter.getdefaultvalueconstantname","refentry"],["ReflectionParameter::getName","reflectionparameter.getname","refentry"],["ReflectionParameter::getPosition","reflectionparameter.getposition","refentry"],["","reflectionparameter.gettypehinttext","example"],["","reflectionparameter.gettypehinttext","example"],["ReflectionParameter::getTypehintText","reflectionparameter.gettypehinttext","refentry"],["","reflectionparameter.gettypetext","example"],["ReflectionParameter::getTypeText","reflectionparameter.gettypetext","refentry"],["ReflectionParameter::isArray","reflectionparameter.isarray","refentry"],["ReflectionParameter::isCallable","reflectionparameter.iscallable","refentry"],["ReflectionParameter::isDefaultValueAvailable","reflectionparameter.isdefaultvalueavailable","refentry"],["ReflectionParameter::isDefaultValueConstant","reflectionparameter.isdefaultvalueconstant","refentry"],["ReflectionParameter::isOptional","reflectionparameter.isoptional","refentry"],["ReflectionParameter::isPassedByReference","reflectionparameter.ispassedbyreference","refentry"],["ReflectionParameter::__toString","reflectionparameter.tostring","refentry"],["ReflectionParameter","class.reflectionparameter","phpdoc:classref"],["","class.reflectionproperty","section"],["","class.reflectionproperty","section"],["","class.reflectionproperty","varlistentry"],["","class.reflectionproperty","varlistentry"],["","class.reflectionproperty","section"],["","class.reflectionproperty","varlistentry"],["","class.reflectionproperty","varlistentry"],["","class.reflectionproperty","varlistentry"],["","class.reflectionproperty","varlistentry"],["","class.reflectionproperty","section"],["","class.reflectionproperty","section"],["ReflectionProperty::__clone","reflectionproperty.clone","refentry"],["","reflectionproperty.construct","example"],["","reflectionproperty.construct","example"],["ReflectionProperty::__construct","reflectionproperty.construct","refentry"],["ReflectionProperty::export","reflectionproperty.export","refentry"],["ReflectionProperty::getDeclaringClass","reflectionproperty.getdeclaringclass","refentry"],["ReflectionProperty::getDocComment","reflectionproperty.getdoccomment","refentry"],["ReflectionProperty::getModifiers","reflectionproperty.getmodifiers","refentry"],["ReflectionProperty::getName","reflectionproperty.getname","refentry"],["","reflectionproperty.gettypetext","example"],["ReflectionProperty::getTypeText","reflectionproperty.gettypetext","refentry"],["","reflectionproperty.getvalue","example"],["ReflectionProperty::getValue","reflectionproperty.getvalue","refentry"],["ReflectionProperty::isDefault","reflectionproperty.isdefault","refentry"],["ReflectionProperty::isPrivate","reflectionproperty.isprivate","refentry"],["ReflectionProperty::isProtected","reflectionproperty.isprotected","refentry"],["ReflectionProperty::isPublic","reflectionproperty.ispublic","refentry"],["ReflectionProperty::isStatic","reflectionproperty.isstatic","refentry"],["ReflectionProperty::setAccessible","reflectionproperty.setaccessible","refentry"],["","reflectionproperty.setvalue","example"],["ReflectionProperty::setValue","reflectionproperty.setvalue","refentry"],["ReflectionProperty::__toString","reflectionproperty.tostring","refentry"],["ReflectionProperty","class.reflectionproperty","phpdoc:classref"],["","class.reflector","section"],["","class.reflector","section"],["Reflector::export","reflector.export","refentry"],["Reflector::__toString","reflector.tostring","refentry"],["Reflector","class.reflector","phpdoc:classref"],["","class.reflectionexception","section"],["","class.reflectionexception","section"],["ReflectionException","class.reflectionexception","phpdoc:classref"],["Reflection","book.reflection","book"],["","intro.var","preface"],["","var.requirements","section"],["","var.installation","section"],["","var.configuration","varlistentry"],["","var.configuration","section"],["","var.resources","section"],["","var.setup","chapter"],["","var.constants","appendix"],["","function.boolval","example"],["boolval","function.boolval","refentry"],["","function.debug-zval-dump","example"],["","function.debug-zval-dump","example"],["","function.debug-zval-dump","example"],["debug_zval_dump","function.debug-zval-dump","refentry"],["doubleval","function.doubleval","refentry"],["","function.empty","example"],["","function.empty","example"],["empty","function.empty","refentry"],["","function.floatval","example"],["","function.floatval","example"],["floatval","function.floatval","refentry"],["","function.get-defined-vars","example"],["get_defined_vars","function.get-defined-vars","refentry"],["","function.get-resource-type","example"],["get_resource_type","function.get-resource-type","refentry"],["","function.gettype","example"],["gettype","function.gettype","refentry"],["","function.import-request-variables","example"],["import_request_variables","function.import-request-variables","refentry"],["","function.intval","example"],["intval","function.intval","refentry"],["","function.is-array","example"],["is_array","function.is-array","refentry"],["","function.is-bool","example"],["is_bool","function.is-bool","refentry"],["","function.is-callable","example"],["is_callable","function.is-callable","refentry"],["is_double","function.is-double","refentry"],["","function.is-float","example"],["is_float","function.is-float","refentry"],["","function.is-int","example"],["is_int","function.is-int","refentry"],["is_integer","function.is-integer","refentry"],["is_long","function.is-long","refentry"],["","function.is-null","example"],["is_null","function.is-null","refentry"],["","function.is-numeric","example"],["is_numeric","function.is-numeric","refentry"],["","function.is-object","example"],["is_object","function.is-object","refentry"],["is_real","function.is-real","refentry"],["","function.is-resource","example"],["is_resource","function.is-resource","refentry"],["","function.is-scalar","example"],["is_scalar","function.is-scalar","refentry"],["","function.is-string","example"],["is_string","function.is-string","refentry"],["","function.isset","example"],["","function.isset","example"],["isset","function.isset","refentry"],["","function.print-r","example"],["","function.print-r","example"],["print_r","function.print-r","refentry"],["","function.serialize","example"],["serialize","function.serialize","refentry"],["","function.settype","example"],["settype","function.settype","refentry"],["","function.strval","example"],["strval","function.strval","refentry"],["","function.unserialize","example"],["","function.unserialize","example"],["unserialize","function.unserialize","refentry"],["","function.unset","example"],["","function.unset","example"],["unset","function.unset","refentry"],["","function.var-dump","example"],["var_dump","function.var-dump","refentry"],["","function.var-export","example"],["","function.var-export","example"],["","function.var-export","example"],["var_export","function.var-export","refentry"],["","ref.var","reference"],["","book.var","book"],["","refs.basic.vartype","set"],["","intro.oauth","preface"],["","oauth.requirements","section"],["","oauth.installation","section"],["","oauth.configuration","section"],["","oauth.resources","section"],["","oauth.setup","chapter"],["","oauth.constants","varlistentry"],["","oauth.constants","varlistentry"],["","oauth.constants","varlistentry"],["","oauth.constants","varlistentry"],["","oauth.constants","varlistentry"],["","oauth.constants","varlistentry"],["","oauth.constants","varlistentry"],["","oauth.constants","varlistentry"],["","oauth.constants","varlistentry"],["","oauth.constants","varlistentry"],["","oauth.constants","varlistentry"],["","oauth.constants","varlistentry"],["","oauth.constants","varlistentry"],["","oauth.constants","varlistentry"],["","oauth.constants","varlistentry"],["","oauth.constants","varlistentry"],["","oauth.constants","varlistentry"],["","oauth.constants","varlistentry"],["","oauth.constants","varlistentry"],["","oauth.constants","varlistentry"],["","oauth.constants","varlistentry"],["","oauth.constants","varlistentry"],["","oauth.constants","varlistentry"],["","oauth.constants","varlistentry"],["","oauth.constants","varlistentry"],["","oauth.constants","varlistentry"],["","oauth.constants","varlistentry"],["","oauth.constants","appendix"],["","oauth.examples.fireeagle","programlisting"],["","oauth.examples.fireeagle","example"],["","oauth.examples.fireeagle","section"],["","oauth.examples","chapter"],["oauth_get_sbs","function.oauth-get-sbs","refentry"],["oauth_urlencode","function.oauth-urlencode","refentry"],["","ref.oauth","reference"],["","class.oauth","section"],["","class.oauth","section"],["","class.oauth","varlistentry"],["","class.oauth","varlistentry"],["","class.oauth","varlistentry"],["","class.oauth","section"],["OAuth::__construct","oauth.construct","refentry"],["OAuth::__destruct","oauth.destruct","refentry"],["OAuth::disableDebug","oauth.disabledebug","refentry"],["OAuth::disableRedirects","oauth.disableredirects","refentry"],["OAuth::disableSSLChecks","oauth.disablesslchecks","refentry"],["OAuth::enableDebug","oauth.enabledebug","refentry"],["OAuth::enableRedirects","oauth.enableredirects","refentry"],["OAuth::enableSSLChecks","oauth.enablesslchecks","refentry"],["","oauth.fetch","example"],["OAuth::fetch","oauth.fetch","refentry"],["OAuth::generateSignature","oauth.generatesignature","refentry"],["","oauth.getaccesstoken","example"],["OAuth::getAccessToken","oauth.getaccesstoken","refentry"],["OAuth::getCAPath","oauth.getcapath","refentry"],["OAuth::getLastResponse","oauth.getlastresponse","refentry"],["OAuth::getLastResponseHeaders","oauth.getlastresponseheaders","refentry"],["OAuth::getLastResponseInfo","oauth.getlastresponseinfo","refentry"],["OAuth::getRequestHeader","oauth.getrequestheader","refentry"],["","oauth.getrequesttoken","example"],["OAuth::getRequestToken","oauth.getrequesttoken","refentry"],["OAuth::setAuthType","oauth.setauthtype","refentry"],["OAuth::setCAPath","oauth.setcapath","refentry"],["OAuth::setNonce","oauth.setnonce","refentry"],["","oauth.setrequestengine","example"],["OAuth::setRequestEngine","oauth.setrequestengine","refentry"],["","oauth.setrsacertificate","example"],["OAuth::setRSACertificate","oauth.setrsacertificate","refentry"],["OAuth::setSSLChecks","oauth.setsslchecks","refentry"],["OAuth::setTimestamp","oauth.settimestamp","refentry"],["","oauth.settoken","example"],["OAuth::setToken","oauth.settoken","refentry"],["OAuth::setVersion","oauth.setversion","refentry"],["OAuth","class.oauth","phpdoc:classref"],["","class.oauthprovider","section"],["","class.oauthprovider","section"],["OAuthProvider::addRequiredParameter","oauthprovider.addrequiredparameter","refentry"],["OAuthProvider::callconsumerHandler","oauthprovider.callconsumerhandler","refentry"],["OAuthProvider::callTimestampNonceHandler","oauthprovider.calltimestampnoncehandler","refentry"],["OAuthProvider::calltokenHandler","oauthprovider.calltokenhandler","refentry"],["OAuthProvider::checkOAuthRequest","oauthprovider.checkoauthrequest","refentry"],["","oauthprovider.construct","example"],["OAuthProvider::__construct","oauthprovider.construct","refentry"],["","oauthprovider.consumerhandler","example"],["OAuthProvider::consumerHandler","oauthprovider.consumerhandler","refentry"],["","oauthprovider.generatetoken","example"],["OAuthProvider::generateToken","oauthprovider.generatetoken","refentry"],["","oauthprovider.is2leggedendpoint","example"],["OAuthProvider::is2LeggedEndpoint","oauthprovider.is2leggedendpoint","refentry"],["OAuthProvider::isRequestTokenEndpoint","oauthprovider.isrequesttokenendpoint","refentry"],["OAuthProvider::removeRequiredParameter","oauthprovider.removerequiredparameter","refentry"],["OAuthProvider::reportProblem","oauthprovider.reportproblem","refentry"],["OAuthProvider::setParam","oauthprovider.setparam","refentry"],["OAuthProvider::setRequestTokenPath","oauthprovider.setrequesttokenpath","refentry"],["","oauthprovider.timestampnoncehandler","example"],["OAuthProvider::timestampNonceHandler","oauthprovider.timestampnoncehandler","refentry"],["","oauthprovider.tokenhandler","example"],["OAuthProvider::tokenHandler","oauthprovider.tokenhandler","refentry"],["OAuthProvider","class.oauthprovider","phpdoc:classref"],["","class.oauthexception","section"],["","class.oauthexception","section"],["","class.oauthexception","varlistentry"],["","class.oauthexception","varlistentry"],["","class.oauthexception","section"],["OAuthException","class.oauthexception","phpdoc:classref"],["","book.oauth","book"],["","intro.sca","example"],["","intro.sca","preface"],["","sca.requirements","section"],["","sca.installation","section"],["","sca.configuration","section"],["","sca.resources","section"],["","sca.setup","chapter"],["","sca.constants","appendix"],["","sca.examples.structure","example"],["","sca.examples.structure","section"],["","sca.examples.proxies","example"],["","sca.examples.proxies","example"],["","sca.examples.proxies","section"],["","sca.examples.calling","example"],["","sca.examples.calling","section"],["","sca.examples.nonscascript","example"],["","sca.examples.nonscascript","example"],["","sca.examples.nonscascript","section"],["","sca.examples.exposing-webservice","example"],["","sca.examples.exposing-webservice","example"],["","sca.examples.exposing-webservice","section"],["","sca.examples.deploy","section"],["","sca.examples.obtaining-wsdl","example"],["","sca.examples.obtaining-wsdl","section"],["","sca.examples.understanding-wsdl","example"],["","sca.examples.understanding-wsdl","section"],["","sca.examples.understanding-wsdl","example"],["","sca.examples.understanding-wsdl","example"],["","sca.examples.understanding-wsdl","section"],["","sca.examples.understanding-wsdl","section"],["","sca.examples.structures","example"],["","sca.examples.structures","section"],["","sca.examples.structures","section"],["","sca.examples.structures","section"],["","sca.examples.structures","section"],["","sca.examples.structures","section"],["","sca.examples.errorhandling","section"],["","sca.examples.errorhandling","section"],["","sca.examples.errorhandling","section"],["","sca.examples","chapter"],["","ref.sca","section"],["","ref.sca","section"],["","ref.sca","section"],["","ref.sca","section"],["SCA::createDataObject","sca.createdataobject","refentry"],["","sca.getservice","example"],["SCA::getService","sca.getservice","refentry"],["SCA_LocalProxy::createDataObject","sca-localproxy.createdataobject","refentry"],["SCA_SoapProxy::createDataObject","sca-soapproxy.createdataobject","refentry"],["","ref.sca","reference"],["","book.sca","book"],["","intro.soap","preface"],["","soap.requirements","section"],["","soap.installation","section"],["","soap.configuration","varlistentry"],["","soap.configuration","varlistentry"],["","soap.configuration","varlistentry"],["","soap.configuration","varlistentry"],["","soap.configuration","varlistentry"],["","soap.configuration","section"],["","soap.resources","section"],["","soap.setup","chapter"],["","soap.constants","appendix"],["","function.is-soap-fault","example"],["","function.is-soap-fault","example"],["is_soap_fault","function.is-soap-fault","refentry"],["use_soap_error_handler","function.use-soap-error-handler","refentry"],["","ref.soap","reference"],["","class.soapclient","section"],["","class.soapclient","section"],["SoapClient::__call","soapclient.call","refentry"],["SoapClient::__construct","soapclient.construct","refentry"],["","soapclient.dorequest","example"],["SoapClient::__doRequest","soapclient.dorequest","refentry"],["","soapclient.getfunctions","example"],["SoapClient::__getFunctions","soapclient.getfunctions","refentry"],["","soapclient.getlastrequest","example"],["SoapClient::__getLastRequest","soapclient.getlastrequest","refentry"],["","soapclient.getlastrequestheaders","example"],["SoapClient::__getLastRequestHeaders","soapclient.getlastrequestheaders","refentry"],["","soapclient.getlastresponse","example"],["SoapClient::__getLastResponse","soapclient.getlastresponse","refentry"],["","soapclient.getlastresponseheaders","example"],["SoapClient::__getLastResponseHeaders","soapclient.getlastresponseheaders","refentry"],["","soapclient.gettypes","example"],["SoapClient::__getTypes","soapclient.gettypes","refentry"],["SoapClient::__setCookie","soapclient.setcookie","refentry"],["","soapclient.setlocation","example"],["SoapClient::__setLocation","soapclient.setlocation","refentry"],["","soapclient.setsoapheaders","example"],["","soapclient.setsoapheaders","example"],["SoapClient::__setSoapHeaders","soapclient.setsoapheaders","refentry"],["","soapclient.soapcall","example"],["SoapClient::__soapCall","soapclient.soapcall","refentry"],["","soapclient.soapclient","example"],["SoapClient::SoapClient","soapclient.soapclient","refentry"],["SoapClient","class.soapclient","phpdoc:classref"],["","class.soapserver","section"],["","class.soapserver","section"],["","soapserver.addfunction","example"],["SoapServer::addFunction","soapserver.addfunction","refentry"],["SoapServer::addSoapHeader","soapserver.addsoapheader","refentry"],["SoapServer::__construct","soapserver.construct","refentry"],["SoapServer::fault","soapserver.fault","refentry"],["","soapserver.getfunctions","example"],["SoapServer::getFunctions","soapserver.getfunctions","refentry"],["","soapserver.handle","example"],["SoapServer::handle","soapserver.handle","refentry"],["SoapServer::setClass","soapserver.setclass","refentry"],["SoapServer::setObject","soapserver.setobject","refentry"],["","soapserver.setpersistence","example"],["SoapServer::setPersistence","soapserver.setpersistence","refentry"],["","soapserver.soapserver","example"],["SoapServer::SoapServer","soapserver.soapserver","refentry"],["SoapServer","class.soapserver","phpdoc:classref"],["","class.soapfault","section"],["","class.soapfault","section"],["SoapFault::__construct","soapfault.construct","refentry"],["","soapfault.soapfault","example"],["","soapfault.soapfault","example"],["SoapFault::SoapFault","soapfault.soapfault","refentry"],["SoapFault::__toString","soapfault.tostring","refentry"],["SoapFault","class.soapfault","phpdoc:classref"],["","class.soapheader","section"],["","class.soapheader","section"],["SoapHeader::__construct","soapheader.construct","refentry"],["","soapheader.soapheader","example"],["SoapHeader::SoapHeader","soapheader.soapheader","refentry"],["SoapHeader","class.soapheader","phpdoc:classref"],["","class.soapparam","section"],["","class.soapparam","section"],["SoapParam::__construct","soapparam.construct","refentry"],["","soapparam.soapparam","example"],["SoapParam::SoapParam","soapparam.soapparam","refentry"],["SoapParam","class.soapparam","phpdoc:classref"],["","class.soapvar","section"],["","class.soapvar","section"],["SoapVar::__construct","soapvar.construct","refentry"],["","soapvar.soapvar","example"],["SoapVar::SoapVar","soapvar.soapvar","refentry"],["SoapVar","class.soapvar","phpdoc:classref"],["SOAP","book.soap","book"],["","intro.yar","preface"],["","yar.requirements","section"],["","yar.installation","section"],["","yar.configuration","varlistentry"],["","yar.configuration","varlistentry"],["","yar.configuration","varlistentry"],["","yar.configuration","varlistentry"],["","yar.configuration","varlistentry"],["","yar.configuration","section"],["","yar.resources","section"],["","yar.setup","chapter"],["","yar.constants","varlistentry"],["","yar.constants","varlistentry"],["","yar.constants","varlistentry"],["","yar.constants","varlistentry"],["","yar.constants","varlistentry"],["","yar.constants","varlistentry"],["","yar.constants","varlistentry"],["","yar.constants","varlistentry"],["","yar.constants","varlistentry"],["","yar.constants","varlistentry"],["","yar.constants","varlistentry"],["","yar.constants","varlistentry"],["","yar.constants","varlistentry"],["","yar.constants","varlistentry"],["","yar.constants","appendix"],["","yar.examples","example"],["","yar.examples","example"],["","yar.examples","example"],["","yar.examples","example"],["","yar.examples","chapter"],["","class.yar-server","section"],["","class.yar-server","section"],["","class.yar-server","varlistentry"],["","class.yar-server","section"],["","yar-server.construct","example"],["Yar_Server::__construct","yar-server.construct","refentry"],["","yar-server.handle","example"],["Yar_Server::handle","yar-server.handle","refentry"],["Yar_Server","class.yar-server","phpdoc:classref"],["","class.yar-client","section"],["","class.yar-client","section"],["","class.yar-client","varlistentry"],["","class.yar-client","varlistentry"],["","class.yar-client","varlistentry"],["","class.yar-client","varlistentry"],["","class.yar-client","section"],["","yar-client.call","example"],["Yar_Client::__call","yar-client.call","refentry"],["","yar-client.construct","example"],["Yar_Client::__construct","yar-client.construct","refentry"],["","yar-client.setopt","example"],["Yar_Client::setOpt","yar-client.setopt","refentry"],["Yar_Client","class.yar-client","phpdoc:classref"],["","class.yar-concurrent-client","section"],["","class.yar-concurrent-client","section"],["","class.yar-concurrent-client","varlistentry"],["","class.yar-concurrent-client","varlistentry"],["","class.yar-concurrent-client","varlistentry"],["","class.yar-concurrent-client","section"],["","yar-concurrent-client.call","example"],["Yar_Concurrent_Client::call","yar-concurrent-client.call","refentry"],["","yar-concurrent-client.loop","example"],["Yar_Concurrent_Client::loop","yar-concurrent-client.loop","refentry"],["Yar_Concurrent_Client","class.yar-concurrent-client","phpdoc:classref"],["","class.yar-server-exception","section"],["","class.yar-server-exception","section"],["","class.yar-server-exception","varlistentry"],["","class.yar-server-exception","varlistentry"],["","class.yar-server-exception","varlistentry"],["","class.yar-server-exception","varlistentry"],["","class.yar-server-exception","varlistentry"],["","class.yar-server-exception","section"],["","yar-server-exception.gettype","example"],["Yar_Server_Exception::getType","yar-server-exception.gettype","refentry"],["Yar_Server_Exception","class.yar-server-exception","phpdoc:classref"],["","class.yar-client-exception","section"],["","class.yar-client-exception","section"],["","class.yar-client-exception","varlistentry"],["","class.yar-client-exception","varlistentry"],["","class.yar-client-exception","varlistentry"],["","class.yar-client-exception","varlistentry"],["","class.yar-client-exception","section"],["","yar-client-exception.gettype","example"],["Yar_Client_Exception::getType","yar-client-exception.gettype","refentry"],["Yar_Client_Exception","class.yar-client-exception","phpdoc:classref"],["Yar","book.yar","book"],["","intro.xmlrpc","preface"],["","xmlrpc.requirements","section"],["","xmlrpc.installation","section"],["","xmlrpc.configuration","section"],["","xmlrpc.resources","section"],["","xmlrpc.setup","chapter"],["","xmlrpc.constants","appendix"],["xmlrpc_decode_request","function.xmlrpc-decode-request","refentry"],["xmlrpc_decode","function.xmlrpc-decode","refentry"],["","function.xmlrpc-encode-request","example"],["xmlrpc_encode_request","function.xmlrpc-encode-request","refentry"],["xmlrpc_encode","function.xmlrpc-encode","refentry"],["","function.xmlrpc-get-type","example"],["xmlrpc_get_type","function.xmlrpc-get-type","refentry"],["xmlrpc_is_fault","function.xmlrpc-is-fault","refentry"],["xmlrpc_parse_method_descriptions","function.xmlrpc-parse-method-descriptions","refentry"],["xmlrpc_server_add_introspection_data","function.xmlrpc-server-add-introspection-data","refentry"],["xmlrpc_server_call_method","function.xmlrpc-server-call-method","refentry"],["xmlrpc_server_create","function.xmlrpc-server-create","refentry"],["xmlrpc_server_destroy","function.xmlrpc-server-destroy","refentry"],["xmlrpc_server_register_introspection_callback","function.xmlrpc-server-register-introspection-callback","refentry"],["xmlrpc_server_register_method","function.xmlrpc-server-register-method","refentry"],["","function.xmlrpc-set-type","example"],["xmlrpc_set_type","function.xmlrpc-set-type","refentry"],["","ref.xmlrpc","reference"],["","book.xmlrpc","book"],["","refs.webservice","set"],["","intro.dotnet","preface"],["","dotnet.requirements","section"],["","dotnet.installation","section"],["","dotnet.configuration","section"],["","dotnet.resources","section"],["","dotnet.setup","chapter"],["","dotnet.constants","appendix"],["dotnet_load","function.dotnet-load","refentry"],["","ref.dotnet","reference"],["","book.dotnet","book"],["","intro.com","preface"],["","com.requirements","section"],["","com.installation","section"],["","com.configuration","varlistentry"],["","com.configuration","varlistentry"],["","com.configuration","varlistentry"],["","com.configuration","varlistentry"],["","com.configuration","varlistentry"],["","com.configuration","varlistentry"],["","com.configuration","section"],["","com.resources","section"],["","com.setup","chapter"],["","com.constants","chapter"],["","com.error-handling","chapter"],["","com.examples.foreach","example"],["","com.examples.foreach","example"],["","com.examples.foreach","example"],["","com.examples.foreach","section"],["","com.examples.arrays","section"],["","com.examples","chapter"],["","class.com","section"],["","class.com","section"],["","class.com","section"],["","class.com","methodsynopsis"],["","class.com","methodsynopsis"],["","class.com","section"],["","class.com","methodsynopsis"],["","class.com","methodsynopsis"],["","class.com","methodsynopsis"],["","class.com","methodsynopsis"],["","class.com","section"],["","class.com","example"],["","class.com","example"],["","class.com","section"],["COM","class.com","phpdoc:classref"],["","class.dotnet","section"],["","class.dotnet","example"],["","class.dotnet","section"],["DOTNET","class.dotnet","phpdoc:classref"],["","class.variant","section"],["","class.variant","example"],["","class.variant","example"],["","class.variant","section"],["VARIANT","class.variant","phpdoc:classref"],["","ref.com","section"],["com_addref","function.com-addref","refentry"],["com_create_guid","function.com-create-guid","refentry"],["","function.com-event-sink","example"],["com_event_sink","function.com-event-sink","refentry"],["com_get_active_object","function.com-get-active-object","refentry"],["","function.com-get","example"],["com_get","function.com-get","refentry"],["","function.com-invoke","example"],["com_invoke","function.com-invoke","refentry"],["com_isenum","function.com-isenum","refentry"],["com_load_typelib","function.com-load-typelib","refentry"],["","function.com-load","example"],["com_load","function.com-load","refentry"],["com_message_pump","function.com-message-pump","refentry"],["com_print_typeinfo","function.com-print-typeinfo","refentry"],["com_propget","function.com-propget","refentry"],["com_propput","function.com-propput","refentry"],["com_propset","function.com-propset","refentry"],["com_release","function.com-release","refentry"],["","function.com-set","example"],["com_set","function.com-set","refentry"],["variant_abs","function.variant-abs","refentry"],["variant_add","function.variant-add","refentry"],["variant_and","function.variant-and","refentry"],["variant_cast","function.variant-cast","refentry"],["variant_cat","function.variant-cat","refentry"],["variant_cmp","function.variant-cmp","refentry"],["variant_date_from_timestamp","function.variant-date-from-timestamp","refentry"],["variant_date_to_timestamp","function.variant-date-to-timestamp","refentry"],["variant_div","function.variant-div","refentry"],["variant_eqv","function.variant-eqv","refentry"],["variant_fix","function.variant-fix","refentry"],["variant_get_type","function.variant-get-type","refentry"],["variant_idiv","function.variant-idiv","refentry"],["variant_imp","function.variant-imp","refentry"],["variant_int","function.variant-int","refentry"],["variant_mod","function.variant-mod","refentry"],["variant_mul","function.variant-mul","refentry"],["variant_neg","function.variant-neg","refentry"],["variant_not","function.variant-not","refentry"],["variant_or","function.variant-or","refentry"],["variant_pow","function.variant-pow","refentry"],["variant_round","function.variant-round","refentry"],["variant_set_type","function.variant-set-type","refentry"],["variant_set","function.variant-set","refentry"],["variant_sub","function.variant-sub","refentry"],["variant_xor","function.variant-xor","refentry"],["","ref.com","reference"],["COM","book.com","book"],["","intro.printer","preface"],["","printer.requirements","section"],["","printer.installation","section"],["","printer.configuration","section"],["","printer.resources","section"],["","printer.setup","chapter"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","varlistentry"],["","printer.constants","appendix"],["","function.printer-abort","example"],["printer_abort","function.printer-abort","refentry"],["","function.printer-close","example"],["printer_close","function.printer-close","refentry"],["printer_create_brush","function.printer-create-brush","refentry"],["","function.printer-create-dc","example"],["printer_create_dc","function.printer-create-dc","refentry"],["printer_create_font","function.printer-create-font","refentry"],["printer_create_pen","function.printer-create-pen","refentry"],["printer_delete_brush","function.printer-delete-brush","refentry"],["printer_delete_dc","function.printer-delete-dc","refentry"],["printer_delete_font","function.printer-delete-font","refentry"],["printer_delete_pen","function.printer-delete-pen","refentry"],["","function.printer-draw-bmp","example"],["printer_draw_bmp","function.printer-draw-bmp","refentry"],["","function.printer-draw-chord","example"],["printer_draw_chord","function.printer-draw-chord","refentry"],["","function.printer-draw-elipse","example"],["printer_draw_elipse","function.printer-draw-elipse","refentry"],["","function.printer-draw-line","example"],["printer_draw_line","function.printer-draw-line","refentry"],["","function.printer-draw-pie","example"],["printer_draw_pie","function.printer-draw-pie","refentry"],["","function.printer-draw-rectangle","example"],["printer_draw_rectangle","function.printer-draw-rectangle","refentry"],["","function.printer-draw-roundrect","example"],["printer_draw_roundrect","function.printer-draw-roundrect","refentry"],["","function.printer-draw-text","example"],["printer_draw_text","function.printer-draw-text","refentry"],["printer_end_doc","function.printer-end-doc","refentry"],["printer_end_page","function.printer-end-page","refentry"],["","function.printer-get-option","example"],["printer_get_option","function.printer-get-option","refentry"],["","function.printer-list","example"],["printer_list","function.printer-list","refentry"],["","function.printer-logical-fontheight","example"],["printer_logical_fontheight","function.printer-logical-fontheight","refentry"],["","function.printer-open","example"],["printer_open","function.printer-open","refentry"],["","function.printer-select-brush","example"],["printer_select_brush","function.printer-select-brush","refentry"],["","function.printer-select-font","example"],["printer_select_font","function.printer-select-font","refentry"],["","function.printer-select-pen","example"],["printer_select_pen","function.printer-select-pen","refentry"],["","function.printer-set-option","example"],["printer_set_option","function.printer-set-option","refentry"],["","function.printer-start-doc","example"],["printer_start_doc","function.printer-start-doc","refentry"],["printer_start_page","function.printer-start-page","refentry"],["","function.printer-write","example"],["printer_write","function.printer-write","refentry"],["","ref.printer","reference"],["","book.printer","book"],["","intro.w32api","preface"],["","w32api.requirements","section"],["","w32api.installation","section"],["","w32api.configuration","section"],["","w32api.resources","section"],["","w32api.setup","chapter"],["","w32api.constants","varlistentry"],["","w32api.constants","varlistentry"],["","w32api.constants","varlistentry"],["","w32api.constants","varlistentry"],["","w32api.constants","varlistentry"],["","w32api.constants","varlistentry"],["","w32api.constants","varlistentry"],["","w32api.constants","varlistentry"],["","w32api.constants","varlistentry"],["","w32api.constants","varlistentry"],["","w32api.constants","appendix"],["","w32api.examples-uptime","example"],["","w32api.examples-uptime","section"],["","w32api.examples","chapter"],["w32api_deftype","function.w32api-deftype","refentry"],["w32api_init_dtype","function.w32api-init-dtype","refentry"],["w32api_invoke_function","function.w32api-invoke-function","refentry"],["w32api_register_function","function.w32api-register-function","refentry"],["w32api_set_call_method","function.w32api-set-call-method","refentry"],["","ref.w32api","reference"],["","book.w32api","book"],["","intro.win32ps","preface"],["","win32ps.requirements","section"],["","win32ps.installation","section"],["","win32ps.configuration","section"],["","win32ps.resources","section"],["","win32ps.setup","chapter"],["","win32ps.constants","appendix"],["","win32ps.examples-process","example"],["","win32ps.examples-process","example"],["","win32ps.examples-process","section"],["","win32ps.examples","chapter"],["win32_ps_list_procs","function.win32-ps-list-procs","refentry"],["win32_ps_stat_mem","function.win32-ps-stat-mem","refentry"],["win32_ps_stat_proc","function.win32-ps-stat-proc","refentry"],["","ref.win32ps","reference"],["","book.win32ps","book"],["","intro.win32service","preface"],["","win32service.requirements","section"],["","win32service.installation","section"],["","win32service.configuration","section"],["","win32service.resources","section"],["","win32service.setup","chapter"],["","win32service.constants.servicetype","section"],["","win32service.constants.servicestatus","section"],["","win32service.constants.servicecontrol","section"],["","win32service.constants.controlsaccepted","section"],["","win32service.constants.servicestarttype","section"],["","win32service.constants.errorcontrol","section"],["","win32service.constants.serviceflag","section"],["","win32service.constants.errors","section"],["","win32service.constants.basepriorities","section"],["","win32service.constants","appendix"],["","win32service.examples","example"],["","win32service.examples","example"],["","win32service.examples","example"],["","win32service.examples","chapter"],["win32_continue_service","function.win32-continue-service","refentry"],["","function.win32-create-service","example"],["win32_create_service","function.win32-create-service","refentry"],["","function.win32-delete-service","example"],["win32_delete_service","function.win32-delete-service","refentry"],["win32_get_last_control_message","function.win32-get-last-control-message","refentry"],["win32_pause_service","function.win32-pause-service","refentry"],["win32_query_service_status","function.win32-query-service-status","refentry"],["win32_set_service_status","function.win32-set-service-status","refentry"],["","function.win32-start-service-ctrl-dispatcher","example"],["win32_start_service_ctrl_dispatcher","function.win32-start-service-ctrl-dispatcher","refentry"],["win32_start_service","function.win32-start-service","refentry"],["win32_stop_service","function.win32-stop-service","refentry"],["","ref.win32service","reference"],["","book.win32service","book"],["","refs.utilspec.windows","set"],["","intro.dom","preface"],["","dom.requirements","section"],["","dom.installation","section"],["","dom.configuration","section"],["","dom.resources","section"],["","dom.setup","chapter"],["","dom.constants","chapter"],["","dom.examples","example"],["","dom.examples","chapter"],["","class.domattr","section"],["","class.domattr","section"],["","class.domattr","varlistentry"],["","class.domattr","varlistentry"],["","class.domattr","varlistentry"],["","class.domattr","varlistentry"],["","class.domattr","varlistentry"],["","class.domattr","section"],["","domattr.construct","example"],["DOMAttr::__construct","domattr.construct","refentry"],["","domattr.isid","example"],["DOMAttr::isId","domattr.isid","refentry"],["DOMAttr","class.domattr","phpdoc:classref"],["","class.domcdatasection","section"],["","class.domcdatasection","section"],["","domcdatasection.construct","example"],["DOMCdataSection::__construct","domcdatasection.construct","refentry"],["DOMCdataSection","class.domcdatasection","phpdoc:classref"],["","class.domcharacterdata","section"],["","class.domcharacterdata","section"],["","class.domcharacterdata","varlistentry"],["","class.domcharacterdata","varlistentry"],["","class.domcharacterdata","section"],["DOMCharacterData::appendData","domcharacterdata.appenddata","refentry"],["DOMCharacterData::deleteData","domcharacterdata.deletedata","refentry"],["DOMCharacterData::insertData","domcharacterdata.insertdata","refentry"],["DOMCharacterData::replaceData","domcharacterdata.replacedata","refentry"],["DOMCharacterData::substringData","domcharacterdata.substringdata","refentry"],["DOMCharacterData","class.domcharacterdata","phpdoc:classref"],["","class.domcomment","section"],["","class.domcomment","section"],["","domcomment.construct","example"],["DOMComment::__construct","domcomment.construct","refentry"],["DOMComment","class.domcomment","phpdoc:classref"],["","class.domdocument","section"],["","class.domdocument","section"],["","class.domdocument","varlistentry"],["","class.domdocument","varlistentry"],["","class.domdocument","varlistentry"],["","class.domdocument","varlistentry"],["","class.domdocument","varlistentry"],["","class.domdocument","varlistentry"],["","class.domdocument","varlistentry"],["","class.domdocument","varlistentry"],["","class.domdocument","varlistentry"],["","class.domdocument","varlistentry"],["","class.domdocument","varlistentry"],["","class.domdocument","varlistentry"],["","class.domdocument","varlistentry"],["","class.domdocument","varlistentry"],["","class.domdocument","varlistentry"],["","class.domdocument","varlistentry"],["","class.domdocument","varlistentry"],["","class.domdocument","varlistentry"],["","class.domdocument","varlistentry"],["","class.domdocument","section"],["","domdocument.construct","example"],["DOMDocument::__construct","domdocument.construct","refentry"],["DOMDocument::createAttribute","domdocument.createattribute","refentry"],["DOMDocument::createAttributeNS","domdocument.createattributens","refentry"],["DOMDocument::createCDATASection","domdocument.createcdatasection","refentry"],["DOMDocument::createComment","domdocument.createcomment","refentry"],["DOMDocument::createDocumentFragment","domdocument.createdocumentfragment","refentry"],["","domdocument.createelement","example"],["DOMDocument::createElement","domdocument.createelement","refentry"],["","domdocument.createelementns","example"],["","domdocument.createelementns","example"],["DOMDocument::createElementNS","domdocument.createelementns","refentry"],["DOMDocument::createEntityReference","domdocument.createentityreference","refentry"],["DOMDocument::createProcessingInstruction","domdocument.createprocessinginstruction","refentry"],["DOMDocument::createTextNode","domdocument.createtextnode","refentry"],["","domdocument.getelementbyid","example"],["DOMDocument::getElementById","domdocument.getelementbyid","refentry"],["","domdocument.getelementsbytagname","example"],["DOMDocument::getElementsByTagName","domdocument.getelementsbytagname","refentry"],["","domdocument.getelementsbytagnamens","example"],["DOMDocument::getElementsByTagNameNS","domdocument.getelementsbytagnamens","refentry"],["","domdocument.importnode","example"],["DOMDocument::importNode","domdocument.importnode","refentry"],["","domdocument.load","example"],["DOMDocument::load","domdocument.load","refentry"],["","domdocument.loadhtml","example"],["DOMDocument::loadHTML","domdocument.loadhtml","refentry"],["","domdocument.loadhtmlfile","example"],["DOMDocument::loadHTMLFile","domdocument.loadhtmlfile","refentry"],["","domdocument.loadxml","example"],["","domdocument.loadxml","example"],["DOMDocument::loadXML","domdocument.loadxml","refentry"],["DOMDocument::normalizeDocument","domdocument.normalizedocument","refentry"],["","domdocument.registernodeclass","example"],["","domdocument.registernodeclass","example"],["","domdocument.registernodeclass","example"],["DOMDocument::registerNodeClass","domdocument.registernodeclass","refentry"],["DOMDocument::relaxNGValidate","domdocument.relaxngvalidate","refentry"],["DOMDocument::relaxNGValidateSource","domdocument.relaxngvalidatesource","refentry"],["","domdocument.save","example"],["DOMDocument::save","domdocument.save","refentry"],["","domdocument.savehtml","example"],["DOMDocument::saveHTML","domdocument.savehtml","refentry"],["","domdocument.savehtmlfile","example"],["DOMDocument::saveHTMLFile","domdocument.savehtmlfile","refentry"],["","domdocument.savexml","example"],["DOMDocument::saveXML","domdocument.savexml","refentry"],["DOMDocument::schemaValidate","domdocument.schemavalidate","refentry"],["DOMDocument::schemaValidateSource","domdocument.schemavalidatesource","refentry"],["","domdocument.validate","example"],["DOMDocument::validate","domdocument.validate","refentry"],["","domdocument.xinclude","example"],["DOMDocument::xinclude","domdocument.xinclude","refentry"],["DOMDocument","class.domdocument","phpdoc:classref"],["","class.domdocumentfragment","section"],["","domdocumentfragment.appendxml","example"],["DOMDocumentFragment::appendXML","domdocumentfragment.appendxml","refentry"],["DOMDocumentFragment","class.domdocumentfragment","phpdoc:classref"],["","class.domdocumenttype","section"],["","class.domdocumenttype","section"],["","class.domdocumenttype","varlistentry"],["","class.domdocumenttype","varlistentry"],["","class.domdocumenttype","varlistentry"],["","class.domdocumenttype","varlistentry"],["","class.domdocumenttype","varlistentry"],["","class.domdocumenttype","varlistentry"],["","class.domdocumenttype","section"],["DOMDocumentType","class.domdocumenttype","phpdoc:classref"],["","class.domelement","section"],["","class.domelement","varlistentry"],["","class.domelement","varlistentry"],["","class.domelement","section"],["","domelement.construct","example"],["DOMElement::__construct","domelement.construct","refentry"],["DOMElement::getAttribute","domelement.getattribute","refentry"],["DOMElement::getAttributeNode","domelement.getattributenode","refentry"],["DOMElement::getAttributeNodeNS","domelement.getattributenodens","refentry"],["DOMElement::getAttributeNS","domelement.getattributens","refentry"],["DOMElement::getElementsByTagName","domelement.getelementsbytagname","refentry"],["DOMElement::getElementsByTagNameNS","domelement.getelementsbytagnamens","refentry"],["DOMElement::hasAttribute","domelement.hasattribute","refentry"],["DOMElement::hasAttributeNS","domelement.hasattributens","refentry"],["DOMElement::removeAttribute","domelement.removeattribute","refentry"],["DOMElement::removeAttributeNode","domelement.removeattributenode","refentry"],["DOMElement::removeAttributeNS","domelement.removeattributens","refentry"],["","domelement.setattribute","example"],["DOMElement::setAttribute","domelement.setattribute","refentry"],["DOMElement::setAttributeNode","domelement.setattributenode","refentry"],["DOMElement::setAttributeNodeNS","domelement.setattributenodens","refentry"],["DOMElement::setAttributeNS","domelement.setattributens","refentry"],["DOMElement::setIdAttribute","domelement.setidattribute","refentry"],["DOMElement::setIdAttributeNode","domelement.setidattributenode","refentry"],["DOMElement::setIdAttributeNS","domelement.setidattributens","refentry"],["DOMElement","class.domelement","phpdoc:classref"],["","class.domentity","section"],["","class.domentity","section"],["","class.domentity","varlistentry"],["","class.domentity","varlistentry"],["","class.domentity","varlistentry"],["","class.domentity","varlistentry"],["","class.domentity","varlistentry"],["","class.domentity","varlistentry"],["","class.domentity","section"],["DOMEntity","class.domentity","phpdoc:classref"],["","class.domentityreference","section"],["","domentityreference.construct","example"],["DOMEntityReference::__construct","domentityreference.construct","refentry"],["DOMEntityReference","class.domentityreference","phpdoc:classref"],["","class.domexception","section"],["","class.domexception","section"],["","class.domexception","varlistentry"],["","class.domexception","section"],["DOMException","class.domexception","phpdoc:exceptionref"],["","class.domimplementation","section"],["","class.domimplementation","section"],["DOMImplementation::__construct","domimplementation.construct","refentry"],["DOMImplementation::createDocument","domimplementation.createdocument","refentry"],["","domimplementation.createdocumenttype","example"],["DOMImplementation::createDocumentType","domimplementation.createdocumenttype","refentry"],["","domimplementation.hasfeature","example"],["DOMImplementation::hasFeature","domimplementation.hasfeature","refentry"],["DOMImplementation","class.domimplementation","phpdoc:classref"],["","class.domnamednodemap","section"],["","class.domnamednodemap","varlistentry"],["","class.domnamednodemap","section"],["DOMNamedNodeMap::getNamedItem","domnamednodemap.getnameditem","refentry"],["DOMNamedNodeMap::getNamedItemNS","domnamednodemap.getnameditemns","refentry"],["DOMNamedNodeMap::item","domnamednodemap.item","refentry"],["DOMNamedNodeMap","class.domnamednodemap","phpdoc:classref"],["","class.domnode","section"],["","class.domnode","varlistentry"],["","class.domnode","varlistentry"],["","class.domnode","varlistentry"],["","class.domnode","varlistentry"],["","class.domnode","varlistentry"],["","class.domnode","varlistentry"],["","class.domnode","varlistentry"],["","class.domnode","varlistentry"],["","class.domnode","varlistentry"],["","class.domnode","varlistentry"],["","class.domnode","varlistentry"],["","class.domnode","varlistentry"],["","class.domnode","varlistentry"],["","class.domnode","varlistentry"],["","class.domnode","varlistentry"],["","class.domnode","varlistentry"],["","class.domnode","section"],["","domnode.appendchild","example"],["DOMNode::appendChild","domnode.appendchild","refentry"],["DOMNode::C14N","domnode.c14n","refentry"],["DOMNode::C14NFile","domnode.c14nfile","refentry"],["DOMNode::cloneNode","domnode.clonenode","refentry"],["","domnode.getlineno","example"],["DOMNode::getLineNo","domnode.getlineno","refentry"],["","domnode.getnodepath","example"],["DOMNode::getNodePath","domnode.getnodepath","refentry"],["DOMNode::hasAttributes","domnode.hasattributes","refentry"],["DOMNode::hasChildNodes","domnode.haschildnodes","refentry"],["DOMNode::insertBefore","domnode.insertbefore","refentry"],["DOMNode::isDefaultNamespace","domnode.isdefaultnamespace","refentry"],["DOMNode::isSameNode","domnode.issamenode","refentry"],["DOMNode::isSupported","domnode.issupported","refentry"],["DOMNode::lookupNamespaceURI","domnode.lookupnamespaceuri","refentry"],["DOMNode::lookupPrefix","domnode.lookupprefix","refentry"],["DOMNode::normalize","domnode.normalize","refentry"],["","domnode.removechild","example"],["DOMNode::removeChild","domnode.removechild","refentry"],["DOMNode::replaceChild","domnode.replacechild","refentry"],["DOMNode","class.domnode","phpdoc:classref"],["","class.domnodelist","section"],["","class.domnodelist","varlistentry"],["","class.domnodelist","section"],["","domnodelist.item","example"],["DOMNodelist::item","domnodelist.item","refentry"],["DOMNodeList","class.domnodelist","phpdoc:classref"],["","class.domnotation","section"],["","class.domnotation","varlistentry"],["","class.domnotation","varlistentry"],["","class.domnotation","section"],["DOMNotation","class.domnotation","phpdoc:classref"],["","class.domprocessinginstruction","section"],["","class.domprocessinginstruction","varlistentry"],["","class.domprocessinginstruction","varlistentry"],["","class.domprocessinginstruction","section"],["","domprocessinginstruction.construct","example"],["DOMProcessingInstruction::__construct","domprocessinginstruction.construct","refentry"],["DOMProcessingInstruction","class.domprocessinginstruction","phpdoc:classref"],["","class.domtext","section"],["","class.domtext","section"],["","class.domtext","varlistentry"],["","class.domtext","section"],["","domtext.construct","example"],["DOMText::__construct","domtext.construct","refentry"],["DOMText::isWhitespaceInElementContent","domtext.iswhitespaceinelementcontent","refentry"],["DOMText::splitText","domtext.splittext","refentry"],["DOMText","class.domtext","phpdoc:classref"],["","class.domxpath","section"],["","class.domxpath","section"],["","class.domxpath","varlistentry"],["","class.domxpath","section"],["DOMXPath::__construct","domxpath.construct","refentry"],["","domxpath.evaluate","example"],["DOMXPath::evaluate","domxpath.evaluate","refentry"],["","domxpath.query","example"],["DOMXPath::query","domxpath.query","refentry"],["DOMXPath::registerNamespace","domxpath.registernamespace","refentry"],["","domxpath.registerphpfunctions","example"],["","domxpath.registerphpfunctions","example"],["","domxpath.registerphpfunctions","example"],["DOMXPath::registerPhpFunctions","domxpath.registerphpfunctions","refentry"],["DOMXPath","class.domxpath","phpdoc:classref"],["","function.dom-import-simplexml","example"],["dom_import_simplexml","function.dom-import-simplexml","refentry"],["","ref.dom","reference"],["DOM","book.dom","book"],["","intro.libxml","preface"],["","libxml.requirements","section"],["","libxml.installation","section"],["","libxml.configuration","section"],["","libxml.resources","section"],["","libxml.setup","chapter"],["","libxml.constants","varlistentry"],["","libxml.constants","varlistentry"],["","libxml.constants","varlistentry"],["","libxml.constants","varlistentry"],["","libxml.constants","varlistentry"],["","libxml.constants","varlistentry"],["","libxml.constants","varlistentry"],["","libxml.constants","varlistentry"],["","libxml.constants","varlistentry"],["","libxml.constants","varlistentry"],["","libxml.constants","varlistentry"],["","libxml.constants","varlistentry"],["","libxml.constants","varlistentry"],["","libxml.constants","varlistentry"],["","libxml.constants","varlistentry"],["","libxml.constants","varlistentry"],["","libxml.constants","varlistentry"],["","libxml.constants","varlistentry"],["","libxml.constants","varlistentry"],["","libxml.constants","varlistentry"],["","libxml.constants","varlistentry"],["","libxml.constants","varlistentry"],["","libxml.constants","varlistentry"],["","libxml.constants","varlistentry"],["","libxml.constants","varlistentry"],["","libxml.constants","appendix"],["","class.libxmlerror","section"],["","class.libxmlerror","section"],["","class.libxmlerror","varlistentry"],["","class.libxmlerror","varlistentry"],["","class.libxmlerror","varlistentry"],["","class.libxmlerror","varlistentry"],["","class.libxmlerror","varlistentry"],["","class.libxmlerror","varlistentry"],["","class.libxmlerror","section"],["libXMLError","class.libxmlerror","phpdoc:classref"],["libxml_clear_errors","function.libxml-clear-errors","refentry"],["libxml_disable_entity_loader","function.libxml-disable-entity-loader","refentry"],["","function.libxml-get-errors","example"],["libxml_get_errors","function.libxml-get-errors","refentry"],["libxml_get_last_error","function.libxml-get-last-error","refentry"],["","function.libxml-set-external-entity-loader","example"],["libxml_set_external_entity_loader","function.libxml-set-external-entity-loader","refentry"],["","function.libxml-set-streams-context","example"],["libxml_set_streams_context","function.libxml-set-streams-context","refentry"],["","function.libxml-use-internal-errors","example"],["libxml_use_internal_errors","function.libxml-use-internal-errors","refentry"],["","ref.libxml","reference"],["","book.libxml","book"],["","intro.qtdom","preface"],["","qtdom.requirements","section"],["","qtdom.installation","section"],["","qtdom.configuration","section"],["","qtdom.resources","section"],["","qtdom.setup","chapter"],["","qtdom.constants","appendix"],["qdom_error","function.qdom-error","refentry"],["qdom_tree","function.qdom-tree","refentry"],["","ref.qtdom","reference"],["","book.qtdom","book"],["","intro.sdo","section"],["","intro.sdo","preface"],["","sdo.requirements","section"],["","sdo.installation","section"],["","sdo.configuration","section"],["","sdo.resources","section"],["","sdo.setup","chapter"],["","sdo.constants","varlistentry"],["","sdo.constants","varlistentry"],["","sdo.constants","varlistentry"],["","sdo.constants","varlistentry"],["","sdo.constants","appendix"],["","sdo.limitations","procedure"],["","sdo.limitations","procedure"],["","sdo.limitations","chapter"],["","sdo.examples-basic","section"],["","sdo.sample.getset","programlisting"],["","sdo.sample.getset","example"],["","sdo.sample.getset","programlisting"],["","sdo.sample.getset","example"],["","sdo.sample.getset","programlisting"],["","sdo.sample.getset","programlisting"],["","sdo.sample.getset","example"],["","sdo.sample.getset","programlisting"],["","sdo.sample.getset","example"],["","sdo.sample.getset","programlisting"],["","sdo.sample.getset","example"],["","sdo.sample.getset","programlisting"],["","sdo.sample.getset","example"],["","sdo.sample.getset","programlisting"],["","sdo.sample.getset","programlisting"],["","sdo.sample.getset","example"],["","sdo.sample.getset","programlisting"],["","sdo.sample.getset","programlisting"],["","sdo.sample.getset","example"],["","sdo.sample.getset","programlisting"],["","sdo.sample.getset","example"],["","sdo.sample.getset","programlisting"],["","sdo.sample.getset","example"],["","sdo.sample.getset","programlisting"],["","sdo.sample.getset","example"],["","sdo.sample.getset","programlisting"],["","sdo.sample.getset","example"],["","sdo.sample.getset","programlisting"],["","sdo.sample.getset","example"],["","sdo.sample.getset","programlisting"],["","sdo.sample.getset","example"],["","sdo.sample.getset","section"],["","sdo.sample.sequence","programlisting"],["","sdo.sample.sequence","example"],["","sdo.sample.sequence","programlisting"],["","sdo.sample.sequence","example"],["","sdo.sample.sequence","programlisting"],["","sdo.sample.sequence","example"],["","sdo.sample.sequence","programlisting"],["","sdo.sample.sequence","example"],["","sdo.sample.sequence","programlisting"],["","sdo.sample.sequence","example"],["","sdo.sample.sequence","programlisting"],["","sdo.sample.sequence","example"],["","sdo.sample.sequence","section"],["","sdo.sample.reflection","programlisting"],["","sdo.sample.reflection","example"],["","sdo.sample.reflection","programlisting"],["","sdo.sample.reflection","example"],["","sdo.sample.reflection","section"],["","sdo.examples","chapter"],["","ref.sdo","section"],["","ref.sdo","section"],["","ref.sdo","section"],["","ref.sdo","section"],["","ref.sdo","section"],["","ref.sdo","section"],["","ref.sdo","section"],["","ref.sdo","section"],["","ref.sdo","section"],["","ref.sdo","section"],["","ref.sdo","section"],["","ref.sdo","section"],["","ref.sdo","section"],["","ref.sdo","section"],["","ref.sdo","section"],["","ref.sdo","section"],["","ref.sdo","section"],["SDO_DAS_ChangeSummary::beginLogging","sdo-das-changesummary.beginlogging","refentry"],["SDO_DAS_ChangeSummary::endLogging","sdo-das-changesummary.endlogging","refentry"],["SDO_DAS_ChangeSummary::getChangeType","sdo-das-changesummary.getchangetype","refentry"],["SDO_DAS_ChangeSummary::getChangedDataObjects","sdo-das-changesummary.getchangeddataobjects","refentry"],["SDO_DAS_ChangeSummary::getOldContainer","sdo-das-changesummary.getoldcontainer","refentry"],["SDO_DAS_ChangeSummary::getOldValues","sdo-das-changesummary.getoldvalues","refentry"],["SDO_DAS_ChangeSummary::isLogging","sdo-das-changesummary.islogging","refentry"],["","sdo-das-datafactory.addpropertytotype","example"],["SDO_DAS_DataFactory::addPropertyToType","sdo-das-datafactory.addpropertytotype","refentry"],["","sdo-das-datafactory.addtype","example"],["SDO_DAS_DataFactory::addType","sdo-das-datafactory.addtype","refentry"],["SDO_DAS_DataFactory::getDataFactory","sdo-das-datafactory.getdatafactory","refentry"],["SDO_DAS_DataObject::getChangeSummary","sdo-das-dataobject.getchangesummary","refentry"],["SDO_DAS_Setting::getListIndex","sdo-das-setting.getlistindex","refentry"],["SDO_DAS_Setting::getPropertyIndex","sdo-das-setting.getpropertyindex","refentry"],["SDO_DAS_Setting::getPropertyName","sdo-das-setting.getpropertyname","refentry"],["SDO_DAS_Setting::getValue","sdo-das-setting.getvalue","refentry"],["SDO_DAS_Setting::isSet","sdo-das-setting.isset","refentry"],["SDO_DataFactory::create","sdo-datafactory.create","refentry"],["SDO_DataObject::clear","sdo-dataobject.clear","refentry"],["SDO_DataObject::createDataObject","sdo-dataobject.createdataobject","refentry"],["SDO_DataObject::getContainer","sdo-dataobject.getcontainer","refentry"],["SDO_DataObject::getSequence","sdo-dataobject.getsequence","refentry"],["SDO_DataObject::getTypeName","sdo-dataobject.gettypename","refentry"],["SDO_DataObject::getTypeNamespaceURI","sdo-dataobject.gettypenamespaceuri","refentry"],["SDO_Exception::getCause","sdo-exception.getcause","refentry"],["SDO_List::insert","sdo-list.insert","refentry"],["SDO_Model_Property::getContainingType","sdo-model-property.getcontainingtype","refentry"],["SDO_Model_Property::getDefault","sdo-model-property.getdefault","refentry"],["SDO_Model_Property::getName","sdo-model-property.getname","refentry"],["SDO_Model_Property::getType","sdo-model-property.gettype","refentry"],["SDO_Model_Property::isContainment","sdo-model-property.iscontainment","refentry"],["SDO_Model_Property::isMany","sdo-model-property.ismany","refentry"],["SDO_Model_ReflectionDataObject::__construct","sdo-model-reflectiondataobject.construct","refentry"],["SDO_Model_ReflectionDataObject::export","sdo-model-reflectiondataobject.export","refentry"],["SDO_Model_ReflectionDataObject::getContainmentProperty","sdo-model-reflectiondataobject.getcontainmentproperty","refentry"],["SDO_Model_ReflectionDataObject::getInstanceProperties","sdo-model-reflectiondataobject.getinstanceproperties","refentry"],["SDO_Model_ReflectionDataObject::getType","sdo-model-reflectiondataobject.gettype","refentry"],["SDO_Model_Type::getBaseType","sdo-model-type.getbasetype","refentry"],["SDO_Model_Type::getName","sdo-model-type.getname","refentry"],["SDO_Model_Type::getNamespaceURI","sdo-model-type.getnamespaceuri","refentry"],["SDO_Model_Type::getProperties","sdo-model-type.getproperties","refentry"],["SDO_Model_Type::getProperty","sdo-model-type.getproperty","refentry"],["SDO_Model_Type::isAbstractType","sdo-model-type.isabstracttype","refentry"],["SDO_Model_Type::isDataType","sdo-model-type.isdatatype","refentry"],["SDO_Model_Type::isInstance","sdo-model-type.isinstance","refentry"],["SDO_Model_Type::isOpenType","sdo-model-type.isopentype","refentry"],["SDO_Model_Type::isSequencedType","sdo-model-type.issequencedtype","refentry"],["SDO_Sequence::getProperty","sdo-sequence.getproperty","refentry"],["SDO_Sequence::insert","sdo-sequence.insert","refentry"],["SDO_Sequence::move","sdo-sequence.move","refentry"],["","ref.sdo","reference"],["SDO","book.sdo","book"],["","intro.sdodasrel","procedure"],["","intro.sdodasrel","preface"],["","sdodasrel.requirements","section"],["","sdodasrel.installation","section"],["","sdodasrel.configuration","section"],["","sdodasrel.configuration","section"],["","sdodasrel.resources","section"],["","sdodasrel.setup","chapter"],["","sdodasrel.constants","appendix"],["","sdodasrel.examples-crud","section"],["","sdodasrel.metadata","section"],["","sdodasrel.metadata","section"],["","sdodasrel.metadata","section"],["","sdodasrel.metadata","section"],["","sdodasrel.metadata","section"],["","sdodasrel.examples.one-table","programlisting"],["","sdodasrel.examples.one-table","example"],["","sdodasrel.examples.one-table","programlisting"],["","sdodasrel.examples.one-table","example"],["","sdodasrel.examples.one-table","programlisting"],["","sdodasrel.examples.one-table","example"],["","sdodasrel.examples.one-table","programlisting"],["","sdodasrel.examples.one-table","example"],["","sdodasrel.examples.one-table","section"],["","sdodasrel.examples.two-table","programlisting"],["","sdodasrel.examples.two-table","example"],["","sdodasrel.examples.two-table","programlisting"],["","sdodasrel.examples.two-table","example"],["","sdodasrel.examples.two-table","programlisting"],["","sdodasrel.examples.two-table","programlisting"],["","sdodasrel.examples.two-table","programlisting"],["","sdodasrel.examples.two-table","example"],["","sdodasrel.examples.two-table","section"],["","sdodasrel.examples.three-table","programlisting"],["","sdodasrel.examples.three-table","example"],["","sdodasrel.examples.three-table","programlisting"],["","sdodasrel.examples.three-table","example"],["","sdodasrel.examples.three-table","programlisting"],["","sdodasrel.examples.three-table","example"],["","sdodasrel.examples.three-table","section"],["","sdodasrel.examples","chapter"],["","sdodasrel.limitations","chapter"],["","ref.sdodasrel","section"],["","ref.sdodasrel","section"],["","ref.sdodasrel","section"],["","ref.sdodasrel","section"],["","sdo-das-relational.applychanges","programlisting"],["SDO_DAS_Relational::applyChanges","sdo-das-relational.applychanges","refentry"],["SDO_DAS_Relational::__construct","sdo-das-relational.construct","refentry"],["SDO_DAS_Relational::createRootDataObject","sdo-das-relational.createrootdataobject","refentry"],["","sdo-das-relational.executepreparedquery","programlisting"],["","sdo-das-relational.executepreparedquery","programlisting"],["","sdo-das-relational.executepreparedquery","example"],["SDO_DAS_Relational::executePreparedQuery","sdo-das-relational.executepreparedquery","refentry"],["","sdo-das-relational.executequery","programlisting"],["SDO_DAS_Relational::executeQuery","sdo-das-relational.executequery","refentry"],["","ref.sdodasrel","reference"],["SDO-DAS-Relational","book.sdodasrel","book"],["","intro.sdo-das-xml","preface"],["","sdo-das-xml.requirements","section"],["","sdo-das-xml.installation","section"],["","sdo-das-xml.configuration","section"],["","sdo-das-xml.resources","section"],["","sdo-das-xml.setup","chapter"],["","sdo-das-xml.constants","appendix"],["","sdo-das-xml.examples","programlisting"],["","sdo-das-xml.examples","programlisting"],["","sdo-das-xml.examples","example"],["","sdo-das-xml.examples","programlisting"],["","sdo-das-xml.examples","example"],["","sdo-das-xml.examples","programlisting"],["","sdo-das-xml.examples","programlisting"],["","sdo-das-xml.examples","programlisting"],["","sdo-das-xml.examples","example"],["","sdo-das-xml.examples","programlisting"],["","sdo-das-xml.examples","example"],["","sdo-das-xml.examples","programlisting"],["","sdo-das-xml.examples","programlisting"],["","sdo-das-xml.examples","example"],["","sdo-das-xml.examples","programlisting"],["","sdo-das-xml.examples","programlisting"],["","sdo-das-xml.examples","example"],["","sdo-das-xml.examples","chapter"],["","ref.sdo-das-xml","section"],["","ref.sdo-das-xml","section"],["","ref.sdo-das-xml","section"],["","ref.sdo-das-xml","section"],["","ref.sdo-das-xml","section"],["","ref.sdo-das-xml","procedure"],["","ref.sdo-das-xml","procedure"],["","ref.sdo-das-xml","procedure"],["","ref.sdo-das-xml","procedure"],["","ref.sdo-das-xml","procedure"],["","ref.sdo-das-xml","section"],["SDO_DAS_XML::addTypes","sdo-das-xml.addtypes","refentry"],["SDO_DAS_XML::create","sdo-das-xml.create","refentry"],["SDO_DAS_XML::createDataObject","sdo-das-xml.createdataobject","refentry"],["SDO_DAS_XML::createDocument","sdo-das-xml.createdocument","refentry"],["SDO_DAS_XML::loadFile","sdo-das-xml.loadfile","refentry"],["SDO_DAS_XML::loadString","sdo-das-xml.loadstring","refentry"],["SDO_DAS_XML::saveFile","sdo-das-xml.savefile","refentry"],["SDO_DAS_XML::saveString","sdo-das-xml.savestring","refentry"],["SDO_DAS_XML_Document::getRootDataObject","sdo-das-xml-document.getrootdataobject","refentry"],["SDO_DAS_XML_Document::getRootElementName","sdo-das-xml-document.getrootelementname","refentry"],["SDO_DAS_XML_Document::getRootElementURI","sdo-das-xml-document.getrootelementuri","refentry"],["SDO_DAS_XML_Document::setEncoding","sdo-das-xml-document.setencoding","refentry"],["SDO_DAS_XML_Document::setXMLDeclaration","sdo-das-xml-document.setxmldeclaration","refentry"],["SDO_DAS_XML_Document::setXMLVersion","sdo-das-xml-document.setxmlversion","refentry"],["","ref.sdo-das-xml","reference"],["SDO DAS XML","book.sdo-das-xml","book"],["","intro.simplexml","preface"],["","simplexml.requirements","section"],["","simplexml.installation","section"],["","simplexml.configuration","section"],["","simplexml.resources","section"],["","simplexml.setup","chapter"],["","simplexml.constants","appendix"],["","simplexml.examples-basic","programlisting"],["","simplexml.examples-basic","example"],["","simplexml.examples-basic","example"],["","simplexml.examples-basic","example"],["","simplexml.examples-basic","example"],["","simplexml.examples-basic","example"],["","simplexml.examples-basic","example"],["","simplexml.examples-basic","example"],["","simplexml.examples-basic","example"],["","simplexml.examples-basic","example"],["","simplexml.examples-basic","example"],["","simplexml.examples-basic","example"],["","simplexml.examples-basic","section"],["","simplexml.examples-errors","programlisting"],["","simplexml.examples-errors","example"],["","simplexml.examples-errors","section"],["","simplexml.examples","chapter"],["","class.simplexmlelement","section"],["","class.simplexmlelement","section"],["","simplexmlelement.addattribute","example"],["SimpleXMLElement::addAttribute","simplexmlelement.addattribute","refentry"],["","simplexmlelement.addchild","example"],["SimpleXMLElement::addChild","simplexmlelement.addchild","refentry"],["","simplexmlelement.asxml","example"],["","simplexmlelement.asxml","example"],["SimpleXMLElement::asXML","simplexmlelement.asxml","refentry"],["","simplexmlelement.attributes","example"],["SimpleXMLElement::attributes","simplexmlelement.attributes","refentry"],["","simplexmlelement.children","example"],["","simplexmlelement.children","example"],["SimpleXMLElement::children","simplexmlelement.children","refentry"],["","simplexmlelement.construct","example"],["","simplexmlelement.construct","example"],["SimpleXMLElement::__construct","simplexmlelement.construct","refentry"],["","simplexmlelement.count","example"],["SimpleXMLElement::count","simplexmlelement.count","refentry"],["","simplexmlelement.getdocnamespaces","example"],["","simplexmlelement.getdocnamespaces","example"],["SimpleXMLElement::getDocNamespaces","simplexmlelement.getdocnamespaces","refentry"],["","simplexmlelement.getname","example"],["SimpleXMLElement::getName","simplexmlelement.getname","refentry"],["","simplexmlelement.getnamespaces","example"],["SimpleXMLElement::getNamespaces","simplexmlelement.getnamespaces","refentry"],["","simplexmlelement.registerxpathnamespace","example"],["SimpleXMLElement::registerXPathNamespace","simplexmlelement.registerxpathnamespace","refentry"],["SimpleXMLElement::saveXML","simplexmlelement.savexml","refentry"],["","simplexmlelement.tostring","example"],["SimpleXMLElement::__toString","simplexmlelement.tostring","refentry"],["","simplexmlelement.xpath","example"],["SimpleXMLElement::xpath","simplexmlelement.xpath","refentry"],["SimpleXMLElement","class.simplexmlelement","phpdoc:classref"],["","class.simplexmliterator","section"],["","class.simplexmliterator","section"],["","simplexmliterator.current","example"],["SimpleXMLIterator::current","simplexmliterator.current","refentry"],["","simplexmliterator.getchildren","example"],["SimpleXMLIterator::getChildren","simplexmliterator.getchildren","refentry"],["","simplexmliterator.haschildren","example"],["SimpleXMLIterator::hasChildren","simplexmliterator.haschildren","refentry"],["","simplexmliterator.key","example"],["SimpleXMLIterator::key","simplexmliterator.key","refentry"],["","simplexmliterator.next","example"],["SimpleXMLIterator::next","simplexmliterator.next","refentry"],["","simplexmliterator.rewind","example"],["SimpleXMLIterator::rewind","simplexmliterator.rewind","refentry"],["","simplexmliterator.valid","example"],["SimpleXMLIterator::valid","simplexmliterator.valid","refentry"],["SimpleXMLIterator","class.simplexmliterator","phpdoc:classref"],["","function.simplexml-import-dom","example"],["simplexml_import_dom","function.simplexml-import-dom","refentry"],["","function.simplexml-load-file","example"],["simplexml_load_file","function.simplexml-load-file","refentry"],["","function.simplexml-load-string","example"],["simplexml_load_string","function.simplexml-load-string","refentry"],["","ref.simplexml","reference"],["","book.simplexml","book"],["","intro.wddx","preface"],["","wddx.requirements","section"],["","wddx.installation","section"],["","wddx.configuration","section"],["","wddx.resources","section"],["","wddx.setup","chapter"],["","wddx.constants","appendix"],["","wddx.examples-serialize","example"],["","wddx.examples-serialize","example"],["","wddx.examples-serialize","section"],["","wddx.examples","chapter"],["wddx_add_vars","function.wddx-add-vars","refentry"],["wddx_deserialize","function.wddx-deserialize","refentry"],["wddx_packet_end","function.wddx-packet-end","refentry"],["wddx_packet_start","function.wddx-packet-start","refentry"],["wddx_serialize_value","function.wddx-serialize-value","refentry"],["","function.wddx-serialize-vars","example"],["wddx_serialize_vars","function.wddx-serialize-vars","refentry"],["","ref.wddx","reference"],["","book.wddx","book"],["","intro.xmldiff","preface"],["","xmldiff.requirements","section"],["","xmldiff.installation","section"],["","xmldiff.setup","chapter"],["","class.xmldiff-base","section"],["","class.xmldiff-base","section"],["XMLDiff\\Base::__construct","xmldiff-base.construct","refentry"],["XMLDiff\\Base::diff","xmldiff-base.diff","refentry"],["XMLDiff\\Base::merge","xmldiff-base.merge","refentry"],["XMLDiff\\Base","class.xmldiff-base","phpdoc:classref"],["","class.xmldiff-dom","section"],["","class.xmldiff-dom","section"],["XMLDiff\\DOM::diff","xmldiff-dom.diff","refentry"],["XMLDiff\\DOM::merge","xmldiff-dom.merge","refentry"],["XMLDiff\\DOM","class.xmldiff-dom","phpdoc:classref"],["","class.xmldiff-memory","section"],["","class.xmldiff-memory","section"],["XMLDiff\\Memory::diff","xmldiff-memory.diff","refentry"],["XMLDiff\\Memory::merge","xmldiff-memory.merge","refentry"],["XMLDiff\\Memory","class.xmldiff-memory","phpdoc:classref"],["","class.xmldiff-file","section"],["","class.xmldiff-file","section"],["XMLDiff\\File::diff","xmldiff-file.diff","refentry"],["XMLDiff\\File::merge","xmldiff-file.merge","refentry"],["XMLDiff\\File","class.xmldiff-file","phpdoc:classref"],["XMLDiff","book.xmldiff","book"],["","intro.xml","preface"],["","xml.requirements","section"],["","xml.installation","section"],["","xml.configuration","section"],["","xml.resources","section"],["","xml.setup","chapter"],["","xml.constants","varlistentry"],["","xml.constants","varlistentry"],["","xml.constants","varlistentry"],["","xml.constants","varlistentry"],["","xml.constants","varlistentry"],["","xml.constants","varlistentry"],["","xml.constants","varlistentry"],["","xml.constants","varlistentry"],["","xml.constants","varlistentry"],["","xml.constants","varlistentry"],["","xml.constants","varlistentry"],["","xml.constants","varlistentry"],["","xml.constants","varlistentry"],["","xml.constants","varlistentry"],["","xml.constants","varlistentry"],["","xml.constants","varlistentry"],["","xml.constants","varlistentry"],["","xml.constants","varlistentry"],["","xml.constants","varlistentry"],["","xml.constants","varlistentry"],["","xml.constants","varlistentry"],["","xml.constants","varlistentry"],["","xml.constants","varlistentry"],["","xml.constants","varlistentry"],["","xml.constants","varlistentry"],["","xml.constants","varlistentry"],["","xml.constants","varlistentry"],["","xml.constants","appendix"],["","xml.eventhandlers","article"],["","xml.case-folding","article"],["","xml.error-codes","article"],["","xml.encoding","article"],["","example.xml-structure","example"],["","example.xml-structure","section"],["","example.xml-map-tags","example"],["","example.xml-map-tags","section"],["","example.xml-external-entity","example"],["","example.xml-external-entity","example"],["","example.xml-external-entity","example"],["","example.xml-external-entity","section"],["","xml.examples","chapter"],["utf8_decode","function.utf8-decode","refentry"],["utf8_encode","function.utf8-encode","refentry"],["xml_error_string","function.xml-error-string","refentry"],["xml_get_current_byte_index","function.xml-get-current-byte-index","refentry"],["xml_get_current_column_number","function.xml-get-current-column-number","refentry"],["xml_get_current_line_number","function.xml-get-current-line-number","refentry"],["xml_get_error_code","function.xml-get-error-code","refentry"],["","function.xml-parse-into-struct","example"],["","function.xml-parse-into-struct","example"],["","function.xml-parse-into-struct","example"],["xml_parse_into_struct","function.xml-parse-into-struct","refentry"],["xml_parse","function.xml-parse","refentry"],["xml_parser_create_ns","function.xml-parser-create-ns","refentry"],["xml_parser_create","function.xml-parser-create","refentry"],["xml_parser_free","function.xml-parser-free","refentry"],["xml_parser_get_option","function.xml-parser-get-option","refentry"],["xml_parser_set_option","function.xml-parser-set-option","refentry"],["xml_set_character_data_handler","function.xml-set-character-data-handler","refentry"],["xml_set_default_handler","function.xml-set-default-handler","refentry"],["xml_set_element_handler","function.xml-set-element-handler","refentry"],["xml_set_end_namespace_decl_handler","function.xml-set-end-namespace-decl-handler","refentry"],["xml_set_external_entity_ref_handler","function.xml-set-external-entity-ref-handler","refentry"],["xml_set_notation_decl_handler","function.xml-set-notation-decl-handler","refentry"],["","function.xml-set-object","example"],["xml_set_object","function.xml-set-object","refentry"],["xml_set_processing_instruction_handler","function.xml-set-processing-instruction-handler","refentry"],["xml_set_start_namespace_decl_handler","function.xml-set-start-namespace-decl-handler","refentry"],["xml_set_unparsed_entity_decl_handler","function.xml-set-unparsed-entity-decl-handler","refentry"],["","ref.xml","reference"],["","book.xml","book"],["","intro.xmlreader","section"],["","intro.xmlreader","preface"],["","xmlreader.requirements","section"],["","xmlreader.installation","section"],["","xmlreader.configuration","section"],["","xmlreader.resources","section"],["","xmlreader.setup","chapter"],["","class.xmlreader","section"],["","class.xmlreader","section"],["","class.xmlreader","varlistentry"],["","class.xmlreader","varlistentry"],["","class.xmlreader","varlistentry"],["","class.xmlreader","varlistentry"],["","class.xmlreader","varlistentry"],["","class.xmlreader","varlistentry"],["","class.xmlreader","varlistentry"],["","class.xmlreader","varlistentry"],["","class.xmlreader","varlistentry"],["","class.xmlreader","varlistentry"],["","class.xmlreader","varlistentry"],["","class.xmlreader","varlistentry"],["","class.xmlreader","varlistentry"],["","class.xmlreader","varlistentry"],["","class.xmlreader","section"],["","class.xmlreader","varlistentry"],["","class.xmlreader","varlistentry"],["","class.xmlreader","varlistentry"],["","class.xmlreader","varlistentry"],["","class.xmlreader","varlistentry"],["","class.xmlreader","varlistentry"],["","class.xmlreader","varlistentry"],["","class.xmlreader","varlistentry"],["","class.xmlreader","varlistentry"],["","class.xmlreader","varlistentry"],["","class.xmlreader","varlistentry"],["","class.xmlreader","varlistentry"],["","class.xmlreader","varlistentry"],["","class.xmlreader","varlistentry"],["","class.xmlreader","varlistentry"],["","class.xmlreader","varlistentry"],["","class.xmlreader","varlistentry"],["","class.xmlreader","varlistentry"],["","class.xmlreader","section"],["","class.xmlreader","varlistentry"],["","class.xmlreader","varlistentry"],["","class.xmlreader","varlistentry"],["","class.xmlreader","varlistentry"],["","class.xmlreader","section"],["","class.xmlreader","section"],["XMLReader::close","xmlreader.close","refentry"],["XMLReader::expand","xmlreader.expand","refentry"],["XMLReader::getAttribute","xmlreader.getattribute","refentry"],["XMLReader::getAttributeNo","xmlreader.getattributeno","refentry"],["XMLReader::getAttributeNs","xmlreader.getattributens","refentry"],["XMLReader::getParserProperty","xmlreader.getparserproperty","refentry"],["","xmlreader.isvalid","example"],["XMLReader::isValid","xmlreader.isvalid","refentry"],["XMLReader::lookupNamespace","xmlreader.lookupnamespace","refentry"],["XMLReader::moveToAttribute","xmlreader.movetoattribute","refentry"],["XMLReader::moveToAttributeNo","xmlreader.movetoattributeno","refentry"],["XMLReader::moveToAttributeNs","xmlreader.movetoattributens","refentry"],["XMLReader::moveToElement","xmlreader.movetoelement","refentry"],["XMLReader::moveToFirstAttribute","xmlreader.movetofirstattribute","refentry"],["XMLReader::moveToNextAttribute","xmlreader.movetonextattribute","refentry"],["XMLReader::next","xmlreader.next","refentry"],["XMLReader::open","xmlreader.open","refentry"],["XMLReader::read","xmlreader.read","refentry"],["XMLReader::readInnerXML","xmlreader.readinnerxml","refentry"],["XMLReader::readOuterXML","xmlreader.readouterxml","refentry"],["XMLReader::readString","xmlreader.readstring","refentry"],["XMLReader::setParserProperty","xmlreader.setparserproperty","refentry"],["XMLReader::setRelaxNGSchema","xmlreader.setrelaxngschema","refentry"],["XMLReader::setRelaxNGSchemaSource","xmlreader.setrelaxngschemasource","refentry"],["XMLReader::setSchema","xmlreader.setschema","refentry"],["XMLReader::XML","xmlreader.xml","refentry"],["XMLReader","class.xmlreader","phpdoc:classref"],["","book.xmlreader","book"],["","intro.xmlwriter","preface"],["","xmlwriter.requirements","section"],["","xmlwriter.installation","section"],["","xmlwriter.configuration","section"],["","xmlwriter.resources","section"],["","xmlwriter.setup","chapter"],["","xmlwriter.constants","appendix"],["XMLWriter::endAttribute","function.xmlwriter-end-attribute","refentry"],["XMLWriter::endCData","function.xmlwriter-end-cdata","refentry"],["XMLWriter::endComment","function.xmlwriter-end-comment","refentry"],["XMLWriter::endDocument","function.xmlwriter-end-document","refentry"],["XMLWriter::endDTDAttlist","function.xmlwriter-end-dtd-attlist","refentry"],["XMLWriter::endDTDElement","function.xmlwriter-end-dtd-element","refentry"],["XMLWriter::endDTDEntity","function.xmlwriter-end-dtd-entity","refentry"],["XMLWriter::endDTD","function.xmlwriter-end-dtd","refentry"],["XMLWriter::endElement","function.xmlwriter-end-element","refentry"],["XMLWriter::endPI","function.xmlwriter-end-pi","refentry"],["XMLWriter::flush","function.xmlwriter-flush","refentry"],["XMLWriter::fullEndElement","function.xmlwriter-full-end-element","refentry"],["XMLWriter::openMemory","function.xmlwriter-open-memory","refentry"],["XMLWriter::openURI","function.xmlwriter-open-uri","refentry"],["XMLWriter::outputMemory","function.xmlwriter-output-memory","refentry"],["XMLWriter::setIndentString","function.xmlwriter-set-indent-string","refentry"],["XMLWriter::setIndent","function.xmlwriter-set-indent","refentry"],["XMLWriter::startAttributeNS","function.xmlwriter-start-attribute-ns","refentry"],["XMLWriter::startAttribute","function.xmlwriter-start-attribute","refentry"],["XMLWriter::startCData","function.xmlwriter-start-cdata","refentry"],["XMLWriter::startComment","function.xmlwriter-start-comment","refentry"],["XMLWriter::startDocument","function.xmlwriter-start-document","refentry"],["XMLWriter::startDTDAttlist","function.xmlwriter-start-dtd-attlist","refentry"],["XMLWriter::startDTDElement","function.xmlwriter-start-dtd-element","refentry"],["XMLWriter::startDTDEntity","function.xmlwriter-start-dtd-entity","refentry"],["XMLWriter::startDTD","function.xmlwriter-start-dtd","refentry"],["XMLWriter::startElementNS","function.xmlwriter-start-element-ns","refentry"],["XMLWriter::startElement","function.xmlwriter-start-element","refentry"],["XMLWriter::startPI","function.xmlwriter-start-pi","refentry"],["XMLWriter::text","function.xmlwriter-text","refentry"],["XMLWriter::writeAttributeNS","function.xmlwriter-write-attribute-ns","refentry"],["XMLWriter::writeAttribute","function.xmlwriter-write-attribute","refentry"],["XMLWriter::writeCData","function.xmlwriter-write-cdata","refentry"],["XMLWriter::writeComment","function.xmlwriter-write-comment","refentry"],["XMLWriter::writeDTDAttlist","function.xmlwriter-write-dtd-attlist","refentry"],["XMLWriter::writeDTDElement","function.xmlwriter-write-dtd-element","refentry"],["XMLWriter::writeDTDEntity","function.xmlwriter-write-dtd-entity","refentry"],["XMLWriter::writeDTD","function.xmlwriter-write-dtd","refentry"],["XMLWriter::writeElementNS","function.xmlwriter-write-element-ns","refentry"],["XMLWriter::writeElement","function.xmlwriter-write-element","refentry"],["XMLWriter::writePI","function.xmlwriter-write-pi","refentry"],["XMLWriter::writeRaw","function.xmlwriter-write-raw","refentry"],["","ref.xmlwriter","reference"],["","book.xmlwriter","book"],["","intro.xsl","preface"],["","xsl.requirements","section"],["","xsl.installation","section"],["","xsl.configuration","section"],["","xsl.resources","section"],["","xsl.setup","chapter"],["","xsl.constants","varlistentry"],["","xsl.constants","varlistentry"],["","xsl.constants","varlistentry"],["","xsl.constants","varlistentry"],["","xsl.constants","varlistentry"],["","xsl.constants","varlistentry"],["","xsl.constants","varlistentry"],["","xsl.constants","varlistentry"],["","xsl.constants","varlistentry"],["","xsl.constants","varlistentry"],["","xsl.constants","varlistentry"],["","xsl.constants","varlistentry"],["","xsl.constants","appendix"],["","xsl.examples-collection","example"],["","xsl.examples-collection","example"],["","xsl.examples-collection","section"],["","xsl.examples","chapter"],["","class.xsltprocessor","section"],["","class.xsltprocessor","section"],["","xsltprocessor.construct","example"],["XSLTProcessor::__construct","xsltprocessor.construct","refentry"],["XSLTProcessor::getParameter","xsltprocessor.getparameter","refentry"],["XsltProcessor::getSecurityPrefs","xsltprocessor.getsecurityprefs","refentry"],["","xsltprocessor.hasexsltsupport","example"],["XSLTProcessor::hasExsltSupport","xsltprocessor.hasexsltsupport","refentry"],["XSLTProcessor::importStylesheet","xsltprocessor.importstylesheet","refentry"],["","xsltprocessor.registerphpfunctions","example"],["XSLTProcessor::registerPHPFunctions","xsltprocessor.registerphpfunctions","refentry"],["XSLTProcessor::removeParameter","xsltprocessor.removeparameter","refentry"],["","xsltprocessor.setparameter","example"],["XSLTProcessor::setParameter","xsltprocessor.setparameter","refentry"],["","xsltprocessor.setprofiling","example"],["XSLTProcessor::setProfiling","xsltprocessor.setprofiling","refentry"],["XsltProcessor::setSecurityPrefs","xsltprocessor.setsecurityprefs","refentry"],["","xsltprocessor.transformtodoc","example"],["XSLTProcessor::transformToDoc","xsltprocessor.transformtodoc","refentry"],["","xsltprocessor.transformtouri","example"],["XSLTProcessor::transformToUri","xsltprocessor.transformtouri","refentry"],["","xsltprocessor.transformtoxml","example"],["XSLTProcessor::transformToXML","xsltprocessor.transformtoxml","refentry"],["XSLTProcessor","class.xsltprocessor","phpdoc:classref"],["","book.xsl","book"],["","intro.xslt","preface"],["","xslt.requirements","section"],["","xslt.installation","section"],["","xslt.configuration","section"],["","xslt.resources","section"],["","xslt.setup","chapter"],["","xslt.constants","varlistentry"],["","xslt.constants","varlistentry"],["","xslt.constants","varlistentry"],["","xslt.constants","varlistentry"],["","xslt.constants","varlistentry"],["","xslt.constants","varlistentry"],["","xslt.constants","varlistentry"],["","xslt.constants","appendix"],["xslt_backend_info","function.xslt-backend-info","refentry"],["","function.xslt-backend-name","example"],["xslt_backend_name","function.xslt-backend-name","refentry"],["","function.xslt-backend-version","example"],["xslt_backend_version","function.xslt-backend-version","refentry"],["","function.xslt-create","example"],["xslt_create","function.xslt-create","refentry"],["xslt_errno","function.xslt-errno","refentry"],["","function.xslt-error","example"],["xslt_error","function.xslt-error","refentry"],["xslt_free","function.xslt-free","refentry"],["xslt_getopt","function.xslt-getopt","refentry"],["","function.xslt-process","example"],["","function.xslt-process","example"],["","function.xslt-process","example"],["","function.xslt-process","example"],["xslt_process","function.xslt-process","refentry"],["xslt_set_base","function.xslt-set-base","refentry"],["xslt_set_encoding","function.xslt-set-encoding","refentry"],["","function.xslt-set-error-handler","example"],["xslt_set_error_handler","function.xslt-set-error-handler","refentry"],["","function.xslt-set-log","example"],["xslt_set_log","function.xslt-set-log","refentry"],["","function.xslt-set-object","example"],["xslt_set_object","function.xslt-set-object","refentry"],["xslt_set_sax_handler","function.xslt-set-sax-handler","refentry"],["","function.xslt-set-sax-handlers","example"],["","function.xslt-set-sax-handlers","example"],["xslt_set_sax_handlers","function.xslt-set-sax-handlers","refentry"],["xslt_set_scheme_handler","function.xslt-set-scheme-handler","refentry"],["","function.xslt-set-scheme-handlers","example"],["xslt_set_scheme_handlers","function.xslt-set-scheme-handlers","refentry"],["","function.xslt-setopt","example"],["xslt_setopt","function.xslt-setopt","refentry"],["","ref.xslt","reference"],["","book.xslt","book"],["","refs.xml","set"],["","phpfuncref","set"],["","security.intro","chapter"],["","security.general","chapter"],["","security.cgi-bin.attacks","sect1"],["","security.cgi-bin.default","sect1"],["","security.cgi-bin.force-redirect","sect1"],["","security.cgi-bin.doc-root","sect1"],["","security.cgi-bin.shell","sect1"],["","security.cgi-bin","chapter"],["","security.apache","chapter"],["","security.filesystem","example"],["","security.filesystem","example"],["","security.filesystem","example"],["","security.filesystem","example"],["","security.filesystem.nullbytes","example"],["","security.filesystem.nullbytes","example"],["","security.filesystem.nullbytes","sect1"],["","security.filesystem","chapter"],["","security.database.design","sect1"],["","security.database.connection","sect1"],["","security.database.storage","example"],["","security.database.storage","sect1"],["","security.database.sql-injection","example"],["","security.database.sql-injection","example"],["","security.database.sql-injection","example"],["","security.database.sql-injection","example"],["","security.database.sql-injection","example"],["","security.database.sql-injection","sect2"],["","security.database.sql-injection","sect1"],["","security.database","chapter"],["","security.errors","example"],["","security.errors","example"],["","security.errors","example"],["","security.errors","chapter"],["","security.globals","example"],["","security.globals","example"],["","security.globals","example"],["","security.globals","chapter"],["","security.variables","example"],["","security.variables","chapter"],["","security.magicquotes.what","sect1"],["","security.magicquotes.why","sect1"],["","security.magicquotes.whynot","sect1"],["","security.magicquotes.disabling","example"],["","security.magicquotes.disabling","example"],["","security.magicquotes.disabling","sect1"],["","security.magicquotes","chapter"],["","security.hiding","example"],["","security.hiding","example"],["","security.hiding","example"],["","security.hiding","chapter"],["","security.current","chapter"],["","security","book"],["","features.http-auth","example"],["","features.http-auth","example"],["","features.http-auth","example"],["","features.http-auth","chapter"],["","features.cookies","chapter"],["","features.sessions","chapter"],["","features.xforms","example"],["","features.xforms","example"],["","features.xforms","chapter"],["","features.file-upload.post-method","example"],["","features.file-upload.post-method","example"],["","features.file-upload.post-method","example"],["","features.file-upload.post-method","sect1"],["","features.file-upload.errors","sect1"],["","features.file-upload.common-pitfalls","sect1"],["","features.file-upload.multiple","example"],["","features.file-upload.multiple","sect1"],["","features.file-upload.put-method","example"],["","features.file-upload.put-method","sect1"],["","features.file-upload","chapter"],["","features.remote-files","example"],["","features.remote-files","example"],["","features.remote-files","chapter"],["","features.connection-handling","chapter"],["","features.persistent-connections","chapter"],["","features.commandline.introduction","section"],["","features.commandline.differences","example"],["","features.commandline.differences","section"],["","features.commandline.options","example"],["","features.commandline.options","example"],["","features.commandline.options","example"],["","features.commandline.options","example"],["","features.commandline.options","example"],["","features.commandline.options","example"],["","features.commandline.options","example"],["","features.commandline.options","example"],["","features.commandline.options","example"],["","features.commandline.options","example"],["","features.commandline.options","example"],["Options","features.commandline.options","section"],["","features.commandline.usage","example"],["","features.commandline.usage","example"],["","features.commandline.usage","example"],["Usage","features.commandline.usage","section"],["I\/O streams","features.commandline.io-streams","section"],["","features.commandline.interactive","example"],["","features.commandline.interactive","example"],["","features.commandline.interactive","example"],["","features.commandline.interactive","section"],["","features.commandline.webserver","example"],["","features.commandline.webserver","example"],["","features.commandline.webserver","example"],["","features.commandline.webserver","example"],["","features.commandline.webserver","example"],["","features.commandline.webserver","example"],["","features.commandline.webserver","section"],["","features.commandline.ini","varlistentry"],["","features.commandline.ini","section"],["Command line usage","features.commandline","chapter"],["","features.gc.refcounting-basics","example"],["","features.gc.refcounting-basics","example"],["","features.gc.refcounting-basics","example"],["","features.gc.refcounting-basics","example"],["","features.gc.refcounting-basics","example"],["","features.gc.refcounting-basics","example"],["","features.gc.refcounting-basics","example"],["","features.gc.refcounting-basics","example"],["","features.gc.refcounting-basics","example"],["","features.gc.refcounting-basics","sect2"],["","features.gc.refcounting-basics","sect2"],["","features.gc.refcounting-basics","sect1"],["","features.gc.collecting-cycles","sect1"],["","features.gc.performance-considerations","example"],["","features.gc.performance-considerations","sect2"],["","features.gc.performance-considerations","example"],["","features.gc.performance-considerations","example"],["","features.gc.performance-considerations","sect2"],["","features.gc.performance-considerations","example"],["","features.gc.performance-considerations","example"],["","features.gc.performance-considerations","sect2"],["","features.gc.performance-considerations","sect2"],["","features.gc.performance-considerations","sect1"],["","features.gc","chapter"],["","features.dtrace.introduction","sect1"],["","features.dtrace.dtrace","sect2"],["","features.dtrace.dtrace","sect2"],["","features.dtrace.dtrace","sect2"],["","features.dtrace.dtrace","example"],["","features.dtrace.dtrace","sect2"],["","features.dtrace.dtrace","sect2"],["","features.dtrace.dtrace","sect1"],["","features.dtrace.systemtap","sect2"],["","features.dtrace.systemtap","sect2"],["","features.dtrace.systemtap","example"],["","features.dtrace.systemtap","sect2"],["","features.dtrace.systemtap","sect1"],["","features.dtrace","chapter"],["","features","book"],["","history","appendix"],["","phpoverview.intro","sect1"],["","phpoverview.phptag","sect1"],["","phpoverview.requireonce","sect1"],["","phpoverview.variables","sect1"],["","phpoverview.controlflow","sect1"],["","phpoverview.arrays","sect1"],["","phpoverview.functions","sect1"],["","phpoverview.classes","sect1"],["","phpoverview.traits","sect1"],["","phpoverview.closures","sect2"],["","phpoverview.closures","sect2"],["","phpoverview.closures","sect2"],["","phpoverview.closures","sect2"],["","phpoverview.closures","sect1"],["","phpoverview.objectaccess","sect1"],["","phpoverview.copyonwrite","sect1"],["","phpoverview.other","sect1"],["","phpoverview","appendix"],["","migrationhhvm.differences","sect1"],["","migrationhhvm","appendix"],["","debugger.about","sect1"],["","debugger","appendix"],["","ini.list","section"],["","ini.sections","example"],["","ini.sections","varlistentry"],["","ini.sections","example"],["","ini.sections","varlistentry"],["","ini.sections","section"],["","ini.core","section"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","section"],["","ini.core","varlistentry"],["","ini.core","section"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","section"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","section"],["","ini.core","example"],["","ini.core","example"],["","ini.core","example"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","section"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","varlistentry"],["","ini.core","section"],["","ini.core","varlistentry"],["","ini.core","section"],["","ini.core","varlistentry"],["","ini.core","section"],["","ini.core","section"],["","ini","appendix"],["","extensions.alphabetical","section"],["","extensions.membership","section"],["","extensions.membership","section"],["","extensions.membership","section"],["","extensions.membership","section"],["","extensions.membership","section"],["","extensions.state","section"],["","extensions.state","section"],["","extensions.state","section"],["","extensions","appendix"],["","reserved.keywords","sect1"],["","reserved.classes","sect2"],["","reserved.classes","sect2"],["","reserved.classes","sect2"],["","reserved.classes","sect2"],["","reserved.classes","sect2"],["","reserved.classes","sect1"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","varlistentry"],["","reserved.constants","sect2"],["","reserved.constants","sect2"],["","reserved.constants","sect1"],["","reserved","appendix"],["","resource","appendix"],["","filters.string","example"],["","filters.string","example"],["","filters.string","example"],["","filters.string","example"],["","filters.string","section"],["","filters.convert","example"],["","filters.convert","example"],["","filters.convert","section"],["","filters.compression","example"],["","filters.compression","example"],["","filters.compression","example"],["","filters.compression","section"],["","filters.encryption","example"],["","filters.encryption","example"],["","filters.encryption","section"],["","filters","appendix"],["","transports.inet","section"],["","transports.unix","section"],["","transports","appendix"],["","types.comparisons","table"],["","types.comparisons","table"],["","types.comparisons","appendix"],["","tokens","appendix"],["","userlandnaming.globalnamespace","section"],["","userlandnaming.rules","section"],["","userlandnaming.tips","section"],["","userlandnaming","appendix"],["","about.origin","sect1"],["","about.formats","sect1"],["","about.notes","sect1"],["","about.prototypes","sect1"],["","about.howtohelp","sect1"],["","about.generate","sect1"],["","about","appendix"],["","cc.license","appendix"],["","tutorial.requirements","section"],["","tutorial.firstpage","example"],["","tutorial.firstpage","section"],["","tutorial.useful","example"],["","tutorial.useful","example"],["","tutorial.useful","example"],["","tutorial.useful","section"],["","tutorial.forms","example"],["","tutorial.forms","example"],["","tutorial.forms","section"],["","appendices.tutorial","chapter"],["","indexes.functions","section"],["","indexes.examples","section"],["","indexes","appendix"],["","configuration.file","example"],["","configuration.file","example"],["","configuration.file","sect1"],["","configuration.changes.modes","sect1"],["","configuration.changes","sect2"],["","configuration.changes","sect1"],["","configuration.zend.compat","sect1"],["","configuration","chapter"],["","install.extensions.intro","sect1"],["","install.extensions","chapter"],["","install.hack.bootstrapping","sect2"],["","install.hack.bootstrapping","sect2"],["","install.hack.bootstrapping","sect2"],["","install.hack.bootstrapping","sect2"],["","install.hack.bootstrapping","sect2"],["","install.hack.bootstrapping","sect1"],["","install.hack.conversion","sect3"],["","install.hack.conversion","sect3"],["","install.hack.conversion","sect2"],["","install.hack.conversion","sect2"],["","install.hack.conversion","sect2"],["","install.hack.conversion","sect1"],["","install.hack.h2tp","sect2"],["","install.hack.h2tp","sect2"],["","install.hack.h2tp","sect2"],["","install.hack.h2tp","sect2"],["","install.hack.h2tp","sect3"],["","install.hack.h2tp","sect3"],["","install.hack.h2tp","sect3"],["","install.hack.h2tp","sect2"],["","install.hack.h2tp","sect1"],["","install.hack","chapter"],["","install.xhp","chapter"],["","appendices","book"],["","index","set"]] \ No newline at end of file diff --git a/main.tf b/main.tf new file mode 100644 index 000000000..d5270083b --- /dev/null +++ b/main.tf @@ -0,0 +1,55 @@ +provider "random" {} + +module "networking" { + source = "cn-terraform/networking/aws" + version = "2.0.15" + name_prefix = "docs-${terraform.workspace}" + vpc_cidr_block = "192.168.0.0/16" + availability_zones = ["us-west-2a", "us-west-2b", "us-west-2c", "us-west-2d"] + public_subnets_cidrs_per_availability_zone = ["192.168.0.0/19", "192.168.32.0/19", "192.168.64.0/19", "192.168.96.0/19"] + private_subnets_cidrs_per_availability_zone = ["192.168.128.0/19", "192.168.160.0/19", "192.168.192.0/19", "192.168.224.0/19"] + single_nat = true +} + +module "ecs-fargate" { + source = "cn-terraform/ecs-fargate/aws" + version = "2.0.43" + + name_prefix = "docs-${terraform.workspace}" + vpc_id = module.networking.vpc_id + public_subnets_ids = module.networking.public_subnets_ids + private_subnets_ids = module.networking.private_subnets_ids + container_name = "docs-${terraform.workspace}" + container_image = var.container_image + container_cpu = 256 + container_memory = 2048 + container_memory_reservation = null + + enable_s3_logs = false + + default_certificate_arn = "arn:aws:acm:us-west-2:223121549624:certificate/8f845b56-937f-49b8-adf4-64b69a3caf57" + + lb_https_ports = { + forward_https_to_http = { + listener_port = 443 + target_group_port = 80 + target_group_protocol = "HTTP" + } + } + + log_configuration = { + logDriver = "awslogs" + options = { + "awslogs-region" = "us-west-2" + "awslogs-group" = "/ecs/service/docs-${terraform.workspace}" + "awslogs-stream-prefix" = "ecs" + } + secretOptions = null + } +} + +module "aws_cw_logs" { + source = "cn-terraform/cloudwatch-logs/aws" + version = "1.0.10" + logs_path = "/ecs/service/docs-${terraform.workspace}" +} diff --git a/outputs.tf b/outputs.tf new file mode 100644 index 000000000..8308e42ae --- /dev/null +++ b/outputs.tf @@ -0,0 +1,4 @@ +output "aws_lb_lb_dns_name" { + description = "The DNS name of the load balancer." + value = module.ecs-fargate.aws_lb_lb_dns_name +} diff --git a/public/css/main.css b/public/css/main.css deleted file mode 120000 index 34f92db82..000000000 --- a/public/css/main.css +++ /dev/null @@ -1 +0,0 @@ -../../build/final/main.css \ No newline at end of file diff --git a/public/favicon.png b/public/favicon.png deleted file mode 100644 index b20fbda5f..000000000 Binary files a/public/favicon.png and /dev/null differ diff --git a/public/fonts/fontawesome-free-5.15.4-web b/public/fonts/fontawesome-free-5.15.4-web deleted file mode 120000 index e879583ea..000000000 --- a/public/fonts/fontawesome-free-5.15.4-web +++ /dev/null @@ -1 +0,0 @@ -../../build/final/fontawesome-free-5.15.4-web/webfonts \ No newline at end of file diff --git a/public/hack_logo_medium.png b/public/hack_logo_medium.png deleted file mode 100644 index 28aad99cf..000000000 Binary files a/public/hack_logo_medium.png and /dev/null differ diff --git a/public/images/async/async-always-busy.png b/public/images/async/async-always-busy.png deleted file mode 100644 index d45126243..000000000 Binary files a/public/images/async/async-always-busy.png and /dev/null differ diff --git a/public/images/async/async-dependency.png b/public/images/async/async-dependency.png deleted file mode 100644 index fae160df0..000000000 Binary files a/public/images/async/async-dependency.png and /dev/null differ diff --git a/public/images/async/async-sequential.png b/public/images/async/async-sequential.png deleted file mode 100644 index 7156c824e..000000000 Binary files a/public/images/async/async-sequential.png and /dev/null differ diff --git a/public/images/async/async-slow-curl.png b/public/images/async/async-slow-curl.png deleted file mode 100644 index cb46aae2c..000000000 Binary files a/public/images/async/async-slow-curl.png and /dev/null differ diff --git a/public/images/async/curl-async.png b/public/images/async/curl-async.png deleted file mode 100644 index 1d33abfd4..000000000 Binary files a/public/images/async/curl-async.png and /dev/null differ diff --git a/public/images/async/curl-synchronous.png b/public/images/async/curl-synchronous.png deleted file mode 100644 index 0f8d3c641..000000000 Binary files a/public/images/async/curl-synchronous.png and /dev/null differ diff --git a/public/images/async/limitations.png b/public/images/async/limitations.png deleted file mode 100644 index dfac05af8..000000000 Binary files a/public/images/async/limitations.png and /dev/null differ diff --git a/public/images/async/source.graffle b/public/images/async/source.graffle deleted file mode 100644 index 391bef897..000000000 Binary files a/public/images/async/source.graffle and /dev/null differ diff --git a/public/index.php b/public/index.php deleted file mode 100644 index 6bdae22c7..000000000 --- a/public/index.php +++ /dev/null @@ -1,40 +0,0 @@ -<?hh // strict - -use namespace HH\Lib\Str; - -<<__EntryPoint>> -async function site_main_async(): Awaitable<void> { - require_once(__DIR__.'/../vendor/autoload.hack'); - \Facebook\AutoloadMap\initialize(); - $request = Usox\HackTTP\create_server_request_from_globals(); - // header is of the form HOST:PORT - for `parse_url`, we need - // `http://HOST:port/` as `parse_url()` is unable to parse IPv6 - // strings like `[::1]:8080 - - $server = HHVM\UserDocumentation\_Private\SuperGlobals\server_variables(); - $dummy_uri = 'http://'.$server['HTTP_HOST'].'/'; - $host = \parse_url($dummy_uri, PHP_URL_HOST); - $port = \parse_url($dummy_uri, PHP_URL_PORT); - // We just use this to figure out if we should do a redirect - if we were - // doing something more important, we should make sure that the remote end - // is from a local-use IP range. - $https = $server['HTTP_X_FORWARDED_PROTO'] ?? - $server['HTTPS'] ?? - $server['https'] ?? - false; - if ($https is string) { - $https = Str\lowercase((string)$https); - $https = $https === 'on' || - $https === 'true' || - $https === 'yes' || - $https === 'https'; - } - $scheme = ($https as bool) ? 'https' : 'http'; - $request = $request->withUri( - $request->getUri()->withHost($host)->withPort($port)->withScheme($scheme), - ); - - await HHVMDocumentationSite::respondToAsync($request); - exit(0); - -} diff --git a/public/js/feedback.js b/public/js/feedback.js deleted file mode 100644 index ce2c6f5ab..000000000 --- a/public/js/feedback.js +++ /dev/null @@ -1,21 +0,0 @@ -var likeIcon = document.getElementById("like-feedback"); -var dislikeIcon = document.getElementById("dislike-feedback"); -var feedbackContainer = document.getElementById("feedback-container"); - -likeIcon.addEventListener( - "click", - function(e) { - e.preventDefault(); - feedbackContainer.classList.toggle('feedbackPromptOff'); - feedbackContainer.classList.toggle('likeFeedbackOn'); - ga('send', 'event', 'Feedback', 'Useful', 'Guides Page', 1); - }); - -dislikeIcon.addEventListener( - "click", - function(e) { - e.preventDefault(); - feedbackContainer.classList.toggle('feedbackPromptOff'); - feedbackContainer.classList.toggle('dislikeFeedbackOn'); - ga('send', 'event', 'Feedback', 'Not Useful', 'Guides Page', 0); - }); \ No newline at end of file diff --git a/public/robots.txt-default b/public/robots.txt-default deleted file mode 100644 index 343fc8a15..000000000 --- a/public/robots.txt-default +++ /dev/null @@ -1,7 +0,0 @@ -User-agent: * -Disallow: /__content -Disallow: /__survey/ -Disallow: /search -Disallow: /j/ - -Sitemap: /sitemap.txt diff --git a/public/robots.txt-do-not-crawl b/public/robots.txt-do-not-crawl deleted file mode 100644 index 1f53798bb..000000000 --- a/public/robots.txt-do-not-crawl +++ /dev/null @@ -1,2 +0,0 @@ -User-agent: * -Disallow: / diff --git a/public/search.xml b/public/search.xml deleted file mode 100644 index 88f7e6fad..000000000 --- a/public/search.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0"?> -<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/" xmlns:moz="http://www.mozilla.org/2006/browser/search/"> - <ShortName>Hack/HHVM Docs</ShortName> - <Description>Hack/HHVM Documentation Search</Description> - <InputEncoding>UTF-8</InputEncoding> - <Url type="text/html" method="get" template="http://docs.hhvm.com/j/{searchTerms}" /> -</OpenSearchDescription> diff --git a/public/sitemap.txt b/public/sitemap.txt deleted file mode 120000 index ac39970af..000000000 --- a/public/sitemap.txt +++ /dev/null @@ -1 +0,0 @@ -../build/final/sitemap.txt \ No newline at end of file diff --git a/sass/basics.scss b/sass/basics.scss deleted file mode 100644 index bad93de41..000000000 --- a/sass/basics.scss +++ /dev/null @@ -1,130 +0,0 @@ -body { - background: #ffffff; - color:$grey; - font: 500 14px/26px $base-font; - text-rendering: optimizeLegibility; - word-wrap: break-word; -} - -p { - padding-bottom: 10px; -} - -a { - color: $orange; - font-weight: 700; - text-decoration: none; -} - -.guideListWrapper { - border-bottom: 2px solid $lightgrey; -} - -.notFoundErrorPage { - background: $midgrey; - color: white; -} - -.notFoundErrorPage .mainContainer { - background: inherit; -} - -.notFoundErrorPage .mainContainer > div { - background: inherit; -} - -.warning { - color: red; -} - -.message { - font-size: medium; - padding: 0.5em; - margin-bottom: 0.5em; - - .note { - border: 1px solid $darkblue; - background-color: $lightestblue; - } - - .tip { - border: 1px solid $green; - background-color: $lightgreen; - } - - .caution { - border: 1px solid $darkyellow; - background-color: $lightyellow; - } - - .danger { - border: 1px solid $red; - background-color: $lightred; - } - - .api { - border: 1px solid $blue; - background-color: lighten($blue, 40%); - color: $darkblue; - font-size: smaller; - font-style: italic; - padding: 0.5em; - } -} - -.fbOnly.apiAlias { - display: block; - padding-left: 1em; - font-style: italic; -} - -.fbOnly.apiAlias:before, .fbIcon:before { - content: 'f'; - margin-right: 0.25em; - font-style: normal; - background: linear-gradient(to top, #4267b2, #5890ff); - width: 1em; - display: inline-block; - text-align: center; - border-radius: 3px; - color: white; - font-family: Helvetica; - font-size: 120%; -} - -.api:nth-child(n+2) { - border-top: none; -} - -.isNotFbViewer * .fbOnly { - display: none; -} - -.api.fbOnly p:last-child { - padding-bottom: 0px; -} - -.searchResultType { - font-style: italic; - color: #aaa; - margin-left: 0.5em; -} - -@media only screen and (max-width: 1020px) { - body { - font-size: 15px; - } -} - -@media only screen and (min-width: 1200px) { - body { - font-size: 15px; - } -} - -@media only screen and (min-width: 1400px) { - body { - font-size: 18px; - line-height: 1.8em; - } -} diff --git a/sass/buttons.scss b/sass/buttons.scss deleted file mode 100644 index f1f0eca7d..000000000 --- a/sass/buttons.scss +++ /dev/null @@ -1,75 +0,0 @@ -.buttonHolder{ - display: block; - - .button { - border-radius: 0px; - display: inline-block; - line-height: 1.2em; - font-weight: 700; - padding: 0; - position: relative; - @include buttonhover($blue); - @include glyphblock; - - .buttonText { - box-sizing: border-box; - display: block; - height: 100%; - width: 100%; - } - - &.buttonSmall .buttonText { - font-size: 12px; - padding: 5px 20px; - } - - &.buttonMedium .buttonText { - font-size: 14px; - padding: 10px 20px; - } - - &.buttonLarge .buttonText { - font-size: 16px; - padding: 15px 20px; - } - - &.buttonConfirm { - @include buttonhover($green); - } - - &.buttonSpecial { - @include buttonhover($orange); - } - - &.buttonDelete { - @include buttonhover($red); - } - } - - &.buttonWithGlyph { - .button { - .buttonText { - padding-left: 60px; - } - } - - &.buttonAlignRight { - .button { - .buttonText { - padding-left: 20px; - padding-right: 60px; - text-align: right; - } - - .glyphIcon { - left: auto; - right: 0px; - } - } - } - } - - &.buttonInlineHolder { - display: inline-block; - } -} diff --git a/sass/codeBlocks.scss b/sass/codeBlocks.scss deleted file mode 100644 index 1453f447b..000000000 --- a/sass/codeBlocks.scss +++ /dev/null @@ -1,23 +0,0 @@ -.highlight { - @include codetext; - border-left: 3px solid $orange; - overflow-x: auto; - padding: 10px; - margin: 25px 0; - - &.fbgfm { - padding: 0px; - } -} - -p + .highlight { - margin-top: 0; -} - -.output-block span { - color: inherit; -} - -.hljs { - background: $lightergrey !important; -} \ No newline at end of file diff --git a/sass/core.scss b/sass/core.scss deleted file mode 100644 index cc3d3618b..000000000 --- a/sass/core.scss +++ /dev/null @@ -1,23 +0,0 @@ -@import "variables"; -@import "reset"; - -@import "fontawesome"; -@import "solid"; - -@import "basics"; -@import "layout"; -@import "titles"; -@import "lists"; -@import "header"; -@import "navigation"; -@import "sprites"; -@import "codeBlocks"; -@import "innerContent"; -@import "tables"; -@import "pagination"; -@import "feedback"; -@import "search"; -@import "survey"; -@import "buttons"; -@import "notices"; -@import "footer"; diff --git a/sass/feedback.scss b/sass/feedback.scss deleted file mode 100644 index 34b0bc986..000000000 --- a/sass/feedback.scss +++ /dev/null @@ -1,50 +0,0 @@ -.pageFeedback { - line-height: normal; - padding-top: 20px; - font-size: 15px; - font-weight: bold; - text-align: center; - - .fa-thumbs-up { - vertical-align: text-top; - } - - .fa-thumbs-down { - vertical-align: text-bottom; - } - - #feedback-prompt-message { - display: block; - } - - #like-message { - display: none; - } - - #dislike-message { - display: none; - } - - &.feedbackPromptOff { - #feedback-prompt-message { - display: none; - } - } - - &.likeFeedbackOn { - #like-message { - display: block; - } - } - - &.dislikeFeedbackOn { - #dislike-message { - display: block; - } - } -} - -.pageFeedback i { - margin-left: 0.5em; - margin-right: 0.5em; -} \ No newline at end of file diff --git a/sass/footer.scss b/sass/footer.scss deleted file mode 100644 index 484ea6d77..000000000 --- a/sass/footer.scss +++ /dev/null @@ -1,50 +0,0 @@ -footer { - &.footerWrapper { - background: $footer-bg; - border-top: 2px solid $orange; - box-sizing: border-box; - padding: $side-padding; - position: relative; - width: 100%; - text-align: initial; - - .mainWrapper { - display: flex; - flex-flow: row wrap; - margin: 0 -20px; - - .footerPanel { - box-sizing: border-box; - flex-basis: 200px; - flex-grow: 1; - flex-shrink: 0; - font-size: 14px; - padding: 20px; - - h2 { - color: $orange; - font-size: 18px; - padding-bottom: 10px; - } - - ul { - a { - color: white; - } - } - - &.footerPanelFullWidth { - flex-basis: 100%; - } - } - } - } -} - -@media only screen and (max-width: 1020px) { - footer { - &.footerWrapper { - padding: $side-padding-mob; - } - } -} diff --git a/sass/header.scss b/sass/header.scss deleted file mode 100644 index d6911a152..000000000 --- a/sass/header.scss +++ /dev/null @@ -1,99 +0,0 @@ -.header { - background: $midgrey; - border-bottom: 2px solid $orange; - color: white; - height: $header-height; - position: fixed; - width: 100%; - z-index: 999; - - .widthWrapper { - height: 100%; - position: relative; - } - - .headerLogo { - bottom: 0px; - line-height: 60px; - position: absolute; - top: 0px; - z-index: 1; - - &.hhvmLogo { - left: 110px + $side-padding; - - .bodyClassHack & { - @include headerfade; - - &:hover { - opacity: 1; - } - } - } - - &.hackLogo { - left: $side-padding; - - .bodyClassHhvm & { - @include headerfade; - - &:hover { - opacity: 1; - } - } - } - - a { - color: white; - display: block; - font-family: $header-font; - font-size: 25px; - font-weight: 700; - height: 100%; - padding-left: 35px; - position: relative; - text-decoration: none; - } - } - - .githubIssueLink { - text-align: center; - font-size: smaller; - position: absolute; - left: 0; - right: 0; - padding-left: 1em; - padding-right: 1em; - a { - color: $lightgrey; - } - } -} - -@media only screen and (max-width: $medium-screen-cutoff) { - .headerElement.githubIssueLink { - display: none; - } -} - -/* Fix for anchors being hidden under fixed top header */ -:target:before { - content: ""; - display: block; - height: $header-height + 20px; - margin: -($header-height + 20px) 0 0; -} - -@media only screen and (max-width: 1020px) { - .header { - .headerLogo { - &.hackLogo { - left: $side-padding-mob; - } - - &.hhvmLogo { - left: 110px + $side-padding-mob; - } - } - } -} diff --git a/sass/innerContent.scss b/sass/innerContent.scss deleted file mode 100644 index c5f495465..000000000 --- a/sass/innerContent.scss +++ /dev/null @@ -1,68 +0,0 @@ -.innerContent { - code { - @include codetext; - } - - em { - font-style: italic; - } - - h1 { - font-size: 200%; - padding: 20px 0; - } - - h2 { - border-bottom: 1px solid $lightgrey; - font-size: 150%; - margin: 15px 0; - padding-bottom: 5px; - } - - h3 { - font-size: 130%; - padding: 10px 0; - } - - h4 { - font-size: 115%; - padding: 10px 0; - } - - img { - max-width: 100%; - } - - li > code { - @include codeemph; - } - - li code.methodListSignature { - color: $lightorange; - font-weight: 400; - } - - ol { - list-style: decimal; - margin: 0.5em 0 2em; - padding-left: 1em; - } - - p { - padding-bottom: 1.5em; - - & > code { - @include codeemph; - } - } - - strong { - font-weight: 700; - } - - ul { - list-style: disc; - margin: 0.5em 0 2em; - padding-left: 1em; - } -} diff --git a/sass/layout.scss b/sass/layout.scss deleted file mode 100644 index 126f8669b..000000000 --- a/sass/layout.scss +++ /dev/null @@ -1,72 +0,0 @@ -.widthWrapper { - padding-left: $side-padding; - padding-right: $side-padding; - position: relative; -} - -.flexWrapper { - padding-bottom: 50px; - padding-top: 50px; -} - -.mainContainer { - background: $footer-bg; - box-sizing: border-box; - height: 100%; - padding-top: 62px; - - & > div { - background: white; - overflow: auto; - } -} - -.mainWrapper { - max-width: $default-max-width; -} - -.guideListWrapper { - margin-bottom: 50px; - padding-bottom: 50px; -} - -.notFoundMessage { - text-align: center; -} - -.notFoundErrorPage { - text-align: center; - - .pageTitle { - display: none; - } - - .mainWrapper { - margin: 0 auto; - } -} - -@media only screen and (max-width: 1020px) { - body { - display: flex; - flex-flow: column wrap; - } - - .mainContainer { - width: 100%; - overflow-x: hidden; - overflow-y: scroll; - -webkit-overflow-scrolling: touch; - } - - .widthWrapper { - padding-left: $side-padding-mob; - padding-right: $side-padding-mob; - } -} - -@media only screen and (min-width: $large-screen-cutoff) { - .mainWrapper { - max-width: $large-screen-max-width; - } -} diff --git a/sass/lists.scss b/sass/lists.scss deleted file mode 100644 index e83f83ad8..000000000 --- a/sass/lists.scss +++ /dev/null @@ -1,69 +0,0 @@ -.guideList { - display: flex; - flex-flow: row wrap; - margin: -10px; - - li { - box-sizing: border-box; - flex-shrink: 0; - padding: 10px; - width: 50%; - } - - li h4 { - margin-bottom: 10px; - } -} - -.apiList { - align-items: center; - border-bottom: 1px solid $orange; - display: flex; - flex-flow: row wrap; - margin: 0 -10px 20px; - padding-bottom: 20px; - - li { - box-sizing: border-box; - flex-shrink: 0; - padding: 0px 10px; - width: 25%; - - line-height: 0.8em; - margin-bottom: 5px; - word-wrap: break-word; - font-size: 140%; - - a { - font-family: $base-font; - font-size: 12px; - font-weight: 400; - } - - a.deprecated { - text-decoration: line-through; - } - } -} - -@media only screen and (max-width: 480px) { - .guideList li { - width: 100%; - } - - .apiList { - display: block; - - li { - width: 100%; - } - } -} - -@media only screen and (min-width: 480px) and (max-width: 1020px) { - .apiList { - li { - width: 50%; - } - } -} diff --git a/sass/navigation.scss b/sass/navigation.scss deleted file mode 100644 index 05ce46755..000000000 --- a/sass/navigation.scss +++ /dev/null @@ -1,418 +0,0 @@ -.navOuterContainer { - background: $lightergrey; - box-sizing: border-box; - order: 1; - - .navInnerContainer { - height: 100%; - } - - h3 { - font-size: 19px; - } - - h5 { - font-size: 16px; - } - - .navList { - position: relative; - - .navGroup.navGroupActive { - .subList { - display: block; - } - h4 { - background-color: #DADADA; - } - } - - // horizontal line functionality in resized pseudo-element - .navGroup:after { - content: ''; - display: block; - margin: 0 auto; - width: 80%; - border-bottom: 1px solid #DADADA; - } - - .navGroup:hover:after { content: none; } - - li { - a { - color: $lightgrey; - display: block; - font-weight: bold; - - &:hover { - background-color: #DADADA; - color: #303030; - } - } - - h4 { - font-family: $base-font; - font-size: 16px; - - a { - color: $orange; - padding-bottom: 10px; - padding-top: 10px; - } - } - } - } - - .subList { - margin-bottom: 20px; - padding-left: 20px; - display: none; - - .subListItem { - h5 { - a { - color: $grey; - font-weight: 400; - padding-left: 30px; - position: relative; - - &::before { - border-color: transparent transparent transparent transparent; - border-style: solid; - border-width: 5px 0 5px 8.7px; - content: ""; - height: 0; - left: 12px; - position: absolute; - top: 8px; - transition: border-color 0.5s; - width: 0; - } - } - } - - &:hover { - h5 { - a { - &::before { - border-color: transparent transparent transparent $grey; - } - } - } - } - - &.itemActive { - h5 { - a { - font-weight: 700; - - &::before { - border-color: transparent transparent transparent $orange; - } - } - } - } - } - } - - .apiNavList { - .navGroup { - .subList { - display: none; - } - - &.navGroupActive { - .subList { - display: block; - } - } - } - - .subList { - .subListItem { - h5 { - line-height: 0.7em; - - a { - @include apinavlink; - - &::before { - top: 7.5px; - } - } - } - - .secondLevelList { - display: none; - - .secondLevelListItem { - h6 { - line-height: 0.7em; - - a { - @include apinavlink; - font-weight: 400; - padding-left: 45px; - } - } - - &.secondLevelItemActive { - h6 { - a { - color: $midgrey; - font-weight: 700; - } - } - } - } - } - - &.itemActive { - .secondLevelList { - display: block; - } - } - } - } - } -} - -.breadcrumbNav { - line-height: normal; - padding-top: 10px; - word-wrap: break-word; -} - -.breadcrumbNav, .breadcrumbNav a { - font-size: 12px; - font-weight: 400; - text-transform: uppercase; -} - -.breadcrumbSeparator { - margin: 0 10px; - padding-left: 6px; - position: relative; -} - -.breadcrumbSeparator::before { - border-color: transparent transparent transparent $lightgrey; - border-style: solid; - border-width: 3px 0px 3px 5.5px; - content: ""; - height: 0; - left: 0px; - position: absolute; - top: 5px; - transition: border-color 0.5s; - width: 0; -} - -@media only screen and (max-width: 480px) { - .navOuterContainer { - .navInnerContainer { - .navList { - display: block; - - li { - width: 100%; - } - } - - .navToggleOn { - .navList { - display: block; - } - } - } - } - - .breadcrumbNav { - line-height: 1.6em; - } -} - -@media only screen and (min-width: 480px) and (max-width: 1020px) { - .navOuterContainer { - .navInnerContainer { - .navList { - display: flex; - - & > li { - width: 50%; - } - } - - .navToggleOn { - .navList { - display: flex; - } - } - } - } -} - -@media only screen and (max-width: 1020px) { - .navOuterContainer { - background: none; - box-sizing: border-box; - height: 60px; - overflow-x: hidden; - position: fixed; - right: 0; - top: 0; - transition: height 0.3s; - width: 60px; - z-index: 999; - - &.navToggleOn { - height: 100%; - left: 0px; - padding-top: 60px; - width: 100%; - - .navToggleButton { - color: white; - } - } - - &.navToggleOff { - .navList { - display: none; - } - - .navToggleButton { - color: $grey; - } - } - - .navToggleButton { - cursor: pointer; - font-size: 24px; - line-height: 60px; - position: fixed; - top: 0; - right: 15px; - z-index: 9999; - transition: color 0.3s; - } - - .navList { - align-items: stretch; - background: #f8f8f8; - box-sizing: border-box; - display: flex; - flex-flow: row wrap; - height: 100%; - overflow-y: scroll; - -webkit-overflow-scrolling: touch; - padding: 10px; - width: 100%; - - & > li { - box-sizing: border-box; - flex: 1; - flex-basis: 50%; - flex-shrink: 0; - flex-flow: 1; - padding: 10px; - width: 50%; - } - } - - .subList { - .subListItem h5 a::before { - left: -12px; - } - } - } -} - -@media only screen and (min-width: 1020px) { - .navOuterContainer { - height: 100vh; - order: 1; - padding: 60px 0 0; - position: fixed; - left: 0px; - top: 0px; - width: 300px; - z-index: 99; - - .navToggleButton { - display: none; - } - - & + .mainContainer { - margin-left: 300px; - } - - h3 { - font-size: 19px; - } - - .navList { - box-sizing: border-box; - height: 100%; - overflow-x: hidden; - overflow-y: scroll; - padding: 20px 0; - - li { - h4 { - a { - padding-left: 30px; - } - } - } - - .subList { - .subListItem { - h5 { - a { - padding-left: 30px; - } - } - } - } - } - - .navInnerContainer { - & > .navList { - box-sizing: border-box; - height: 100%; - overflow-x: hidden; - overflow-y: scroll; - padding: 20px 0; - } - } - } -} - -@media only screen and (min-width: 1400px) { - .navOuterContainer { - .subList { - .subListItem { - h5 { - a { - &::before { - top: 12px; - } - } - } - } - } - - .apiNavList { - .subList { - .subListItem { - h5 { - a::before { - top: 10px; - } - } - } - } - } - } -} diff --git a/sass/notices.scss b/sass/notices.scss deleted file mode 100644 index 4c4f67590..000000000 --- a/sass/notices.scss +++ /dev/null @@ -1,53 +0,0 @@ -.noticeHolder { - .notice { - border: 2px solid $lightgrey; - line-height: 1.2em; - padding: 10px; - position: relative; - - @include notice($blue); - @include glyphblock; - - &.noticeSmall { - font-size: 12px; - padding: 10px 5px; - } - - &.noticeMedium { - font-size: 14px; - padding: 10px; - } - - &.noticeLarge { - font-size: 16px; - padding: 15px 20px; - } - - &.noticeSuccess { - @include notice($green); - } - - &.noticeSpecial { - @include notice($orange); - } - - &.noticeWarning { - @include notice($red); - } - } - - &.noticeWithGlyph { - .notice { - padding-left: 60px; - - &.noticeLarge { - padding-left: 80px; - - .glyphIcon { - font-size: 18px; - width: 60px; - } - } - } - } -} diff --git a/sass/pagination.scss b/sass/pagination.scss deleted file mode 100644 index 76693291e..000000000 --- a/sass/pagination.scss +++ /dev/null @@ -1,52 +0,0 @@ -.paginationLinks { - .paginationLink { - a { - display: block; - position: relative; - z-index: 90; - } - - &.next { - text-align: right; - } - - flex-basis: 50%; - flex-grow: 1; - margin: 10px; - position: relative; - - .buttonHolder { - height: 100%; - - .button { - height: 100%; - } - - .buttonText { - display: flex; - flex-wrap: wrap; - - .paginationGuideTitle, .paginationPageTitle { - display: block; - flex-basis: 100%; - } - - .paginationPageTitle { - flex-basis: 100%; - order: 2; - } - - .paginationPageTitle + .paginationGuideTitle { - font-size: 80%; - opacity: 0.8; - order: 1; - } - - } - } - } - - display: flex; - margin: 0 -10px; - padding-top: 20px; -} diff --git a/sass/reset.scss b/sass/reset.scss deleted file mode 100644 index 009eb5a60..000000000 --- a/sass/reset.scss +++ /dev/null @@ -1,56 +0,0 @@ -@charset "utf-8"; -@-ms-viewport{ - width: device-width; -} -@viewport { - width: device-width; -} -@media (max-width: 400px) { - @-ms-viewport { - width: 320px; - } -} - -html, body, div, span, applet, object, iframe, -h1, h2, h3, h4, h5, h6, p, blockquote, pre, -a, abbr, acronym, address, big, cite, code, -del, dfn, em, img, ins, kbd, q, s, samp, -small, strike, strong, sub, sup, tt, var, -b, u, i, center, -dl, dt, dd, ol, ul, li, -fieldset, form, label, legend, -table, caption, tbody, tfoot, thead, tr, th, td, -article, aside, canvas, details, embed, -figure, figcaption, footer, header, hgroup, -menu, nav, output, ruby, section, summary, -time, mark, audio, video { - margin: 0; - padding: 0; - border: 0; - font-size: 100%; - font: inherit; - vertical-align: baseline; } - -article, aside, details, figcaption, figure, -footer, header, hgroup, menu, nav, section { - display: block; } - -body { - line-height: 1; } - -ol, ul { - list-style: none; } - -blockquote, q { - quotes: none; } - -blockquote:before, blockquote:after, -q:before, q:after { - content: ""; - content: none; } - -table { - border-collapse: collapse; - border-spacing: 0; } - -html,body{height:100%} diff --git a/sass/search.scss b/sass/search.scss deleted file mode 100644 index 974531a56..000000000 --- a/sass/search.scss +++ /dev/null @@ -1,88 +0,0 @@ -.headerElement { - bottom: 0px; - left: 110px; - line-height: 60px; - position: absolute; - - &.searchBar { - margin-right: 10px; - left: auto; - position: absolute; - right: 0px; - top: 0px; - } -} - -.searchBar { - align-items: center; - display: flex; - - form { - box-sizing: border-box; - color: white; - display: flex; - - .searchInput { - -webkit-appearance: none; - background: none; - border: 0px; - border-bottom: 2px solid $grey; - border-radius: 0; - font-size: 14px; - height: 40px; - min-width: 200px; - outline: none; - padding: 10px; - position: relative; - z-index: 9; - transition: background-color 0.3s; - - &:required:invalid { - box-shadow: none; - } - - &:required:valid { - background: $grey; - @include searchplaceholderfocus; - } - } - - .inputLabel { - align-items: center; - display: flex; - left: 10px; - right: 10px; - top: 20px; - transition: left 0.3s; - position: absolute; - - .glyphIcon { - cursor: default; - flex-basis: 30px; - } - - .searchPlaceholder { - color: rgba(white, 0.5); - font-size: 12px; - line-height: 1.2em; - transition: color 0.3s; - } - } - - .searchInput, .searchPlaceholder { - color: white; - font-family: $header-font; - } - - .searchInput:focus { - background: $grey; - @include searchplaceholderfocus; - } - } -} - -@media only screen and (max-width: $medium-screen-cutoff) { - .searchBar { - display: none; - } -} diff --git a/sass/sprites.scss b/sass/sprites.scss deleted file mode 100644 index 95594da31..000000000 --- a/sass/sprites.scss +++ /dev/null @@ -1,191 +0,0 @@ -.logoCSS { - display: block; - height: 40px; - left: 0; - position: absolute; - top: 10px; - width: 40px; - - .logoPolygon { - width: 0; - height: 0; - border-style: solid; - position: absolute; - } - - .a { - border-width: 0 0 12px 12px; - border-color: transparent transparent grey transparent; - left: 0px; - top: 15px; - - &.a1 { - border-color: transparent transparent $orange transparent; - } - - &.a2 { - top: 1px; - left: 14px; - } - - &.a3 { - top: 0px; - left: 0px; - } - - &.a4 { - top: 17px; - left: 14px; - } - } - - .b { - border-width: 12px 12px 0 0; - border-color: grey transparent transparent transparent; - left: 14px; - top: 15px; - - &.b1 { - border-color: white transparent transparent transparent; - } - - &.b2 { - top: 29px; - left: 0px; - } - - &.b3 { - top: 12px; - left: 0px; - } - - &.b4 { - top: 29px; - left: 14px; - } - } -} - -.notFoundIcon { - margin: 50px 0; - text-align: center; - - .notFoundIconCSS { - display: inline-block; - height: 25.5vw; - margin: 0 1vw; - overflow: hidden; - position: relative; - text-align: center; - width: 17vw; - - &.notFound_4_IconCSS { - .a { - border-color: transparent transparent $lightgrey transparent; - border-width: 0 0 8vw 8vw; - - &.a1 { - border-color: transparent transparent $lightgrey transparent; - left: 0px; - top: 1px; - } - - &.a2 { - left: 9vw; - top: 0px; - } - - &.a3 { - border-width: 0px 0px 7vw 7vw; - left: 1vw; - top: 9vw; - } - - &.a4 { - border-width: 0px 0px 8.35vw 8.35vw; - left: 8.55vw; - top: 8.6vw; - } - } - - .b { - border-color: $lightgrey transparent transparent transparent; - border-width: 8vw 8vw 0 0; - - &.b1 { - border-color: $lightgrey transparent transparent transparent; - left: 0px; - top: 8vw; - } - - &.b2 { - border-width: 7.4vw 7.4vw 0px 0px; - left: 8.6vw; - top: 8.6vw; - } - - &.b3 { - border-width: 8.35vw 8.35vw 0px 0px; - left: 8.55vw; - top: 16.89vw; - } - } - } - - &.notFound_0_IconCSS { - width: 16vw; - .a { - border-color: transparent transparent $orange transparent; - border-width: 0 0 8vw 8vw; - - &.a1 { - border-color: transparent transparent $orange transparent; - left: 0px; - top: 1px; - } - - &.a2 { - border-width: 0 0 7.5vw 7.5vw; - left: 8.55vw; - top: 1.1vw; - } - - &.a3 { - border-width: 0px 0px 7vw 7vw; - left: 1vw; - top: 9vw; - } - } - - .b { - border-color: $orange transparent transparent transparent; - border-width: 8vw 8vw 0 0; - - &.b1 { - border-color: $orange transparent transparent transparent; - left: 0px; - top: 8vw; - } - - &.b2 { - border-width: 7.4vw 7.4vw 0px 0px; - left: 8.6vw; - top: 0vw; - } - - &.b3 { - border-width: 7.5vw 7.5vw 0px 0px; - left: 8.6vw; - top: 8.5vw; - } - } - } - } -} - -@media only screen and (max-width: 1020px) { - .notFoundIcon .notFoundIconCSS.notFound_4_IconCSS .b.b3 { - left: 8.65vw; - top: 16.75vw; - } -} diff --git a/sass/survey.scss b/sass/survey.scss deleted file mode 100644 index 4dff66e0c..000000000 --- a/sass/survey.scss +++ /dev/null @@ -1,25 +0,0 @@ -form.postLink { - display: inline; -} - -.userSurvey { - border-style: dashed; - border-color: $orange; - border-width: 2px; - border-radius: 3px; - margin: 30px; - padding: 10px; - text-align:center; - - a { - font-weight: 400; - } -} - -.feedbackWrapper { - padding-bottom: 40px; - - .gitHubIssueButton { - text-align: left; - } -} diff --git a/sass/tables.scss b/sass/tables.scss deleted file mode 100644 index 566526a95..000000000 --- a/sass/tables.scss +++ /dev/null @@ -1,109 +0,0 @@ -@media only screen and (max-width: $small-screen-cutoff) { - .tableWrapper { - margin: 20px 0; - - table { - display: block; - - thead { - display: none; - } - - tbody { - display: block; - - tr { - background: $lightergrey; - border: 1px solid $lightgrey; - display: block; - margin: 15px 0; - padding: 15px; - - td { - border-bottom: 1px dotted $lightgrey; - display: block; - padding: 5px 0; - - &::before { - color: $grey; - content: attr(data-heading); - display: block; - font-family: $header-font; - float: left; - height: 100%; - padding-right: 15px; - text-transform: uppercase; - } - - &:last-of-type { - border-bottom: none; - } - - code { - color: $green; - display: inline-block; - font-size: 12px; - } - } - } - } - } - } -} -@media only screen and (min-width: 640px) { - .tableWrapper { - margin: 20px 0; - overflow-x: auto; - - table { - background: $lightergrey; - border: 1px solid $lightgrey; - display: table; - min-width: 600px; - - thead { - border-bottom: 1px solid $lightgrey; - display: table-header-group; - } - - tbody { - display: table-row-group; - - tr { - &:nth-of-type(odd) { - background: #E8E8E8; - } - } - } - - tr { - display: table-row; - - th, td { - border-right: 1px dotted $lightgrey; - display: table-cell; - font-size: 14px; - line-height: 1.3em; - padding: 10px; - text-align: left; - - &:last-of-type { - border-right: 0; - } - - code { - color: $green; - display: inline-block; - font-size: 12px; - } - } - - th { - color: $grey; - font-family: $header-font; - text-transform: uppercase; - } - } - } - } -} diff --git a/sass/titles.scss b/sass/titles.scss deleted file mode 100644 index 3f9da28c9..000000000 --- a/sass/titles.scss +++ /dev/null @@ -1,70 +0,0 @@ -h1, h2, h3, h4 { - font-family: $header-font; - font-weight: 700; - line-height: 1.3em; -} - -h1 a, h2 a, h3 a, h4 a { - font-weight: 400; -} - -h1 { - font-size: 300%; -} - -h2 { - font-size: 250%; -} - -h3 { - font-size: 200%; -} - -h4 { - font-size: 140%; -} - -.headingWithAnchor .glyphIcon { - color: $lightgrey; - margin-left: 0.5em; - display: none; -} - -.headingWithAnchor:hover .glyphIcon { - display: inline-block; -} - -.mainTitle { - .pageTitle { - border-bottom: 2px solid $lightgrey; - color: $grey; - margin: 40px 0 10px; - padding-bottom: 10px; - } - - & + .flexWrapper { - padding-top: 10px; - } - - .widthWrapper { - max-width: $default-max-width; - } - - @media only screen and (min-width: $large-screen-cutoff) { - .widthWrapper { - max-width: $large-screen-max-width; - } - } -} - -.guideListWrapper { - .listTitle { - margin-bottom: 25px; - } - - .guideList + .listTitle { - border-top: 1px dotted $lightgrey; - margin-top: 50px; - padding-top: 50px; - } -} diff --git a/sass/variables.scss b/sass/variables.scss deleted file mode 100644 index a56c8a1e9..000000000 --- a/sass/variables.scss +++ /dev/null @@ -1,154 +0,0 @@ -/** Fonts **/ - -$base-font: "Open Sans", Arial, Helvetica, sans-serif; -$header-font: "Roboto", 'Helvetica Neue', Arial, sans-serif; -$fa-font-path: "/s/evergreen/fonts/fontawesome-free-5.15.4-web"; - -/* Colors */ -$orange: #fd8724; -$lightorange: #fda052; -$lighterorange: #faf0e7; - -$grey: #505050; -$midgrey: #303030; -$lightgrey: #B0B0B0; -$lightergrey: #F8F8F8; -$bluishgrey: #ecf0f0; - -$green: #2db04b; -$lightgreen: #DFF7E54D; - -$blue: #6986a6; -$lightestblue: #e6e5ff4d; -$lightblue: lighten($blue, 10%); -$darkblue: darken($blue, 10%); - -$red: #d64932; -$lightred: #FFC8B14D; - -$darkyellow: #b6b60b; -$lightyellow: #FFFCE54D; - -$footer-bg: $midgrey; - -$large-screen-cutoff: 1400px; -$medium-screen-cutoff: 1020px; -$small-screen-cutoff: 640px; -$large-screen-max-width: 1200px; -$default-max-width: 1000px; - -$header-height: 60px; -$side-padding: 30px; -$side-padding-mob: 10px; - -/* Mixins */ - -@mixin codetext { - font-family: "Lucida Console", Monaco, "Courier New", monospace; - font-size: 90%; - line-height: 1.4em; -} - -@mixin codeemph { - background: darken($lightergrey, 3%); - border-radius: 2px; - padding: 1px 3px; -} - -@mixin headerfade { - opacity: 0.3; - transition: opacity 0.3s; -} - -@mixin apinavlink { - font-family: $base-font; - font-size: 12px; - padding-bottom: 7.5px; - padding-top: 7.5px; - word-wrap: break-word; -} - -@mixin buttonhover($color) { - background-color: lighten($color, 30%); - color: darken($color, 20%); - transition: background-color 0.3s, color 0.3s; - overflow: hidden; - - .buttonText { - border-bottom: 2px solid lighten($color, 25%); - transition: border-color 0.3s; - - a { - color: darken($color, 20%); - } - } - - .glyphIcon { - background: $color; - border-bottom: 2px solid darken($color, 5%); - color: white; - } - - &:hover, &:focus { - background-color: lighten($color, 15%); - color: darken($color, 30%); - - .buttonText { - border-color: darken($color, 10%); - } - } - - &:active { - background-color: lighten($color, 5%); - color: white; - - .buttonText { - border-color: $color; - } - } -} - -@mixin notice($color) { - background: lighten($color, 30%); - border-color: $color; - - .glyphIcon { - background: $color; - color: white; - } - - a { - color: darken($color, 25%); - } -} - -@mixin searchplaceholderfocus { - & + .inputLabel { - left: -30px; - - .searchPlaceholder { - color: rgba(white, 0); - } - } -} - -@mixin glyphblock { - .glyphIcon { - align-items: center; - bottom: 0px; - display: flex; - font-size: 14px; - left: 0px; - position: absolute; - top: 0px; - width: 40px; - - &.fa-2x { - font-size: 18px; - } - - &::before { - margin: 0 auto; - } - } -} diff --git a/src/APIIndex.php b/src/APIIndex.php deleted file mode 100644 index 0a9984038..000000000 --- a/src/APIIndex.php +++ /dev/null @@ -1,199 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ -namespace HHVM\UserDocumentation; - -use namespace Facebook\TypeAssert; -use namespace HH\Lib\Vec; - -final class APIIndex { - private ProductAPIIndexShape $index; - - private function __construct(private APIProduct $product) { - $idx = self::getRawIndex(); - switch ($product) { - case APIProduct::HACK: - $this->index = $idx[APIProduct::HACK]; - break; - case APIProduct::HSL: - $this->index = $idx[APIProduct::HSL]; - break; - case APIProduct::HSL_EXPERIMENTAL: - $this->index = $idx[APIProduct::HSL_EXPERIMENTAL]; - break; - } - } - - <<__Memoize>> - public static function get(APIProduct $product): APIIndex { - return new self($product); - } - - public function getIndex(): ProductAPIIndexShape { - return $this->index; - } - - public static function searchAllProducts(string $term): vec<SearchResult> { - return Vec\concat( - self::get(APIProduct::HACK)->search($term), - self::get(APIProduct::HSL)->search($term), - ); - } - - <<__Memoize>> - private static function getRawIndex(): APIIndexShape { - return apc_fetch_or_set_class_data( - self::class, - () ==> JSON\decode_as_shape( - APIIndexShape::class, - \file_get_contents(BuildPaths::APIDOCS_INDEX_JSON), - ), - ); - } - - public function getIndexForType( - APIDefinitionType $type, - ): dict<string, APIIndexEntry> { - $index = Shapes::toArray($this->index); - invariant( - \array_key_exists($type, $index), - 'invalid type: %s', - (string)$type, - ); - return $index[$type]; - } - - public function getFunctionIndex(): dict<string, APIFunctionIndexEntry> { - return $this->index['function']; - } - - public function getClassIndex( - APIDefinitionType $type, - ): dict<string, APIClassIndexEntry> { - switch ($type) { - case APIDefinitionType::FUNCTION_DEF: - invariant_violation('functions are not classes'); - case APIDefinitionType::CLASS_DEF: - return $this->index['class']; - case APIDefinitionType::INTERFACE_DEF: - return $this->index['interface']; - case APIDefinitionType::TRAIT_DEF: - return $this->index['trait']; - } - } - - public function search(string $term): vec<SearchResult> { - return APIDefinitionType::getValues() - |> Vec\map($$, $type ==> $this->searchEntries($term, $type)) - |> Vec\flatten($$); - } - - private function getMethods(APIIndexEntry $entry): ?vec<APIMethodIndexEntry> { - $methods = $entry['methods'] ?? null; - if ($methods !== null) { - return Vec\map( - $methods, - $method ==> TypeAssert\matches_type_structure( - type_alias_structure(APIMethodIndexEntry::class), - $method, - ), - ); - } - return null; - } - - private function searchEntries( - string $term, - APIDefinitionType $type, - ): vec<SearchResult> { - $results = vec[]; - - $entries = $this->getIndexForType($type); - foreach ($entries as $_ => $entry) { - $name = $entry['name']; - - $score = SearchTermMatcher::matchTerm($name, $term); - if ($score !== null) { - $results[] = new APISearchResult( - $this->product, - $type, - $name, - $entry['urlPath'], - $score, - ); - } - - $methods = $this->getMethods($entry); - if ($methods === null) { - continue; - } - foreach ($methods as $method) { - $name = $entry['name'].'::'.$method['name']; - $score = SearchTermMatcher::matchTerm($name, $term); - if ($score !== null) { - $results[] = new APISearchResult( - $this->product, - APIDefinitionType::FUNCTION_DEF, - $name, - $method['urlPath'], - $score, - ); - } - } - } - - return $results; - } - - public function getDataForFunction(string $name): APIFunctionIndexEntry { - $index = $this->index; - invariant( - \array_key_exists($name, $index['function']), - 'function %s does not exist', - $name, - ); - return $index['function'][$name]; - } - - public function getDataForClass( - APIDefinitionType $class_type, - string $class_name, - ): APIClassIndexEntry { - $index = $this->getClassIndex($class_type); - invariant( - \array_key_exists($class_name, $index), - 'class %s does not exist', - $class_name, - ); - return $index[$class_name]; - } - - public function getDataForMethod( - APIDefinitionType $class_type, - string $class_name, - string $method_name, - ): APIMethodIndexEntry { - $index = $this->getClassIndex($class_type); - invariant( - \array_key_exists($class_name, $index), - 'class %s does not exist', - $class_name, - ); - $class = $index[$class_name]; - $methods = $class['methods']; - invariant( - \array_key_exists($method_name, $methods), - 'Method %s::%s does not exist', - $class_name, - $method_name, - ); - return $methods[$method_name]; - } -} diff --git a/src/APINavData.php b/src/APINavData.php deleted file mode 100644 index ce0556592..000000000 --- a/src/APINavData.php +++ /dev/null @@ -1,103 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ -namespace HHVM\UserDocumentation; - -final class APINavData { - private APIIndex $index; - private APIProduct $product; - - private function __construct(APIProduct $product) { - $this->index = APIIndex::get($product); - $this->product = $product; - } - - <<__Memoize>> - public static function get(APIProduct $product): this { - return new self($product); - } - - public function getNavData(): dict<string, NavDataNode> { - $product = $this->product; - return dict[ - 'Classes' => $this->getNavDataForClasses(APIDefinitionType::CLASS_DEF, $product), - 'Interfaces' => - $this->getNavDataForClasses(APIDefinitionType::INTERFACE_DEF, $product), - 'Traits' => $this->getNavDataForClasses(APIDefinitionType::TRAIT_DEF, $product), - 'Functions' => shape( - 'name' => 'Functions', - 'urlPath' => '/'.$product.'/reference/function/', - 'children' => $this->getNavDataForFunctions(), - ), - ]; - } - - public function getRootNameForType(APIDefinitionType $class_type): string { - switch ($class_type) { - case APIDefinitionType::CLASS_DEF: - return 'Classes'; - case APIDefinitionType::INTERFACE_DEF: - return 'Interfaces'; - case APIDefinitionType::TRAIT_DEF: - return 'Traits'; - case APIDefinitionType::FUNCTION_DEF: - return 'Functions'; - } - } - - private function getNavDataForClasses( - APIDefinitionType $class_type, - APIProduct $product, - ): NavDataNode { - $nav_data = dict[]; - $classes = $this->index->getClassIndex($class_type); - - foreach ($classes as $class) { - $nav_data[$class['name']] = shape( - 'name' => $class['name'], - 'urlPath' => $class['urlPath'], - 'children' => $this->getNavDataForMethods($class['methods']), - ); - } - return shape( - 'name' => $this->getRootNameForType($class_type), - 'urlPath' => '/'.$product.'/reference/'.$class_type.'/', - 'children' => $nav_data, - ); - } - - private function getNavDataForMethods( - dict<string, APIMethodIndexEntry> $methods, - ): dict<string, NavDataNode> { - $nav_data = dict[]; - foreach ($methods as $method) { - $nav_data[$method['name']] = shape( - 'name' => $method['name'], - 'urlPath' => $method['urlPath'], - 'children' => dict[], - ); - } - return $nav_data; - } - - private function getNavDataForFunctions(): dict<string, NavDataNode> { - $functions = $this->index->getFunctionIndex(); - - $nav_data = dict[]; - foreach ($functions as $function) { - $nav_data[$function['name']] = shape( - 'name' => $function['name'], - 'urlPath' => $function['urlPath'], - 'children' => dict[], - ); - } - return $nav_data; - } -} diff --git a/src/Guides.php b/src/Guides.php deleted file mode 100644 index ba8894a0c..000000000 --- a/src/Guides.php +++ /dev/null @@ -1,232 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -final class Guides { - public static function normalizeName( - GuidesProduct $product, - string $guide, - string $page, - ): string { - // If the guide name and the page name are the same, only print one of them. - // If there is only one page in a guide, only print the guide name. - return ( - \strcasecmp($guide, $page) === 0 || - \count(GuidesIndex::getPages($product, $guide)) === 1 - ) - ? \ucwords(\strtr($guide, '-', ' ')) - : \ucwords(\strtr($guide.': '.$page, '-', ' ')); - } - - public static function normalizePart(string $part): string { - return \ucwords(\strtr($part, '-', ' ')); - } - - public static function getGuideRedirects( - GuidesProduct $product, - ): dict<string, (string, ?string)> { - return dict[ - GuidesProduct::HHVM => dict[ - 'getting-started' => tuple('basic-usage', 'introduction'), - ], - GuidesProduct::HACK => dict[ - 'async' => tuple('asynchronous-operations', null), - 'collections' => tuple('arrays-and-collections', 'introduction'), - 'disposables' => tuple('classes', 'object-disposal'), - 'enums' => tuple('built-in-types', 'enum'), - 'lambdas' => tuple('functions', 'anonymous-functions'), - 'operators' => tuple('expressions-and-operators', null), - 'overview' => tuple('getting-started', null), - 'shapes' => tuple('built-in-types', 'shape'), - 'tools' => tuple('getting-started', 'tools'), - 'tuples' => tuple('built-in-types', 'tuples'), - 'typechecker' => tuple('getting-started', 'tools'), - 'type-aliases' => tuple('types', 'type-aliases'), - 'type-constants' => tuple('classes', 'type-constants'), - ], - ][$product] ?? - dict[]; - } - - public static function getGuidePageRedirects( - GuidesProduct $product, - ): dict<string, dict<string, (string, ?string)>> { - return dict[ - GuidesProduct::HHVM => dict[ - 'getting-started' => dict[ - 'getting-started' => tuple('basic-usage', 'introduction'), - ], - ], - GuidesProduct::HACK => dict[ - 'getting-started' => dict[ - 'the-standard-library' => tuple('getting-started', 'the-hack-standard-library'), - ], - 'arrays-and-collections' => dict[ - 'hack-arrays' => tuple('arrays-and-collections', 'vec-keyset-and-dict'), - 'collections' => tuple('arrays-and-collections', 'object-collections'), - 'php-arrays' => tuple('arrays-and-collections', 'varray-and-darray'), - ], - 'async' => dict[ - 'async-vs-awaitable' => - tuple('asynchronous-operations', 'introduction'), - 'awaitables' => tuple('asynchronous-operations', 'awaitables'), - 'exceptions' => tuple('asynchronous-operations', 'exceptions'), - 'extensions' => tuple('asynchronous-operations', 'extensions'), - 'utility-functions' => - tuple('asynchronous-operations', 'utility-functions'), - ], - 'asynchronous-operations' => dict[ - 'await-as-an-expression-spec' => tuple('asynchronous-operations', 'await-as-an-expression'), - 'further-resources' => tuple('asynchronous-operations', 'introduction'), - 'some-basics' => tuple('asynchronous-operations', 'introduction'), - 'async-vs.-awaitable' => tuple('asynchronous-operations', 'introduction'), - 'blocks' => tuple('asynchronous-operations', 'async-blocks'), - ], - 'attributes' => dict[ - 'special' => tuple('attributes', 'predefined-attributes'), - 'syntax' => tuple('attributes', 'introduction'), - 'some-basics' => tuple('attributes', 'introduction'), - 'attribute-specification' => tuple('attributes', 'introduction'), - ], - 'built-in-types' => dict[ - 'arrays' => tuple('arrays-and-collections', 'introduction'), - 'function' => tuple('functions', 'introduction'), - 'enumerated-types' => tuple('built-in-types', 'enum'), - 'shapes' => tuple('built-in-types', 'shape'), - ], - 'callables' => dict[ - 'special-functions' => tuple('functions', 'anonymous-functions'), - ], - 'classes' => dict[ - 'some-basics' => tuple('classes', 'introduction'), - 'defining-a-basic-class' => tuple('classes', 'introduction'), - 'implementing-an-interface' => tuple('traits-and-interfaces', 'implementing-an-interface'), - 'trait-and-interface-requirements' => tuple('traits-and-interfaces', 'trait-and-interface-requirements'), - 'using-a-trait' => tuple('traits-and-interfaces', 'using-a-trait'), - - ], - 'disposables' => dict[ - 'introduction' => tuple('classes', 'object-disposal'), - ], - 'expressions-and-operators' => dict[ - 'addition' => tuple('expressions-and-operators', 'arithmetic'), - 'as' => tuple('expressions-and-operators', 'type-assertions'), - 'async-blocks' => tuple('asynchronous-operations', 'async-blocks'), - 'banning-lval-as-an-expression' => tuple('expressions-and-operators', 'introduction'), - 'bitwise-AND' => tuple('expressions-and-operators', 'bitwise-operators'), - 'bitwise-exclusive-OR' => tuple('expressions-and-operators', 'bitwise-operators'), - 'bitwise-inclusive-OR' => tuple('expressions-and-operators', 'bitwise-operators'), - 'bitwise-left-shift' => tuple('expressions-and-operators', 'bitwise-operators'), - 'bitwise-right-shift' => tuple('expressions-and-operators', 'bitwise-operators'), - 'closure-creation' => tuple('functions', 'anonymous-functions'), - 'conditional' => tuple('expressions-and-operators', 'ternary'), - 'division' => tuple('expressions-and-operators', 'arithmetic'), - 'exponentiation' => tuple('expressions-and-operators', 'arithmetic'), - 'function-call' => tuple('functions', 'introduction'), - 'instanceof' => tuple('expressions-and-operators', 'type-assertions'), - 'is' => tuple('expressions-and-operators', 'type-assertions'), - 'lambda-creation' => tuple('functions', 'anonymous-functions'), - 'logical-AND' => tuple('expressions-and-operators', 'logical-operators'), - 'logical-inclusive-OR' => tuple('expressions-and-operators', 'logical-operators'), - 'logical-NOT' => tuple('expressions-and-operators', 'logical-operators'), - 'multiplication' => tuple('expressions-and-operators', 'arithmetic'), - 'null-safe-member-selection' => tuple('expressions-and-operators', 'member-selection'), - 'ones-complement' => tuple('expressions-and-operators', 'bitwise-operators'), - 'operations-on-operands-having-one-or-more-subtypes' => tuple('types', 'type-refinement'), - 'relational' => tuple('expressions-and-operators', 'comparisons'), - 'restrictions-on-arithmetic-operations' => tuple('expressions-and-operators', 'arithmetic'), - 'remainder' => tuple('expressions-and-operators', 'arithmetic'), - 'some-basics' => tuple('expressions-and-operators', 'introduction'), - 'subtraction' => tuple('expressions-and-operators', 'arithmetic'), - 'unary-minus' => tuple('expressions-and-operators', 'arithmetic'), - 'unary-plus' => tuple('expressions-and-operators', 'arithmetic'), - 'XHP-attribute-spread' => tuple('XHP', 'introduction'), - 'readonly' => tuple('readonly', 'introduction') - ], - 'functions' => dict[ - 'defining-a-function' => tuple('functions', 'introduction'), - 'some-basics' => tuple('functions', 'introduction'), - 'calling-a-function' => tuple('functions', 'format-strings'), - ], - 'generics' => dict[ - 'constraints' => tuple('generics', 'type-constraints'), - 'open-and-closed-generic-types' => tuple('generics', 'type-erasure'), - 'reified-generics' => tuple('reified-generics', 'reified-generics'), - 'reified-generics-migration' => tuple('reified-generics', 'reified-generics-migration'), - 'some-basics' => tuple('generics', 'introduction'), - 'type-arguments' => tuple('generics', 'type-parameters'), - ], - 'operators' => dict[ - 'lambda' => tuple('functions', 'anonymous-functions'), - 'pipe' => tuple('expressions-and-operators', 'pipe'), - 'nullsafe' => - tuple('expressions-and-operators', 'member-selection'), - ], - 'other-features' => dict[ - 'autoloading' => - tuple('source-code-fundamentals', 'script-inclusion'), - 'constructor-parameter-promotion' => tuple('classes', 'constructors'), - 'placeholder-variable' => tuple('source-code-fundamentals', 'names'), - 'variadic-functions' => tuple('functions', 'introduction'), - ], - 'overview' => dict[ - 'typing' => tuple('types', 'introduction'), - ], - 'source-code-fundamentals' => dict[ - 'white-space' => tuple('source-code-fundamentals', 'introduction'), - 'operators-and-punctuators' => tuple('source-code-fundamentals', 'introduction'), - ], - 'statements' => dict[ - 'compound-statements' => tuple('statements', 'introduction'), - 'expression-statements' => tuple('expressions-and-operators', 'introduction'), - 'labeled-statements' => tuple('statements', 'switch'), - 'throw' => tuple('statements', 'try'), - ], - 'typechecker' => dict[ - 'editors' => tuple('getting-started', 'tools'), - 'modes' => tuple('source-code-fundamentals', 'program-structure'), - ], - 'types' => dict[ - 'anonymous-function-objects' => tuple('functions', 'anonymous-functions'), - 'annotations' => tuple('functions', 'introduction'), - 'arraykey' => tuple('built-in-types', 'arraykey'), - 'arrays' => tuple('arrays-and-collections', 'introduction'), - 'bool' => tuple('built-in-types', 'bool'), - 'casting' => tuple('types', 'type-conversion'), - 'classes' => tuple('classes', 'introduction'), - 'classname' => tuple('built-in-types', 'classname'), - 'dynamic' => tuple('built-in-types', 'dynamic'), - 'enumerated-types' => tuple('built-in-types', 'enum'), - 'float' => tuple('built-in-types', 'float'), - 'inference' => tuple('types', 'type-inferencing'), - 'int' => tuple('built-in-types', 'int'), - 'mixed' => tuple('built-in-types', 'mixed'), - 'nonnull' => tuple('built-in-types', 'nonnull'), - 'noreturn' => tuple('built-in-types', 'noreturn'), - 'null' => tuple('built-in-types', 'null'), - 'num' => tuple('built-in-types', 'num'), - 'refining' => tuple('types', 'type-refinement'), - 'resources' => tuple('built-in-types', 'resources'), - 'shapes' => tuple('built-in-types', 'shape'), - 'string' => tuple('built-in-types', 'string'), - 'summary-table' => tuple('types', null), - 'this' => tuple('built-in-types', 'this'), - 'tuples' => tuple('built-in-types', 'tuples'), - 'type-system' => tuple('types', null), - 'void' => tuple('built-in-types', 'void'), - ], - ], - ][$product] ?? - dict[]; - } - -} diff --git a/src/GuidesIndex.php b/src/GuidesIndex.php deleted file mode 100644 index 5efa18438..000000000 --- a/src/GuidesIndex.php +++ /dev/null @@ -1,163 +0,0 @@ -<?hh -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -use namespace HH\Lib\{C, Vec}; - -final class GuidesIndex { - public static function getIndex( - ): dict<GuidesProduct, dict<string, dict<string, string>>> { - return GuidesIndexData::getIndex(); - } - - public static function getProductIndex( - GuidesProduct $product, - ): dict<string, dict<string, string>> { - $index = self::getIndex(); - invariant( - C\contains_key($index, $product), - '%s is not in the guide index', - $product, - ); - return $index[$product]; - } - - private static function getCategories( - ): dict<GuidesProduct, dict<string, string>> { - return GuidesCategoryData::getData(); - } - - - private static function getSummaries( - ): dict<GuidesProduct, dict<string, string>> { - return GuidesSummaryData::getData(); - } - - public static function search(string $term): vec<SearchResult> { - $results = vec[]; - - $index = self::getIndex(); - foreach ($index as $product => $value) { - foreach ($value as $guide => $entry) { - foreach ($entry as $page => $filepath) { - $name = Guides::normalizeName($product, $guide, $page); - $score = SearchTermMatcher::matchTerm($name, $term); - if ($score !== null) { - if ($page === 'introduction') { - $score *= SearchScores::GUIDE_INTRODUCTION_MULTIPLIER; - } - $results[] = new GuidePageSearchResult( - $product, - $guide, - $page, - $score, - ); - continue; - } - $content = \file_get_contents(BuildPaths::GUIDES_HTML.'/'.$filepath); - if ($content === false) { - continue; - } - $content = \html_entity_decode(\strip_tags($content)); - $score = SearchTermMatcher::matchTerm($content, $term); - if ($score === null) { - continue; - } - $results[] = new GuidePageSearchResult( - $product, - $guide, - $page, - $score * SearchScores::CONTENT_MATCH_MULTIPLIER, - ); - } - } - } - - return $results; - } - - public static function getProducts(): vec<string> { - return Vec\keys(self::getIndex()); - } - - public static function getGuides(GuidesProduct $product): vec<string> { - $index = self::getIndex(); - invariant( - C\contains_key($index, $product), - '%s is not in the guide index', - $product, - ); - return Vec\keys($index[$product]); - } - - public static function getPages( - GuidesProduct $product, - string $guide, - ): vec<string> { - $index = self::getIndex(); - invariant(C\contains_key($index, $product), 'no guides for %s', $product); - invariant( - C\contains_key($index[$product], $guide), - '%s does not contain a %s guide', - $product, - $guide, - ); - return Vec\keys(self::getIndex()[$product][$guide]); - } - - public static function getFileForCategory( - GuidesProduct $product, - string $guide, - ): string { - $categories = self::getCategories(); - $path = $categories[$product][$guide] ?? null; - invariant( - $path !== null, - 'Product %s does not contain category %s', - $product, - $guide, - ); - return __DIR__.'/../guides/'.$categories[$product][$guide]; - } - - public static function getFileForSummary( - GuidesProduct $product, - string $guide, - ): string { - $summaries = self::getSummaries(); - $path = $summaries[$product][$guide] ?? null; - invariant( - $path !== null, - 'Product %s does not contain summary %s', - $product, - $guide, - ); - return __DIR__.'/../guides/'.$summaries[$product][$guide]; - } - - public static function getFileForPage( - GuidesProduct $product, - string $guide, - string $page, - ): string { - $index = self::getIndex(); - $entry = $index[$product][$guide][$page] ?? null; - invariant( - $entry !== null, - 'Guide %s/%s does not include page %s', - $product, - $guide, - $page, - ); - return BuildPaths::GUIDES_HTML.'/'.$entry; - } -} diff --git a/src/GuidesNavData.php b/src/GuidesNavData.php deleted file mode 100644 index 664745f8e..000000000 --- a/src/GuidesNavData.php +++ /dev/null @@ -1,72 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ -namespace HHVM\UserDocumentation; - -final class GuidesNavData { - public static function getNavData(): dict<string, NavDataNode> { - $nav_data = dict[]; - foreach (GuidesIndex::getIndex() as $name => $product_guides) { - $nav_data[$name] = shape( - 'name' => $name, - 'urlPath' => URLBuilder::getPathForProductGuides($name), - 'children' => self::getNavDataForProduct( - GuidesProduct::assert($name), - $product_guides, - ), - ); - } - return $nav_data; - } - - private static function getNavDataForProduct( - GuidesProduct $product, - dict<string, dict<string, string>> $product_guides, - ): dict<string, NavDataNode> { - $nav_data = dict[]; - foreach ($product_guides as $topic => $pages) { - $name = self::pathToName($topic); - $nav_data[$name] = shape( - 'name' => $name, - 'urlPath' => URLBuilder::getPathForGuide($product, $topic), - 'children' => self::getNavDataForGuide($product, $topic, $pages), - ); - } - return $nav_data; - } - - private static function getNavDataForGuide( - GuidesProduct $product, - string $topic, - dict<string, string> $pages, - ): dict<string, NavDataNode> { - $nav_data = dict[]; - foreach ($pages as $title => $_html_file) { - $name = self::pathToName($title); - $nav_data[$name] = shape( - 'name' => $name, - 'urlPath' => URLBuilder::getPathForGuidePage($product, $topic, $title), - 'children' => dict[], - ); - } - return $nav_data; - } - - public static function pathToName(string $name): string { - switch ($name) { - case 'hh_server': - return $name; - case 'faq': - return 'FAQ'; - default: - return \ucwords(\strtr($name, '-', ' ')); - } - } -} diff --git a/src/LegacyRedirects.php b/src/LegacyRedirects.php deleted file mode 100644 index 999e8495d..000000000 --- a/src/LegacyRedirects.php +++ /dev/null @@ -1,151 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -abstract final class LegacyRedirects { - public static function getUrlForId(string $id): ?string { - $ids = vec[$id, \strtr($id, '.', '-'), \strtr($id, '-', '.')]; - - foreach ($ids as $id) { - $url = self::getUrlForExactId($id); - if ($url !== null) { - return $url; - } - } - - return null; - } - - private static function getUrlForExactId(string $id): ?string { - // Since the API redirects are quite specific, see if we are redirecting - // from there first. - $url = idx(APILegacyRedirectData::getIndex(), $id); - if ($url !== null) { - return $url; - } - - // If not, iterate through our manual redirects and see if we have - // $from being a string part of $id. If so, then we can redirect to the - // appropriate place. - foreach (self::getManualRedirectData() as $from => $to) { - if (\stripos($id, $from) !== false) { - return $to; - } - } - return null; - } - - private static function getManualRedirectData(): Map<string, string> { - return Map { - 'index' => '/', - 'hacklangref' => '/hack/', - 'asio.wrappedexception' => - '/hack/reference/class/HH.Asio.WrappedException/', - 'asio.wrappedresult' => '/hack/reference/class/HH.Asio.WrappedResult/', - 'asio.resultexceptionwrapper' => - '/hack/reference/interface/HH.Asio.ResultOrExceptionWrapper/', - 'asio.resultorexceptionwrapper' => - '/hack/reference/interface/HH.Asio.ResultOrExceptionWrapper/', - 'async.mysql.asyncmysqlclient' => - '/hack/reference/class/AsyncMysqlClient/', - 'async.mysql.asyncmysqlclientstats' => - '/hack/reference/class/AsyncMysqlClientStats/', - 'async.mysql.asyncmysqlconnectresult' => - '/hack/reference/class/AsyncMysqlConnectResult/', - 'async.mysql.asyncmysqlconnection' => - '/hack/reference/class/AsyncMysqlConnection/', - 'async.mysql.asyncmysqlconnectionpool' => - '/hack/reference/class/AsyncMysqlConnectionPool/', - 'async.mysql.asyncmysqlerrorresult' => - '/hack/reference/class/AsyncMysqlErrorResult/', - 'async.mysql.asyncmysqlqueryerrorresult' => - '/hack/reference/class/AsyncQueryErrorResult/', - 'async.mysql.asyncmysqlqueryresult' => - '/hack/reference/class/AsyncMysqlQueryResult/', - 'async.mysql.asyncmysqlrow' => '/hack/reference/class/AsyncMysqlRow/', - 'async.mysql.asyncmysqlrowblock' => - '/hack/reference/class/AsyncMysqlRowBlock/', - 'async.mysql.asyncmysqlrowblockiterator' => - '/hack/reference/class/AsyncMysqlRowBlockIterator/', - 'async.mysql.asyncmysqlrowiterator' => - '/hack/reference/class/AsyncMysqlRowIterator/', - 'hack.intro' => '/hack/overview/introduction', - 'hack.arrays' => '/hack/collections/introduction', - 'hack.async' => '/hack/async/introduction', - 'hack.attributes' => '/hack/attributes/introduction', - 'hack.collections.vector' => '/hack/reference/class/Vector/', - 'hack.collections.set' => '/hack/reference/class/Set/', - 'hack.collections.pair' => '/hack/reference/class/Pair/', - 'hack.collections.map' => '/hack/reference/class/Map/', - 'hack.collections.immvector' => '/hack/reference/class/ImmVector/', - 'hack.collections.immset' => '/hack/reference/class/ImmSet/', - 'hack.collections.immmap' => '/hack/reference/class/ImmMap/', - 'hack.collections' => '/hack/collections/introduction', - 'hack.constructorargumentpromotion' => - '/hack/other-features/constructor-parameter-promotion', - 'hack.enums' => '/hack/enums/introduction', - 'hack.generics' => '/hack/generics/introduction', - 'modes' => '/hack/typechecker/modes', - 'hack.lambda' => '/hack/lambdas/introduction', - 'hack.methoddispatch' => '/hack/', - 'hack.nullable' => '/hack/types/type-system#nullable', - 'hack.otherrulesandfeatures' => '/hack/other-features/introduction', - 'hack.predefined.interfaces' => '/hack/reference/interface/', - 'hack.shapes' => '/hack/shapes/introduction', - 'hack.traits' => '/hack/other-features/trait-and-interface-requirements', - 'hack.tuples' => '/hack/tuples/introduction', - 'hack.typealiasing' => '/hack/type-aliases/introduction', - 'hack.annotations' => '/hack/types/annotations', - 'hack.unsupported' => '/hack/', - 'hack.xhp' => '/hack/XHP/introduction', - 'hackfuncref' => '/hack/reference/', - 'book.hackcollections' => '/hack/collections/introduction', - 'intro.collections' => '/hack/collection/introduction', - 'book.enums' => '/hack/enums/introduction', - 'intro.enums' => '/hack/enums/introduction', - 'ref.enums' => '/hack/enums/functions', - 'function.hack.enums' => '/hack/enums/functions', - 'intro.hackmagic' => '/hack/callables/special-functions', - 'ref.hackmagic' => '/hack/callables/special-functions', - 'function.hack.invariant' => '/hack/types/refining#invariant', - 'function.hack.fun' => '/hack/callables/special-functions', - 'function.hack.class_meth' => '/hack/callables/special-functions', - 'function.hack.inst_meth' => '/hack/callables/special-functions', - 'function.hack.meth_caller' => '/hack/callables/special-functions', - 'book.hack.async.mysql' => '/hack/async/extensions#mysql', - 'intro.hack.async.mysql' => '/hack/async/extensions#mysql', - 'hack.async.mysql.examples' => '/hack/async/extensions#mysql', - 'book.hack.mcrouter' => '/hack/async/extensions#mcrouter', - 'intro.hack.mcrouter' => '/hack/async/extensions#mcrouter', - 'intro.mcrouter' => '/hack/async/extensions#mcrouter', - 'hack.mcrouter.examples' => '/hack/async/extensions#mcrouter', - 'intro.asio' => '/hack/async/utility-functions', - 'hack.ref.asio' => '/hack/async/utility-functions', - 'hack.asio.function' => '/hack/async/utility-functions', - 'ini.list' => '/hhvm/configuration/INI-settings', - 'install.fastcgi' => '/hhvm/advanced-usage/fastCGI', - 'install.linux' => '/hhvm/installation/linux', - 'install.extensions' => '/hhvm/extensions/introduction', - 'install-intro' => '/hhvm/installation/introduction', - 'install-xhp' => '/hack/XHP/introduction#the-xhp-lib-library', - 'install-hack' => '/hack/typechecker/install', - 'install.hack.bootstrapping' => '/hack/getting-started/getting-started', - 'install.hack.conversion' => '/hack/tools/introduction', - 'install.hack' => '/hack/getting-started/getting-started', - 'hack' => '/hack/', - 'configuration.zend.compat' => - '/hhvm/configuration/INI-settings#feature-flags', - 'intro-what-can-hhvm-do' => '/hhvm/getting-started/getting-started', - 'docshhvmimprovedsearch' => '/', - }; - } -} diff --git a/src/StaticResourceMap.php b/src/StaticResourceMap.php deleted file mode 100644 index 9af9d1751..000000000 --- a/src/StaticResourceMap.php +++ /dev/null @@ -1,46 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ -namespace HHVM\UserDocumentation; - -use namespace Facebook\TypeAssert; -use namespace HH\Lib\Dict; - -class StaticResourceMap { - private static function getMap(): dict<string, StaticResourceMapEntry> { - return apc_fetch_or_set_class_data( - self::class, - () ==> \file_get_contents(BuildPaths::STATIC_RESOURCES_MAP_JSON) - |> JSON\decode_as_dict($$) - |> Dict\map( - $$, - $value ==> TypeAssert\matches_type_structure( - type_alias_structure(StaticResourceMapEntry::class), - $value, - ), - ), - ); - } - - public static function getEntryForFile( - string $filename, - ): StaticResourceMapEntry { - $entry = self::getNullableEntryForFile($filename); - invariant($entry !== null, "Couldn't find entry in static resources map"); - return $entry; - } - - public static function getNullableEntryForFile( - string $filename, - ): ?StaticResourceMapEntry { - $map = self::getMap(); - return $map[$filename] ?? null; - } -} diff --git a/src/api-gen/DataMerger.php b/src/api-gen/DataMerger.php deleted file mode 100644 index eb6d9223e..000000000 --- a/src/api-gen/DataMerger.php +++ /dev/null @@ -1,671 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -use type Facebook\HHAPIDoc\Documentable; -use type Facebook\DefinitionFinder\{ - AbstractnessToken, - FinalityToken, - ScannedClass, - ScannedClassish, - ScannedConstant, - ScannedDefinition, - ScannedFunction, - ScannedGeneric, - ScannedInterface, - ScannedMethod, - ScannedNewtype, - ScannedParameter, - ScannedProperty, - ScannedTrait, - ScannedType, - ScannedTypehint, - StaticityToken, - VarianceToken, - VisibilityToken, -}; - -use namespace Facebook\TypeAssert; -use namespace HH\Lib\{C, Dict, Keyset, Math, Str, Vec}; - -final class DataMerger { - private static function normalizeNameForMerge(string $name): string { - return $name - |> Str\strip_prefix($$, "HH\\Lib\\Experimental\\") - |> Str\strip_prefix($$, "HH\\Lib\\") - |> Str\strip_prefix($$, "HH\\"); - } - - public static function mergeAll(vec<Documentable> $in): vec<Documentable> { - /* We start by throwing any documentables with parents (e.g. methods - * have a class as a parent), as we need to de-dupe the parents first; - * the children are de-duped as part of that process, so we can extract - * them from the parents after */ - $top_level = $in - |> Vec\filter( - $$, - $d ==> $d['parent'] === null && - !( - $d['definition'] is ScannedType || - $d['definition'] is ScannedNewtype - ), - ) - |> Dict\group_by($$, $item ==> self::getMergeKey($item)) - |> Vec\map( - $$, - $items ==> { - $first = C\firstx($items); - $rest = Vec\drop($items, 1); - if (C\is_empty($rest)) { - return $first; - } - $merged = $first; - foreach ($rest as $item) { - $merged = self::mergePair($merged, $item); - } - return $merged; - }, - ); - - $methods = $top_level - |> Vec\map( - $$, - $parent ==> { - $def = $parent['definition']; - if ($def is ScannedClassish) { - // Type refinement - $parent['definition'] = $def; - return $parent; - } - return null; - }, - ) - |> Vec\filter_nulls($$) - |> Vec\map( - $$, - $parent ==> Vec\map( - $parent['definition']->getMethods(), - $method ==> shape( - 'definition' => $method, - 'parent' => $parent['definition'], - 'sources' => $parent['sources'], - ), - ), - ) - |> Vec\flatten($$); - return Vec\concat($top_level, $methods) - |> Vec\sort_by($$, $d ==> $d['definition']->getName()); - } - - private static function mergePair( - Documentable $a, - ?Documentable $b, - ): Documentable { - if ($b === null) { - return $a; - } - - $parent = $a['parent']; - if ($parent) { - $parent = self::mergeDefinitionPair($parent, $b['parent']) - as ScannedClassish; - } else { - $parent = $b['parent']; - } - - $def = self::mergeDefinitionPair($a['definition'], $b['definition']); - return shape( - 'parent' => $parent, - 'sources' => vec(Keyset\union($a['sources'], $b['sources'])), - 'definition' => $def, - ); - } - - private static function mergeDefinitionPair<T as ScannedDefinition>( - T $a, - ?T $b, - ): ScannedDefinition { - if ($b === null) { - return $a; - } - - if ($a is ScannedClassish) { - return self::mergeClassishPair($a, $b); - } - - if ($a is ScannedFunction) { - return self::mergeFunctionPair($a, $b); - } - - if ($a is ScannedMethod) { - return self::mergeMethodPair($a, $b); - } - - if ($a is ScannedConstant) { - return self::mergeConstantPair($a, $b); - } - - if ($a is ScannedProperty) { - return self::mergePropertyPair($a, $b); - } - - invariant_violation('Unhandled type %s', \get_class($a)); - } - - private static function mergePropertyPair( - ScannedProperty $a, - ScannedDefinition $b, - ): ScannedProperty { - $b = $b as ScannedProperty; - - invariant( - $a->isStatic() === $b->isStatic(), - 'Property %s has both static and non-static definitions', - $a->getName(), - ); - - $visibility = VisibilityToken::T_PUBLIC; - if ($a->isPrivate() || $b->isPrivate()) { - $visibility = VisibilityToken::T_PRIVATE; - } else if ($a->isProtected() || $b->isProtected()) { - $visibility = VisibilityToken::T_PROTECTED; - } - - return new ScannedProperty( - $a->getASTx(), - self::mergeNames($a->getName(), $b->getName()), - $a->getContext(), - self::mergeAttributes($a->getAttributes(), $b->getAttributes()), - self::mergeDocComments($a->getDocComment(), $b->getDocComment()), - self::mergeTypehintPair($a->getTypehint(), $b->getTypehint()), - $visibility, - $a->isStatic() ? StaticityToken::IS_STATIC : StaticityToken::NOT_STATIC, - $a->getDefault() ?? $b->getDefault(), - ); - } - - private static function mergeConstantPair( - ScannedConstant $a, - ScannedDefinition $b, - ): ScannedConstant { - $b = $b as ScannedConstant; - - $value = $a->getValue(); - if ($value->hasStaticValue()) { - $v = $value->getStaticValue(); - if ($v === null || $v === '' || $v === 0 || $v === 0.0) { - $value = $b->getValue(); - } - } - - return new ScannedConstant( - $a->getASTx(), - self::mergeNames($a->getName(), $b->getName()), - $a->getContext(), - self::mergeDocComments($a->getDocComment(), $b->getDocComment()), - $value, - self::mergeTypehintPair($a->getTypehint(), $b->getTypehint()), - ($a->isAbstract() || $b->isAbstract()) - ? AbstractnessToken::IS_ABSTRACT - : AbstractnessToken::NOT_ABSTRACT, - ); - } - - private static function mergeDefinitionListsByName<T as ScannedDefinition>( - vec<T> $a, - vec<T> $b, - ): vec<T> { - $in = Vec\concat($a, $b); - - $merged = dict[]; - foreach ($in as $def) { - $key = self::normalizeNameForMerge($def->getName()); - $merged[$key] = self::mergeDefinitionPair($def, $merged[$key] ?? null); - } - return vec(/* HH_FIXME[4110] need reified generics*/ $merged); - } - - private static function mergeGenerics( - vec<ScannedGeneric> $a, - vec<ScannedGeneric> $b, - ): vec<ScannedGeneric> { - if (C\is_empty($a)) { - return $b; - } - if (C\is_empty($b)) { - return $a; - } - - $grouped = Dict\group_by( - Vec\concat($a, $b), - $generic ==> self::normalizeNameForMerge($generic->getName()), - ); - - $generics = vec[]; - foreach ($grouped as $for_type) { - $name = C\firstx($for_type)->getName(); - $variance = VarianceToken::INVARIANT; - foreach ($for_type as $generic) { - if (Str\starts_with($generic->getName(), "HH\\")) { - $name = $generic->getName(); - } - if ($generic->isContravariant()) { - $variance = VarianceToken::CONTRAVARIANT; - } else if ($generic->isCovariant()) { - $variance = VarianceToken::COVARIANT; - } - } - $constraints = $for_type - |> Vec\map($$, $g ==> $g->getConstraints()) - |> Vec\flatten($$) - |> Dict\group_by( - $$, - $c ==> self::normalizeNameForMerge($c['type']->getTypeText()), - ) - |> Vec\map( - $$, - $constraints_for_type ==> { - $type = C\firstx($constraints_for_type)['type']; - foreach ($constraints_for_type as $constraint) { - if (Str\starts_with($constraint['type']->getTypeText(), "HH\\")) { - $type = $constraint['type']; - break; - } - } - return $constraints_for_type - |> Keyset\map($$, $c ==> $c['relationship']) - |> Vec\map( - $$, - $r ==> shape('type' => $type, 'relationship' => $r), - ); - }, - ) - |> Vec\flatten($$); - $generics[] = new ScannedGeneric($name, $variance, $constraints); - } - return $generics; - } - - private static function mergeTypehintLists( - vec<ScannedTypehint> $a, - vec<ScannedTypehint> $b, - ): vec<ScannedTypehint> { - if (C\is_empty($a)) { - return $b; - } - if (C\is_empty($b)) { - return $a; - } - - return Vec\concat($a, $b) - |> Dict\group_by( - $$, - $th ==> self::normalizeNameForMerge($th->getTypeName()), - ) - |> Vec\map( - $$, - $typehints ==> { - $first = C\firstx($typehints); - if (C\count($typehints) === 1) { - return $first; - } - $rest = Vec\drop($typehints, 1); - - $generics = $first->getGenericTypes(); - $kind = $first->getKind(); - $name = $first->getTypeName(); - $nullable = $first->isNullable(); - $shape_fields = $first->isShape() ? $first->getShapeFields() : null; - $function_typehints = $first->getFunctionTypehints(); - - foreach ($rest as $th) { - $name = self::mergeNames($name, $th->getTypeName()); - $kind ??= $th->getKind(); - $nullable = $nullable || $th->isNullable(); - $generics = self::mergeTypehintLists( - $generics, - $th->getGenericTypes(), - ); - if ($th->isShape()) { - $shape_fields = $th->getShapeFields(); - } - $function_typehints ??= $th->getFunctionTypehints(); - } - return new ScannedTypehint( - $first->getAST(), - $kind, - $name, - $generics, - $name !== 'mixed' && $nullable, - $shape_fields, - $function_typehints, - ); - }, - ); - } - - private static function mergeNames(string $a, string $b): string { - if ($a === 'mixed') { - return $b; - } - if ($b === 'mixed') { - return $a; - } - if ($a === 'object' || $a === "HH\\object") { - return $b; - } - if ($b === 'object' || $b === "HH\\object") { - return $a; - } - - if (Str\starts_with($a, "HH\\")) { - return $a; - } - if (Str\starts_with($b, "HH\\")) { - return $b; - } - return (Str\length($a) > Str\length($b)) ? $a : $b; - } - - private static function mergeTypehintPair< - T as ?ScannedTypehint super ?ScannedTypehint, - >(T $a, ?T $b): T { - if ($b === null) { - return $a; - } - if ($a === null) { - return $b; - } - - return new ScannedTypehint( - $a->getAST(), - $a->getKind() ?? $b->getKind(), - self::mergeNames($a->getTypeName(), $b->getTypeName()), - self::mergeTypehintLists($a->getGenericTypes(), $b->getGenericTypes()), - ($a->isNullable() || $b->isNullable()), - $a->isShape() - ? $a->getShapeFields() - : ($b->isShape() ? $b->getShapeFields() : null), - $a->getFunctionTypehints() ?? $b->getFunctionTypehints(), - ); - } - - private static function mergeAttributes( - dict<string, vec<mixed>> $a, - ?dict<string, vec<mixed>> $b, - ): dict<string, vec<mixed>> { - if ($b === null) { - return $a; - } - if (C\is_empty($a)) { - return $b; - } - if (C\is_empty($b)) { - return $a; - } - $keys = Keyset\union(Keyset\keys($a), Keyset\keys($b)); - return Dict\map( - $keys, - $key ==> { - $merged = Vec\concat($a[$key] ?? vec[], $b[$key] ?? vec[]); - $values = vec[]; - foreach ($merged as $value) { - if (!C\contains($values, $value)) { - $values[] = $value; - } - } - return $values; - }, - ); - } - - private static function mergeDocComments(?string $a, ?string $b): ?string { - // This almost always means we picked up a file header instead of an actual - // doc comment. - if (Str\contains((string)$a, 'Copyright')) { - $a = null; - } - if (Str\contains((string)$b, 'Copyright')) { - $b = null; - } - if ($a === null) { - return $b; - } - if ($b === null) { - return $a; - } - - return (Str\length($a) > Str\length($b)) ? $a : $b; - } - - private static function mergeFunctionPair( - ScannedFunction $a, - ScannedDefinition $b, - ): ScannedFunction { - $b = $b as ScannedFunction; - return new ScannedFunction( - $a->getASTx(), - self::mergeNames($a->getName(), $b->getName()), - $a->getContext(), - self::mergeAttributes($a->getAttributes(), $b->getAttributes()), - self::mergeDocComments($a->getDocComment(), $b->getDocComment()), - self::mergeGenerics($a->getGenericTypes(), $b->getGenericTypes()), - self::mergeTypehintPair($a->getReturnType(), $b->getReturnType()), - self::mergeParameterLists($a->getParameters(), $b->getParameters()), - ); - } - - private static function mergeMethodPair( - ScannedMethod $a, - ScannedDefinition $b, - ): ScannedMethod { - $b = $b as ScannedMethod; - - if ($a->isPrivate() || $b->isPrivate()) { - $visibility = VisibilityToken::T_PRIVATE; - } else if ($a->isProtected() || $b->isProtected()) { - $visibility = VisibilityToken::T_PROTECTED; - } else { - $visibility = VisibilityToken::T_PUBLIC; - } - $a_attributes = $a->getAttributes(); - - // Can't give reasonable documentation for this, so mark it as nodoc - if ($a->isStatic() !== $b->isStatic()) { - \fprintf( - \STDERR, - "\n Warning: Method %s has both a static and non-static ". - "definition:\n- %s:%d\n- %s:%d\n- NOT DOCUMENTING THIS FUNCTION\n", - $a->getName(), - $a->getFileName(), - $a->getPosition()['line'] ?? 0, - $b->getFileName(), - $b->getPosition()['line'] ?? 0, - ); - $a_attributes['NoDoc'] = Vec\concat( - $a_attributes['NoDoc'] ?? vec[], - vec[self::class, 'static and non static definitions'], - ); - } - - if ($a->isAbstract() !== $b->isAbstract()) { - \fprintf( - \STDERR, - "\nWarning: Method %s has both an abstract and non-abstract ". - "definition:\n- %s:%d\n- %s:%d\n", - $a->getName(), - $a->getFileName(), - $a->getPosition()['line'] ?? 0, - $b->getFileName(), - $b->getPosition()['line'] ?? 0, - ); - } - - if ($a->isFinal() !== $b->isFinal()) { - \fprintf( - \STDERR, - "\nWarning: Method %s has both a final and non-final definition:\n". - "- %s:%d\n- %s:%d\n", - $a->getName(), - $a->getFileName(), - $a->getPosition()['line'] ?? 0, - $b->getFileName(), - $b->getPosition()['line'] ?? 0, - ); - } - - return new ScannedMethod( - $a->getASTx(), - self::mergeNames($a->getName(), $b->getName()), - $a->getContext(), - self::mergeAttributes($a_attributes, $b->getAttributes()), - self::mergeDocComments($a->getDocComment(), $b->getDocComment()), - self::mergeGenerics($a->getGenericTypes(), $b->getGenericTypes()), - self::mergeTypehintPair($a->getReturnType(), $b->getReturnType()), - self::mergeParameterLists($a->getParameters(), $b->getParameters()), - $visibility, - $a->isStatic() ? StaticityToken::IS_STATIC : StaticityToken::NOT_STATIC, - ($a->isAbstract() || $b->isAbstract()) - ? AbstractnessToken::IS_ABSTRACT - : AbstractnessToken::NOT_ABSTRACT, - ($a->isFinal() || $b->isFinal()) - ? FinalityToken::IS_FINAL - : FinalityToken::NOT_FINAL, - ); - } - - private static function mergeParameterLists( - vec<ScannedParameter> $a, - vec<ScannedParameter> $b, - ): vec<ScannedParameter> { - $ac = C\count($a); - $bc = C\count($b); - $count = Math\minva($ac, $bc); - if ($count === 0) { - return vec[]; - } - - return Vec\map( - \range(0, $count - 1), - $i ==> self::mergeParameterPair($a[$i], $b[$i]), - ); - } - - private static function mergeParameterPair( - ScannedParameter $a, - ScannedParameter $b, - ): ScannedParameter { - $visibility = null; - if ($a->__isPromoted()) { - $visibility = $a->__getVisibility(); - } else if ($b->__isPromoted()) { - $visibility = $b->__getVisibility(); - } - $default = null; - if ($a->isOptional()) { - $default = $a->getDefault(); - } - if ($b->isOptional()) { - $bds = TypeAssert\not_null($b->getDefault()); - if ( - $default === null || - Str\length($bds->getAST()->getCode()) > - Str\length($default->getAST()->getCode()) - ) { - $default = $bds; - } - } - - return new ScannedParameter( - $a->getASTx(), - self::mergeNames($a->getName(), $b->getName()), - $a->getContext(), - self::mergeAttributes($a->getAttributes(), $b->getAttributes()), - self::mergeDocComments($a->getDocComment(), $b->getDocComment()), - self::mergeTypehintPair($a->getTypehint(), $b->getTypehint()), - $a->isInOut() || $b->isInOut(), - $a->isVariadic() || $b->isVariadic(), - $default, - $visibility, - ); - } - - private static function mergeClassishPair( - ScannedClassish $a, - ScannedDefinition $b, - ): ScannedClassish { - $b = $b as ScannedClassish; - - $name = self::mergeNames($a->getName(), $b->getName()); - - $agc = C\count($a->getGenericTypes()); - $bgc = C\count($b->getGenericTypes()); - invariant( - $agc === 0 || $bgc === 0 || $agc === $bgc, - '%s has differing numbers of generics', - $name, - ); - - if ($a is ScannedClass) { - $class = ScannedClass::class; - } else if ($a is ScannedInterface) { - $class = ScannedInterface::class; - } else if ($a is ScannedTrait) { - $class = ScannedTrait::class; - } else { - invariant_violation("Don't know how to handle class %s", \get_class($a)); - } - - return new $class( - $a->getASTx(), - $name, - $a->getContext(), - self::mergeAttributes($a->getAttributes(), $b->getAttributes()), - self::mergeDocComments($a->getDocComment(), $b->getDocComment()), - self::mergeDefinitionListsByName($a->getMethods(), $b->getMethods()), - self::mergeDefinitionListsByName( - $a->getProperties(), - $b->getProperties(), - ), - self::mergeDefinitionListsByName($a->getConstants(), $b->getConstants()), - self::mergeDefinitionListsByName( - $a->getTypeConstants(), - $b->getTypeConstants(), - ), - self::mergeGenerics($a->getGenericTypes(), $b->getGenericTypes()), - self::mergeTypehintPair( - $a->getParentClassInfo(), - $b->getParentClassInfo(), - ), - self::mergeTypehintLists($a->getInterfaceInfo(), $b->getInterfaceInfo()), - self::mergeTypehintLists($a->getTraitInfo(), $b->getTraitInfo()), - ($a->isAbstract() || $b->isAbstract()) - ? AbstractnessToken::IS_ABSTRACT - : AbstractnessToken::NOT_ABSTRACT, - ($a->isFinal() || $b->isFinal()) - ? FinalityToken::IS_FINAL - : FinalityToken::NOT_FINAL, - ); - } - - private static function getMergeKey(Documentable $def): string { - $parent = $def['parent']; - $def = $def['definition']; - if ($parent) { - $name = self::normalizeNameForMerge($parent->getName()).'::'; - } else { - $name = ''; - } - $name .= self::normalizeNameForMerge($def->getName()); - return \get_class($def).'$'.$name; - } -} diff --git a/src/api-gen/HTMLPaths.php b/src/api-gen/HTMLPaths.php deleted file mode 100644 index 33ca551e2..000000000 --- a/src/api-gen/HTMLPaths.php +++ /dev/null @@ -1,50 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ -namespace HHVM\UserDocumentation; - -use type Facebook\HHAPIDoc\IPathProvider; - -final class HTMLPaths implements IPathProvider<string> { - use HHAPIDocExt\APIDefinitionTypeBasedPathProvider<string>; - private MarkdownPaths $mdPaths; - - private function __construct(APIProduct $product) { - $this->mdPaths = MarkdownPaths::get($product); - } - - <<__Memoize>> - public static function get(APIProduct $product): this { - return new self($product); - } - - public function getPathForClassish( - APIDefinitionType $type, - string $class, - ): string { - return $this->mdPaths->getPathForClassish($type, $class) - |> APIHTMLBuildStep::getOutputFileName($$); - } - - public function getPathForClassishMethod( - APIDefinitionType $type, - string $class, - string $method, - ): string { - return $this->mdPaths->getPathForClassishMethod($type, $class, $method) - |> APIHTMLBuildStep::getOutputFileName($$); - } - - public function getPathForFunction(string $function): string { - return $this->mdPaths->getPathForFunction($function) - |> APIHTMLBuildStep::getOutputFileName($$); - } - -} diff --git a/src/api-gen/MarkdownPaths.php b/src/api-gen/MarkdownPaths.php deleted file mode 100644 index 246eb9d1d..000000000 --- a/src/api-gen/MarkdownPaths.php +++ /dev/null @@ -1,58 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ -namespace HHVM\UserDocumentation; - -use type Facebook\HHAPIDoc\IPathProvider; -use namespace HH\Lib\Str; - -final class MarkdownPaths implements IPathProvider<string> { - use HHAPIDocExt\APIDefinitionTypeBasedPathProvider<string>; - - private function __construct(private APIProduct $product) { - } - - <<__Memoize>> - public static function get(APIProduct $product): this { - return new self($product); - } - - public function getPathForClassish( - APIDefinitionType $type, - string $class, - ): string { - return \sprintf( - '%s/%s/%s.%s.md', - BuildPaths::APIDOCS_MARKDOWN, - $this->product, - $type, - Str\replace($class, "\\", '.'), - ); - } - - public function getPathForClassishMethod( - APIDefinitionType $type, - string $class, - string $method, - ): string { - return $this->getPathForClassish($type, $class) - |> Str\strip_suffix($$, '.md') - |> $$.\sprintf('.method.%s.md', $method); - } - - public function getPathForFunction(string $function): string { - return \sprintf( - '%s/%s/function.%s.md', - BuildPaths::APIDOCS_MARKDOWN, - $this->product, - Str\replace($function, "\\", '.'), - ); - } -} diff --git a/src/api-gen/ScannedDefinitionFilters.php b/src/api-gen/ScannedDefinitionFilters.php deleted file mode 100644 index 0aa799bcb..000000000 --- a/src/api-gen/ScannedDefinitionFilters.php +++ /dev/null @@ -1,257 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -use type Facebook\DefinitionFinder\{ - HasScannedGenerics, - ScannedClassish, - ScannedDefinition, - ScannedFunction, - ScannedFunctionish, - ScannedMethod, - ScannedNewtype, - ScannedType, -}; - -use namespace HH\Lib\{C, Regex, Str}; - -abstract final class ScannedDefinitionFilters { - public static function isHHSpecific(ScannedDefinition $def): bool { - $normalized_name = $def->getName() - |> Str\lowercase($$) - |> Regex\replace($$, re"/[^a-z0-9]/", '-'); - - if ( - $def is ScannedClassish && - !C\contains_key(self::getPHPList('classes'), $normalized_name) || - $def is ScannedFunction && - !C\contains_key(self::getPHPList('functions'), $normalized_name) - ) { - // Function/class does not exist in PHP. - return true; - } - - // At this point, we know the function/class exists in PHP, but the HHVM - // version might be sufficiently different (e.g. uses generics) to warrant - // inclusion in the HHVM docs anyway. - - if (C\contains_key($def->getAttributes(), '__HipHopSpecific')) { - return true; - } - - if ($def is HasScannedGenerics && $def->getGenericTypes()) { - return true; - } - - if ($def is ScannedClassish) { - foreach ($def->getMethods() as $method) { - if (self::isHHSpecific($method)) { - return true; - } - } - } - - if (!$def is ScannedFunctionish) { - return false; - } - - if ($def->getReturnType()?->getTypeName() === 'Awaitable') { - return true; - } - - if ( - $def->getReturnType()?->getTypeName() === 'ExternalThreadEventWaitHandle' - ) { - return true; - } - return false; - } - - <<__Memoize>> - private static function getPHPList(string $type): keyset<string> { - return Str\format('%s/api-php/php-%s.list', LocalConfig::ROOT, $type) - |> \file_get_contents($$) - |> Str\trim($$) - |> Str\split($$, "\n") - |> keyset($$); - } - - public static function shouldNotDocument(ScannedDefinition $def): bool { - return ( - ( - // non-namespaced name starts with _ - Str\starts_with($def->getName(), '_') && !($def is ScannedMethod) - ) || - Str\contains($def->getName(), '\\_') // namespaced name starts with _ - || - Str\contains($def->getName(), 'WaitHandle') || - Str\contains($def->getName(), "\\Rx\\") || - ($def->getAttributes()['NoDoc'] ?? null) !== null || - self::isBlacklisted($def) || - ( - Str\contains($def->getFileName(), 'api-sources/hhvm/') && - self::isUndefinedFunction($def) - ) || - ( - Str\starts_with($def->getName(), 'Lazy') && - Str\contains($def->getName(), 'Itera') - ) || - $def is ScannedType || - $def is ScannedNewtype - ); - } - - private static function isUndefinedFunction(ScannedDefinition $def): bool { - if (!$def is ScannedFunction) { - return false; - } - if (self::isHHSpecific($def)) { - return false; - } - $path = $def->getFileName(); - if ( - !( - Str\starts_with($path, BuildPaths::HHVM_TREE) && - Str\ends_with($path, '.hhi') - ) - ) { - return false; - } - $name = $def->getName(); - if ( - \function_exists($name, /* autoload = */ false) || - \function_exists("HH\\".$name, /* autoload = */ false) - ) { - return false; - } - Log::w("\nUndefined function: ".$def->getName()); - return true; - } - - private static function isBlacklisted(ScannedDefinition $def): bool { - // In an ideal world, everything in HH\ should be documented, - // nothing else should be. Things currently there that are internal - // should be moved to the __SystemLib\ namespace. - // - // That's long-term cleanup unlikely to be finished soon and we don't - // want to block the doc site rewrite on it, so, for now, we have - // this blacklist. - // - // As meta points: - // - The xxxAccess interfaces for collections are covered by things like - // ConstSet, ConstMap, etc. The others are implementation details. - - // Do not include "HH\" in the blacklist - we automatically strip it. - - $blacklist = keyset[ - ///////////// - // Classes // - ///////////// - - 'AppendIterator', - 'ArrayIterator', - 'BuiltinEnum', - 'CachingIterator', - 'CallbackFilterIterator', - 'Client\TypecheckResult', - 'EmptyIterator', - 'FilterIterator', - 'Generator', - 'InfiniteIterator', - 'IntlIterator', - 'IteratorIterator', - 'LimitIterator', - 'MapIterator', - 'MultipleIterator', - 'MySSLContextProvider', - 'NoRewindIterator', - 'ParentIterator', - 'RecursiveArrayIterator', - 'RecursiveCachingIterator', - 'RecursiveCallbackFilterIterator', - 'RecursiveFilterIterator', - 'RecursiveIteratorIterator', - 'RecursiveRegexIterator', - 'RecursiveTreeIterator', - 'ReflectionFunctionAbstract', - 'RegexIterator', - 'ResourceBundle', - 'SessionHandler', - 'SetIterator', - 'SplDoublyLinkedList', - 'SplFixedArray', - 'SplHeap', - 'SplMaxHeap', - 'SplMinHeap', - 'SplObjectStorage', - 'SplPriorityQueue', - 'SplQueue', - 'SplStack', - 'VectorIterator', - 'WaitHandle', - - ////////////////////////// - // Not Actually Classes // - ////////////////////////// - - 'dict', - 'keyset', - 'vec', - - //////////////// - // Interfaces // - //////////////// - - 'ArrayAccess', - 'IteratorAggregate', - 'OuterIterator', - 'RecursiveIterator', - 'SQLListFormatter', - 'SQLScalarFormatter', - 'SeekableIterator', - - /////////////// - // Functions // - /////////////// - - 'apache_get_config', - 'array_column', - 'array_fill', - 'array_filter', - 'array_key_exists', - 'array_keys', - 'array_values', - 'arsort', - 'asort', - 'call_use_func_array', - 'krsort', - 'ksort', - 'lz4_hccompress', - 'lz4compress', - 'lz4uncompress', - 'lzhccompress', - 'mysql_fetch_result', - 'nzcompress', - 'nzuncompress', - 'rsort', - 'snuncompress', - 'sort', - 'type_structure', - 'uasort', - 'uksort', - 'usort', - ]; - - $name = Str\strip_prefix($def->getName(), "HH\\"); - return C\contains_key($blacklist, $name); - } -} diff --git a/src/api-gen/YAMLWriter.php b/src/api-gen/YAMLWriter.php deleted file mode 100644 index 11614e2a1..000000000 --- a/src/api-gen/YAMLWriter.php +++ /dev/null @@ -1,32 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -class YAMLWriter { - public function __construct(private string $destination) { - } - - public function write<T as BaseYAML>(typename<T> $type, T $def): string { - invariant($type !== BaseYAML::class, 'Must specify a subtype of BaseYAML'); - $file = $this->getFileName($def); - \file_put_contents($file, JSON\encode_shape($type, $def)); - return $file; - } - - private function getFileName(BaseYAML $def): string { - $prefix = $def['type']; - - $def_name = \strtr($def['data']['name'], "\\", '.'); - - return \sprintf('%s/%s.%s.yml', $this->destination, $prefix, $def_name); - } -} diff --git a/src/build/APIHTMLBuildStep.php b/src/build/APIHTMLBuildStep.php deleted file mode 100644 index 305c25164..000000000 --- a/src/build/APIHTMLBuildStep.php +++ /dev/null @@ -1,30 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -use namespace HH\Lib\Vec; - -final class APIHTMLBuildStep extends AbstractMarkdownRenderBuildStep { - const string SOURCE_ROOT = BuildPaths::APIDOCS_MARKDOWN; - const string BUILD_ROOT = BuildPaths::APIDOCS_HTML; - - <<__Override>> - public function buildAll(): void { - Log::i("\nAPIHTMLBuild"); - $sources = self::findSources(self::SOURCE_ROOT, Set {'md'}) - |> Vec\filter($$, $path ==> \basename($path) !== 'README.md') - |> Vec\filter($$, $path ==> \strpos($path, '-examples') === false) - |> Vec\sort($$); - - $this->renderFiles($sources); - } -} diff --git a/src/build/APILegacyRedirectsBuildStep.php b/src/build/APILegacyRedirectsBuildStep.php deleted file mode 100644 index 0ffe4440a..000000000 --- a/src/build/APILegacyRedirectsBuildStep.php +++ /dev/null @@ -1,116 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -use namespace Facebook\HackCodegen as CG; - -final class APILegacyRedirectsBuildStep extends BuildStep { - use CodegenBuildStep; - - /* curl http://docs.hhvm.com/manual/en/search-index.json \ - * > legacy-docs-site-index.json - * - * This file is committed instead of fetched as we expect that site to - * be taken down soon. - */ - const string LEGACY_INDEX = LocalConfig::ROOT.'/legacy-docs-site-index.json'; - - <<__Override>> - public function buildAll(): void { - Log::i("\nAPILegacyRedirectsBuild"); - $this->createIndex(); - } - - private function createIndex(): void { - $cg = $this->getCodegenFactory(); - $cg->codegenFile(BuildPaths::APIDOCS_LEGACY_REDIRECTS) - ->setNamespace("HHVM\\UserDocumentation") - ->addClass( - $cg->codegenClass('APILegacyRedirectData') - ->setIsFinal(true) - ->setIsAbstract(true) - ->addMethod( - $cg->codegenMethod('getIndex') - ->setIsStatic(true) - ->setReturnType('dict<string, string>') - ->setBody( - $cg->codegenHackBuilder() - ->addReturn( - $this->generateOldHackDocsData(), - CG\HackBuilderValues::dict( - CG\HackBuilderKeys::export(), - CG\HackBuilderValues::export(), - ), - ) - ->getCode(), - ), - ), - ) - ->save(); - } - - private function generateOldHackDocsData(): dict<string, string> { - Log::v("\nProcessing old site index"); - $reader = new PHPDocsIndexReader(\file_get_contents(self::LEGACY_INDEX)); - $old_classes = $reader->getClasses(); - $old_methods = $reader->getMethods(); - $old_functions = $reader->getFunctions(); - - Log::v("\nCross-referencing with current site index"); - - $old_ids_to_new_urls = dict[]; - - $index = APIIndex::get(APIProduct::HACK); - - $classes = (Map {}) - ->setAll($index->getClassIndex(APIDefinitionType::CLASS_DEF)) - ->setAll($index->getClassIndex(APIDefinitionType::INTERFACE_DEF)) - ->setAll($index->getClassIndex(APIDefinitionType::TRAIT_DEF)); - - foreach ($classes as $class) { - Log::v('.'); - $raw_name = $class['name']; - $old_class_name = $raw_name; - $old_id = idx($old_classes, $raw_name); - - if ($old_id === null) { - $name_parts = \explode("\\", $raw_name); - $no_ns_name = $name_parts[\count($name_parts) - 1]; - $old_class_name = $no_ns_name; - $old_id = idx($old_classes, $no_ns_name); - } - - if ($old_id === null) { - continue; - } - - $old_ids_to_new_urls[$old_id] = $class['urlPath']; - - foreach ($class['methods'] as $method) { - $old_id = idx($old_methods, $old_class_name.'::'.$method['name']); - if ($old_id !== null) { - $old_ids_to_new_urls[$old_id] = $method['urlPath']; - } - } - } - - foreach ($index->getFunctionIndex() as $function) { - Log::v('.'); - $old_id = idx($old_functions, $function['name']); - if ($old_id !== null) { - $old_ids_to_new_urls[$old_id] = $function['urlPath']; - } - } - - return $old_ids_to_new_urls; - } -} diff --git a/src/build/APISourcesBuildStep.php b/src/build/APISourcesBuildStep.php deleted file mode 100644 index e2c2facb6..000000000 --- a/src/build/APISourcesBuildStep.php +++ /dev/null @@ -1,117 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -use namespace HH\Lib\{C, Str, Vec}; - -final class APISourcesBuildStep extends BuildStep { - const type TRepoSpec = shape( - 'name' => string, - 'prefixes' => keyset<string>, - ); - - const dict<APIProduct, this::TRepoSpec> REPOSITORIES = dict[ - APIProduct::HACK => shape( - 'name' => 'facebook/hhvm', - 'prefixes' => keyset[ - 'hphp/test/run.php', - 'hphp/test/config.ini', - 'hphp/tools/timeout.sh', // used by run.php - 'hphp/system/php', - 'hphp/runtime/ext', - 'hphp/hack/hhi', - 'hphp/hsl/src', - ], - ), - APIProduct::HSL_EXPERIMENTAL => shape( - 'name' => 'hhvm/hsl-experimental', - 'prefixes' => keyset[ - 'src/debug/', - ], - ), - ]; - - <<__Override>> - public function buildAll(): void { - Log::i("\nFetching API sources..."); - if (HHAPIDocBuildStep::shouldSkip()) { - Log::i("\n ...not needed because the dependent step is being skipped."); - return; - } - - foreach (self::REPOSITORIES as $product => $spec) { - $repo = $spec['name']; - $local = C\lastx(Str\split($repo, '/')); - $tag = PRODUCT_TAGS[$product]; - Log::i("\n Fetching %s@%s...", $repo, $tag); - $local_abs = Str\format('%s/api-sources/%s', LocalConfig::ROOT, $local); - $tag_file = $local_abs.'/.tag'; - if ( - \file_exists($tag_file) && - \file_get_contents($tag_file) === self::getTagFileContent($product) - ) { - Log::i("\n ...already present."); - continue; - } - \shell_exec('rm -rf -- '.\escapeshellarg($local_abs)); - $gzipped = \file_get_contents( - Str\format('https://github.com/%s/archive/%s.tar.gz', $repo, $tag), - ); - Log::i("\n Extracting tarball..."); - $tar = \gzdecode($gzipped); - if ($tar === false) { - Log::e("\ngzdecode failed."); - exit(1); - } - Util\parse_tar( - (string)$tar, - ($metadata, $content) ==> { - $path = Str\split($metadata['path'], '/') - |> Vec\drop($$, 1) - |> Str\join($$, '/'); - if (!C\any($spec['prefixes'], $p ==> Str\starts_with($path, $p))) { - return; - } - $path = $local_abs.'/'.$path; - $parent = \dirname($path); - if (!\is_dir($parent)) { - \mkdir($parent, /* mode = */ 0755, /* recursive = */ true); - } - switch ($metadata['type']) { - case Util\TarEntryType::FILE: - \file_put_contents($path, $content); - break; - case Util\TarEntryType::SYMLINK: - \symlink($content as nonnull, $path); - break; - case Util\TarEntryType::DIRECTORY: - \mkdir($path, 0755); - break; - } - \chmod($path, $metadata['mode']); - }, - ); - \file_put_contents($tag_file, self::getTagFileContent($product)); - } - } - - <<__Memoize>> - public static function getTagFileContent(APIProduct $product): string { - // Include the hash of this file so that we refetch+extract if the - // prefix list changes - return Str\format( - "tag: %s\nbuild step source hash: %s\n", - PRODUCT_TAGS[$product], - \sha1(\file_get_contents(__FILE__)), - ); - } -} diff --git a/src/build/AbstractMarkdownRenderBuildStep.php b/src/build/AbstractMarkdownRenderBuildStep.php deleted file mode 100644 index 360a19e56..000000000 --- a/src/build/AbstractMarkdownRenderBuildStep.php +++ /dev/null @@ -1,90 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -abstract class AbstractMarkdownRenderBuildStep extends BuildStep { - abstract const string SOURCE_ROOT; - abstract const string BUILD_ROOT; - - const int MAX_JOBS = 20; - - protected function renderFiles(Traversable<string> $files): Vector<string> { - Log::i("\nRendering markdown to HTML"); - $jobs = dict[]; - - foreach ($files as $input) { - $output = self::getOutputFileName($input); - $jobs[$input] = $output; - } - - - Log::v(' [fbgfm] '); - $files = $this->renderFilesWithFBMarkdown($jobs); - - return new Vector($files); - } - - protected function renderFilesWithFBMarkdown( - dict<string, string> $files, - ): vec<string> { - $renderer = new MarkdownRenderer(); - foreach ($files as $in => $out) { - $md = \file_get_contents($in); - $html = $renderer->renderMarkdownToHTML($in, $md); - \file_put_contents( - $out, - '<!-- fbgfm -->'. - '<script>hljs.initHighlightingOnLoad();</script>'. - $html, - ); - Log::v('.'); - } - return vec($files); - } - - private function parseSingleRenderResult(string $line): ?string { - if (\substr($line, 0, 4) !== 'OK] ') { - Log::v('!'); - return null; - } - Log::v('-'); - $parts = \explode(' -> ', $line); - // $parts[0] still has 'OK] ' prefix, but we don't need it now anyway - return $parts[1]; - } - - public static function getOutputFileName(string $input): string { - $input = \str_replace(static::SOURCE_ROOT.'/', '', $input); - $parts = (new Vector(\explode('/', $input))) - ->map( - $part ==> \preg_match('/^[0-9]{2,}-/', $part) - ? \substr($part, \strpos($part, '-') + 1) - : $part, - ); - - $output = \implode('/', $parts); - - $dir = \dirname($output); - $output = static::BUILD_ROOT. - '/'. - ($dir === '.' ? '' : $dir.'/'). - \basename($output, '.md'). - '.html'; - - $output_dir = \dirname($output); - if (!\is_dir($output_dir)) { - \mkdir($output_dir, /* mode = */ 0755, /* recursive = */ true); - } - - return $output; - } -} diff --git a/src/build/BuildFlags.php b/src/build/BuildFlags.php deleted file mode 100644 index a2e740f26..000000000 --- a/src/build/BuildFlags.php +++ /dev/null @@ -1,16 +0,0 @@ -<?hh -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -enum BuildFlags: string { - AUTOMATED = '--auto'; -} diff --git a/src/build/BuildIDBuildStep.php b/src/build/BuildIDBuildStep.php deleted file mode 100644 index 39dc4e427..000000000 --- a/src/build/BuildIDBuildStep.php +++ /dev/null @@ -1,43 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -use namespace HH\Lib\Str; - -final class BuildIDBuildStep extends BuildStep { - <<__Override>> - public function buildAll(): void { - Log::i("\nBuildID"); - $docsite_rev_file = __DIR__.'/../../DOCSITE_REV'; - if (\file_exists($docsite_rev_file)) { - $docsite_rev = \trim(\file_get_contents($docsite_rev_file)); - } else { - $docsite_rev = $this->getHead(__DIR__.'/../../'); - } - - $build_id = Str\format( - 'HHVM=%s:HSL=%s:%s:%s', - PRODUCT_TAGS[APIProduct::HACK], - PRODUCT_TAGS[APIProduct::HSL], - \strftime('%FT%T%z'), - $docsite_rev, - ); - \file_put_contents(BuildPaths::BUILD_ID_FILE, $build_id."\n"); - } - - private function getHead(string $path): string { - $rev = \shell_exec( - \sprintf("GIT_DIR=%s git rev-parse HEAD", \escapeshellarg($path.'/.git')), - ); - return \trim($rev); - } -} diff --git a/src/build/BuildPaths.php b/src/build/BuildPaths.php deleted file mode 100644 index 6700e992d..000000000 --- a/src/build/BuildPaths.php +++ /dev/null @@ -1,70 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -abstract final class BuildPaths { - const string API_SOURCES_DIR = LocalConfig::ROOT.'/api-sources'; - const string HHVM_TREE = self::API_SOURCES_DIR.'/hhvm'; - const string HSL_TREE = self::API_SOURCES_DIR.'/hsl'; - const string HSL_EXPERIMENTAL_TREE = - LocalConfig::ROOT.'/api-sources/hsl-experimental'; - - const string BUILD_ROOT_DIR = LocalConfig::ROOT.'/build'; - const string SCRATCH_DIR = self::BUILD_ROOT_DIR.'/scratch'; - const string FINAL_DIR = self::BUILD_ROOT_DIR.'/final'; - const string CODEGEN_DIR = self::FINAL_DIR.'/codegen'; - - const string DIR_INDEX_ROOT = self::SCRATCH_DIR.'/dir-index'; - - const string SYSTEMLIB_YAML = - self::SCRATCH_DIR.'/unmerged-api-data/systemlib'; - const string HHI_YAML = self::SCRATCH_DIR.'/unmerged-api-data/hhi'; - - const string APIDOCS_DATA = self::SCRATCH_DIR.'/api-data'; - const string APIDOCS_MARKDOWN = self::SCRATCH_DIR.'/api-markdown'; - const string APIDOCS_HTML = self::FINAL_DIR.'/api-html'; - const string APIDOCS_INDEX_JSON = self::FINAL_DIR.'/api-index.json'; - const string APIDOCS_TAG = self::FINAL_DIR.'/.api.tag'; - const string APIDOCS_LEGACY_REDIRECTS = - self::CODEGEN_DIR.'/api-legacy-redirects.php'; - - const string API_EXAMPLES_DIR = LocalConfig::ROOT.'/api-examples'; - - const string EXAMPLES_EXTRACT_DIR = - self::BUILD_ROOT_DIR.'/extracted-examples'; - const string API_EXAMPLES_EXTRACT_DIR = self::EXAMPLES_EXTRACT_DIR.'/api'; - - const string GUIDES_MARKDOWN = LocalConfig::ROOT.'/guides'; - const string GUIDES_GENERATED_MARKDOWN = - self::SCRATCH_DIR.'/guides-generated-markdown'; - const string GUIDES_HTML = self::FINAL_DIR.'/guides-html'; - const string GUIDES_INDEX = self::CODEGEN_DIR.'/guides-index.php'; - const string GUIDES_CATEGORY = self::CODEGEN_DIR.'/guides-category.php'; - const string GUIDES_SUMMARY = self::CODEGEN_DIR.'/guides-summary.php'; - - // FooBar => URL (for markdown) - const string UNIFIED_INDEX = self::CODEGEN_DIR.'/unified-index.php'; - // foobar => URL (for /j/ URLs) - const string JUMP_INDEX = self::CODEGEN_DIR.'/jump-index.php'; - - const string PHP_INI_SUPPORT_IN_HHVM_JSON = - self::FINAL_DIR.'/php-ini-support-in-hhvm.json'; - - const string CORE_CSS = self::FINAL_DIR.'/main.css'; - const string SITE_MAP = self::FINAL_DIR.'/sitemap.txt'; - - const string STATIC_RESOURCES_MAP_JSON = - self::FINAL_DIR.'/static_resources.json'; - const string FB_IP_RANGES_JSON = self::FINAL_DIR.'/fb_ip_ranges.json'; - - const string BUILD_ID_FILE = self::FINAL_DIR.'/build_id.txt'; -} diff --git a/src/build/BuildStep.php b/src/build/BuildStep.php deleted file mode 100644 index 7e4e9c5c8..000000000 --- a/src/build/BuildStep.php +++ /dev/null @@ -1,115 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -use namespace HH\Lib\{C, Str, Vec}; - -abstract class BuildStep { - abstract public function buildAll(): void; - - final public function __construct(private keyset<BuildFlags> $flags) {} - - final protected function getBuildFlags(): keyset<BuildFlags> { - return $this->flags; - } - - <<__Memoize>> - protected static function getIndexFile(string $root): ?string { - if (\file_exists($root.'/index.json')) { - return $root.'/index.json'; - } - - if (!Str\contains($root, 'api-sources/')) { - return null; - } - - $cache_key = null; - $tag_file = $root - |> Str\strip_prefix($$, BuildPaths::API_SOURCES_DIR) - |> Str\strip_prefix($$, '/') - |> Str\split($$, '/') - |> C\firstx($$) - |> Str\format('%s/%s/.tag', BuildPaths::API_SOURCES_DIR, $$); - if (!\file_exists($tag_file)) { - return null; - } - - $cache_key = \file_get_contents($tag_file) - |> \sodium_crypto_generichash($$) - |> \bin2hex($$); - - return Str\format( - '%s/%s-%s.json', - BuildPaths::DIR_INDEX_ROOT, - $root - |> Str\strip_prefix($$, LocalConfig::ROOT) - |> Str\strip_prefix($$, '/') - |> Str\replace($$, '/', '_'), - $cache_key, - ); - } - - protected static function findSources( - string $root, - \ConstSet<string> $extensions, - ): vec<string> { - $root = \realpath($root); - Log::i("\nFinding sources in %s", $root); - - $index = self::getIndexFile($root); - if ($index !== null && \file_exists($index)) { - $files = JSON\decode_as_shape( - DirectoryIndex::class, - \file_get_contents($index), - )['files']; - Log::v(' (cached)'); - return Vec\filter( - $files, - $f ==> C\any($extensions, $ext ==> Str\ends_with($f, '.'.$ext)), - ); - } - - $rdi = new \RecursiveDirectoryIterator( - $root, - \FilesystemIterator::CURRENT_AS_FILEINFO | - \FilesystemIterator::FOLLOW_SYMLINKS, - ); - $rii = new \RecursiveIteratorIterator( - $rdi, - \RecursiveIteratorIterator::CHILD_FIRST, - ); - $all_files = vec[]; - $files = vec[]; - foreach ($rii as $info) { - if (!$info->isFile()) { - continue; - } - $all_files[] = $info->getPathname(); - if ($extensions->contains($info->getExtension())) { - $files[] = $info->getPathname(); - Log::v('.'); - } - } - - if ($index !== null) { - if (!\file_exists(BuildPaths::DIR_INDEX_ROOT)) { - \mkdir(BuildPaths::DIR_INDEX_ROOT, 0755); - } - \file_put_contents( - $index, - JSON\encode_shape(DirectoryIndex::class, shape('files' => $all_files)), - ); - } - - return $files; - } -} diff --git a/src/build/CodegenBuildStep.php b/src/build/CodegenBuildStep.php deleted file mode 100644 index f4585c1c8..000000000 --- a/src/build/CodegenBuildStep.php +++ /dev/null @@ -1,23 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -use namespace Facebook\HackCodegen as CG; - -trait CodegenBuildStep { - protected function getCodegenFactory(): CG\HackCodegenFactory { - $config = new CG\HackCodegenConfig(); - return new CG\HackCodegenFactory( - $config->withFormatter(new CG\HackfmtFormatter($config)), - ); - } -} diff --git a/src/build/FacebookIPRangesBuildStep.php b/src/build/FacebookIPRangesBuildStep.php deleted file mode 100644 index 7f773e60f..000000000 --- a/src/build/FacebookIPRangesBuildStep.php +++ /dev/null @@ -1,74 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -use namespace HH\Lib\Str; - -final class FacebookIPRangesBuildStep extends BuildStep { - - <<__Override>> - public function buildAll(): void { - if (Str\ends_with(\php_uname('n'), '.facebook.com')) { - Log::v("\nFBONLY: Creating empty list of FB employee IP addresses..."); - \file_put_contents(BuildPaths::FB_IP_RANGES_JSON, \json_encode( - shape('ipv4' => vec[], 'ipv6' => vec[]), - \JSON_PRETTY_PRINT, - )); - return; - } - - Log::v("\nCreating list of FB employee IP addresses..."); - - $errno = null; - $errstr = null; - $handle = \stream_socket_client( - 'tcp://whois.radb.net:43', - inout $errno, - inout $errstr, - ); - if ($handle === false) { - \fprintf( - \STDERR, - "Failed to open whois connection: %d: %s\n", - $errno, - $errstr, - ); - exit(1); - } - - // Persistent connection - \fwrite($handle, "!!\n"); - - \fwrite($handle, "!gas54115\n"); - $ipv4 = self::readRadbRanges($handle); - \fwrite($handle, "!6as54115\n"); - $ipv6 = self::readRadbRanges($handle); - \fclose($handle); - - \file_put_contents( - BuildPaths::FB_IP_RANGES_JSON, - \json_encode(shape('ipv4' => $ipv4, 'ipv6' => $ipv6), \JSON_PRETTY_PRINT), - ); - } - - private static function readRadbRanges(resource $handle): vec<string> { - // Alength\nCONTENT\nC - $first = \fgets($handle); - invariant(Str\starts_with($first, 'A'), 'Expected ^A\d+$, got %s', $first); - $length = (int)Str\strip_prefix(Str\trim_right($first), 'A'); - $data = \fread($handle, $length); - $rest = \fgets($handle); - invariant(Str\trim($rest) === 'C', 'Expected just "C", got %s', $rest); - - return $data |> Str\trim($$) |> Str\split($$, ' '); - } -} diff --git a/src/build/GuidesHTMLBuildStep.php b/src/build/GuidesHTMLBuildStep.php deleted file mode 100644 index a279adeb3..000000000 --- a/src/build/GuidesHTMLBuildStep.php +++ /dev/null @@ -1,152 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -use namespace HH\Lib\{Str, Vec}; -use namespace Facebook\HackCodegen as CG; - -final class GuidesHTMLBuildStep extends AbstractMarkdownRenderBuildStep { - use CodegenBuildStep; - - const string SOURCE_ROOT = BuildPaths::GUIDES_MARKDOWN; - const string BUILD_ROOT = BuildPaths::GUIDES_HTML; - - <<__Override>> - public function buildAll(): void { - Log::i("\nGuidesHTMLBuild"); - $sources = self::findSources(self::SOURCE_ROOT, Set {'md'}) - |> Vec\filter($$, $path ==> \basename($path) !== 'README.md') - |> Vec\sort($$); - - $this->renderFiles($sources); - - Log::i("\nCreating categories"); - $categories = \glob(self::SOURCE_ROOT.'/*/*/*-category.txt') - |> Vec\map($$, $path ==> Str\strip_prefix($path, self::SOURCE_ROOT.'/')) - |> Vec\sort($$); - - $category_index = $this->createCategoryIndex($categories); - - Log::i("\nCreating summaries"); - $summaries = \glob(self::SOURCE_ROOT.'/*/*/*-summary.txt') - |> Vec\map($$, $path ==> Str\strip_prefix($path, self::SOURCE_ROOT.'/')) - |> Vec\sort($$); - - $summary_index = $this->createSummaryIndex($summaries); - - $cg = $this->getCodegenFactory(); - - $cg->codegenFile(BuildPaths::GUIDES_CATEGORY) - ->setNamespace("HHVM\\UserDocumentation") - ->addClass( - $cg->codegenClass('GuidesCategoryData') - ->setIsFinal(true) - ->setIsAbstract(true) - ->addMethod( - $cg->codegenMethod('getData') - ->setIsStatic(true) - ->setReturnType('dict<GuidesProduct, dict<string, string>>') - ->setBody( - $cg->codegenHackBuilder() - ->addReturn( - $category_index, - CG\HackBuilderValues::dict( - CG\HackBuilderKeys::lambda( - ($_, $v) ==> Str\format( - "GuidesProduct::%s", - GuidesProduct::getNames()[$v], - ), - ), - CG\HackBuilderValues::export(), - ), - ) - ->getCode(), - ), - ), - ) - ->save(); - - $cg->codegenFile(BuildPaths::GUIDES_SUMMARY) - ->setNamespace("HHVM\\UserDocumentation") - ->addClass( - $cg->codegenClass('GuidesSummaryData') - ->setIsFinal(true) - ->setIsAbstract(true) - ->addMethod( - $cg->codegenMethod('getData') - ->setIsStatic(true) - ->setReturnType('dict<GuidesProduct, dict<string, string>>') - ->setBody( - $cg->codegenHackBuilder() - ->addReturn( - $summary_index, - CG\HackBuilderValues::dict( - CG\HackBuilderKeys::lambda( - ($_, $v) ==> Str\format( - "GuidesProduct::%s", - GuidesProduct::getNames()[$v], - ), - ), - CG\HackBuilderValues::export(), - ), - ) - ->getCode(), - ), - ), - ) - ->save(); - } - - private function createCategoryIndex( - Traversable<string> $categories, - ): dict<GuidesProduct, dict<string, string>> { - $out = dict[]; - foreach ($categories as $category) { - $parts = (new Vector(\explode('/', $category))) - ->map( - $part ==> \preg_match('/^[0-9]{2,}-/', $part) - ? \substr($part, \strpos($part, '-') + 1) - : $part, - ); - if (\count($parts) !== 3) { - continue; - } - list($product, $section, $_page) = $parts; - $product as GuidesProduct; - $out[$product] ??= dict[]; - $out[$product][$section] = $category; - } - return $out; - } - - private function createSummaryIndex( - Traversable<string> $summaries, - ): dict<GuidesProduct, dict<string, string>> { - $out = dict[]; - foreach ($summaries as $summary) { - $parts = (new Vector(\explode('/', $summary))) - ->map( - $part ==> \preg_match('/^[0-9]{2,}-/', $part) - ? \substr($part, \strpos($part, '-') + 1) - : $part, - ); - if (\count($parts) !== 3) { - continue; - } - list($product, $section, $_page) = $parts; - $product as GuidesProduct; - $out[$product] ??= dict[]; - $out[$product][$section] = $summary; - } - return $out; - } -} diff --git a/src/build/GuidesIndexBuildStep.php b/src/build/GuidesIndexBuildStep.php deleted file mode 100644 index 6bff1cad9..000000000 --- a/src/build/GuidesIndexBuildStep.php +++ /dev/null @@ -1,103 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -use namespace HH\Lib\Str; -use namespace Facebook\HackCodegen as CG; - -final class GuidesIndexBuildStep extends BuildStep { - use CodegenBuildStep; - - <<__Override>> - public function buildAll(): void { - Log::i("\nGuidesIndexBuild"); - - $sources = self::findSources(BuildPaths::GUIDES_MARKDOWN, Set {'md'}); - \sort(inout $sources); - - $this->createIndex($sources); - } - - private function createIndex(Traversable<string> $list): void { - $index = $this->generateIndexData($list); - - $cg = $this->getCodegenFactory(); - $cg->codegenFile(BuildPaths::GUIDES_INDEX) - ->setNamespace("HHVM\\UserDocumentation") - ->addClass( - $cg->codegenClass('GuidesIndexData') - ->setIsFinal(true) - ->setIsAbstract(true) - ->addMethod( - $cg->codegenMethod('getIndex') - ->setIsStatic(true) - ->setReturnType( - 'dict<GuidesProduct, dict<string, dict<string, string>>>', - ) - ->setBody( - $cg->codegenHackBuilder() - ->addReturn( - $index, - CG\HackBuilderValues::dict( - CG\HackBuilderKeys::lambda( - ($_, $p) ==> Str\format( - 'GuidesProduct::%s', - GuidesProduct::getNames()[$p], - ), - ), - CG\HackBuilderValues::dict( - CG\HackBuilderKeys::export(), - CG\HackBuilderValues::dict( - CG\HackBuilderKeys::export(), - CG\HackBuilderValues::export(), - ), - ), - ), - ) - ->getCode(), - ), - ), - ) - ->save(); - // Make it available to later build steps - require_once(BuildPaths::GUIDES_INDEX); - } - - private function generateIndexData( - Traversable<string> $sources, - ): dict<GuidesProduct, dict<string, dict<string, string>>> { - $out = dict[]; - foreach ($sources as $path) { - $path = \str_replace(BuildPaths::GUIDES_MARKDOWN.'/', '', $path); - $parts = (new Vector(\explode('/', $path))) - ->map( - $part ==> \preg_match('/^[0-9]{2,}-/', $part) - ? \substr($part, \strpos($part, '-') + 1) - : $part, - ); - if (\count($parts) !== 3) { - continue; - } - - list($product, $section, $page) = $parts; - $product as GuidesProduct; - $page = \basename($page, '.md'); - $out[$product] ??= dict[]; - $out[$product][$section] ??= dict[]; - - $absolute = GuidesHTMLBuildStep::getOutputFileName($path); - $relative = \substr($absolute, \strlen(BuildPaths::GUIDES_HTML) + 1); - $out[$product][$section][$page] = $relative; - } - return $out; - } -} diff --git a/src/build/HHAPIDocBuildStep.php b/src/build/HHAPIDocBuildStep.php deleted file mode 100644 index 02931c4a9..000000000 --- a/src/build/HHAPIDocBuildStep.php +++ /dev/null @@ -1,457 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -use type Facebook\DefinitionFinder\{ - FileParser, - ScannedClass, - ScannedClassish, - ScannedDefinition, - ScannedFunction, - ScannedInterface, - ScannedMethod, - ScannedTrait, -}; -use namespace Facebook\{HHAPIDoc, TypeAssert}; -use namespace Facebook\HHAPIDoc\Documentables; -use type Facebook\HHAPIDoc\Documentable; -use namespace HH\Lib\{C, Dict, Str, Vec}; - -final class HHAPIDocBuildStep extends BuildStep { - <<__Override>> - public function buildAll(): void { - Log::i("\nHHAPIDocBuildStep"); - if (self::shouldSkip()) { - Log::i("\n ...already built and no dependencies changed, skipping."); - return; - } - - $exts = ImmSet {'php', 'hhi', 'hh'}; - - Log::i("\nFinding Builtin Sources"); - $runtime_sources = Vec\concat( - self::findSources(BuildPaths::HHVM_TREE.'/hphp/system/php/', $exts), - self::findSources(BuildPaths::HHVM_TREE.'/hphp/runtime/ext/', $exts), - ); - $hhi_sources = - self::findSources(BuildPaths::HHVM_TREE.'/hphp/hack/hhi/', $exts); - Log::i("\nParsing builtins"); - list($runtime_defs, $hhi_defs) = \HH\Asio\join(async { - return tuple( - await self::parseAsync($runtime_sources), - await self::parseAsync($hhi_sources), - ); - }); - Log::i("\nDe-duping builtins"); - $builtin_defs = DataMerger::mergeAll(Vec\concat($runtime_defs, $hhi_defs)); - - Log::i("\nFiltering out PHP builtins"); - $builtin_defs = Vec\filter( - $builtin_defs, - $documentable ==> { - $parent = $documentable['parent']; - if ($parent !== null) { - return ScannedDefinitionFilters::isHHSpecific($parent); - } - return - ScannedDefinitionFilters::isHHSpecific($documentable['definition']); - }, - ); - - Log::i("\nFinding HSL sources"); - // We have prefix whitelists (especially for hsl-experimental), but they're - // already handled when extracting the tarball; no need to filter out non- - // whitelisted files again here. - $hsl_sources = - self::findSources(BuildPaths::HHVM_TREE.'/hphp/hsl/src/', $exts); - $hsl_experimental_sources = - self::findSources(BuildPaths::HSL_EXPERIMENTAL_TREE.'/src/', $exts); - Log::i("\nParsing HSL sources"); - $hsl_defs = \HH\Asio\join(self::parseAsync($hsl_sources)); - $hsl_experimental_defs = - \HH\Asio\join(self::parseAsync($hsl_experimental_sources)); - - Log::i("\nGenerating search and navigation index for builtins"); - $builtin_index = self::createProductIndex(APIProduct::HACK, $builtin_defs); - Log::i("\nGenerating search and navigation index for the HSL"); - $hsl_index = self::createProductIndex(APIProduct::HSL, $hsl_defs); - $hsl_experimental_index = self::createProductIndex( - APIProduct::HSL_EXPERIMENTAL, - $hsl_experimental_defs, - ); - Log::i("\nWriting search and navigation index file"); - \file_put_contents( - BuildPaths::APIDOCS_INDEX_JSON, - JSON\encode_shape( - APIIndexShape::class, - shape( - APIProduct::HACK => $builtin_index, - APIProduct::HSL => $hsl_index, - APIProduct::HSL_EXPERIMENTAL => $hsl_experimental_index, - ), - ), - ); - - // HHApiDoc index; needed so that e.g. `File\WriteHandle`'s documentation - // generation knows about `IO\WriteHandle`'s methods - Log::i("\nCreating cross-reference index"); - $hh_apidoc_index = shape( - 'types' => dict[], - 'newtypes' => dict[], - 'functions' => dict[], - 'classes' => dict[], - 'interfaces' => dict[], - 'traits' => dict[], - ); - $all_documentables = - Vec\flatten(vec[$builtin_defs, $hsl_defs, $hsl_experimental_defs]); - foreach ($all_documentables as $documentable) { - $def = $documentable['definition']; - // types and newtypes are not currently supported by docs.hhvm.com - if ($def is ScannedFunction) { - $hh_apidoc_index['functions'][$def->getName()] = $documentable; - continue; - } - if ($def is ScannedClass) { - $hh_apidoc_index['classes'][$def->getName()] = $documentable; - continue; - } - if ($def is ScannedInterface) { - $hh_apidoc_index['interfaces'][$def->getName()] = $documentable; - continue; - } - if ($def is ScannedTrait) { - $hh_apidoc_index['traits'][$def->getName()] = $documentable; - continue; - } - } - - Log::i("\nGenerating Markdown for builtins"); - $builtin_md = self::buildMarkdown(APIProduct::HACK, $builtin_defs, $hh_apidoc_index); - Log::i("\nGenerating Markdown for the HSL"); - $hsl_md = self::buildMarkdown(APIProduct::HSL, $hsl_defs, $hh_apidoc_index); - $hsl_experimental_md = - self::buildMarkdown(APIProduct::HSL_EXPERIMENTAL, $hsl_experimental_defs, $hh_apidoc_index); - - \file_put_contents( - BuildPaths::APIDOCS_MARKDOWN.'/index.json', - JSON\encode_shape( - DirectoryIndex::class, - shape( - 'files' => Vec\concat($builtin_md, $hsl_md, $hsl_experimental_md), - ), - ), - ); - - // This ensures that this step gets rebuild if and only if any of its - // dependencies change. - \file_put_contents(BuildPaths::APIDOCS_TAG, self::getTagFileContent()); - } - - public static function shouldSkip(): bool { - // Checking the tag file should be sufficient, but we check for existence of - // a few basic files to catch any pathological cases. Note that we don't - // check for every single file generated by this step though. - return \file_exists(BuildPaths::APIDOCS_INDEX_JSON) && - \file_exists(BuildPaths::APIDOCS_MARKDOWN.'/index.json') && - \file_exists(BuildPaths::APIDOCS_TAG) && - \file_get_contents(BuildPaths::APIDOCS_TAG) === self::getTagFileContent(); - } - - <<__Memoize>> - private static function getTagFileContent(): string { - $content = Str\format( - "build step source hash: %s\ntags from dependencies:\n", - \sha1(\file_get_contents(__FILE__)), - ); - foreach (APIProduct::getValues() as $product) { - $content .= APISourcesBuildStep::getTagFileContent($product); - } - - // Get the last modified time of the last modified file in api-examples/ - $max_mtime = null; - foreach ( - new \RecursiveIteratorIterator( - new \RecursiveDirectoryIterator(BuildPaths::API_EXAMPLES_DIR), - ) as $file_info - ) { - if ($max_mtime is null || $file_info->getMTime() > $max_mtime) { - $max_mtime = $file_info->getMTime(); - } - } - invariant( - $max_mtime is nonnull, - 'Error finding the last modified file in api-examples/', - ); - $content .= 'highest api-examples mtime: '.$max_mtime."\n"; - - return $content; - } - - private static function createProductIndex( - APIProduct $product, - vec<Documentable> $documentables, - ): ProductAPIIndexShape { - $documentables = - Vec\sort_by($documentables, $d ==> $d['definition']->getName()); - return shape( - 'class' => self::createClassishIndex( - $product, - APIDefinitionType::CLASS_DEF, - $documentables, - ), - 'interface' => self::createClassishIndex( - $product, - APIDefinitionType::INTERFACE_DEF, - $documentables, - ), - 'trait' => self::createClassishIndex( - $product, - APIDefinitionType::TRAIT_DEF, - $documentables, - ), - 'function' => self::createFunctionIndex($product, $documentables), - ); - } - - private static function createClassishIndex( - APIProduct $product, - APIDefinitionType $type, - vec<Documentable> $documentables, - ): dict<string, APIClassIndexEntry> { - $classes = Vec\filter( - $documentables, - $d ==> { - if ($type === APIDefinitionType::CLASS_DEF) { - return $d['definition'] is ScannedClass; - } - if ($type === APIDefinitionType::INTERFACE_DEF) { - return $d['definition'] is ScannedInterface; - } - if ($type === APIDefinitionType::TRAIT_DEF) { - return $d['definition'] is ScannedTrait; - } - invariant_violation('unhandled type: %s', $type); - }, - ); - - $html_paths = HTMLPaths::get($product); - - return Dict\pull( - $classes, - $class ==> { - $class_name = $class['definition']->getName(); - $methods = Dict\filter( - $documentables, - $d ==> $d['parent'] === $class['definition'], - ); - - return shape( - 'type' => $type, - 'name' => $class_name, - 'htmlPath' => $html_paths->getPathForClassish($type, $class_name), - 'urlPath' => \APIClassPageControllerURIBuilder::getPath(shape( - 'Product' => $product, - 'Name' => Str\replace($class_name, "\\", '.'), - 'Type' => $type, - )), - 'methods' => Dict\pull( - $methods, - $method ==> { - $method_name = $method['definition']->getName(); - return shape( - 'name' => $method_name, - 'className' => $class_name, - 'classType' => $type, - 'htmlPath' => $html_paths->getPathForClassishMethod( - $type, - $class_name, - $method_name, - ), - 'urlPath' => \APIMethodPageControllerURIBuilder::getPath(shape( - 'Product' => $product, - 'Class' => Str\replace($class_name, "\\", '.'), - 'Method' => $method_name, - 'Type' => $type, - )), - ); - }, - $method ==> - Str\replace($method['definition']->getName(), "\\", '.'), - ), - ); - }, - $class ==> Str\replace($class['definition']->getName(), "\\", '.'), - ); - } - - private static function createFunctionIndex( - APIProduct $product, - vec<Documentable> $documentables, - ): dict<string, APIFunctionIndexEntry> { - $functions = - Dict\filter($documentables, $d ==> $d['definition'] is ScannedFunction); - $html_paths = HTMLPaths::get($product); - return Dict\pull( - $functions, - $function ==> { - $def = $function['definition']; - $function_name = $def->getName(); - $deprecated = $def->getAttributes()['__Deprecated'] ?? null; - if ($deprecated !== null) { - $deprecated = C\onlyx($deprecated) as string; - } - return shape( - 'name' => $function_name, - 'htmlPath' => $html_paths->getPathForFunction($function_name), - 'urlPath' => \APIClassPageControllerURIBuilder::getPath( - shape( - 'Product' => $product, - 'Name' => Str\replace($function_name, "\\", '.'), - 'Type' => APIDefinitionType::FUNCTION_DEF, - ), - ), - 'deprecation' => $deprecated, - ); - }, - $function ==> Str\replace($function['definition']->getName(), "\\", '.'), - ); - } - - private static function correctHHIOnlyDefs(Documentable $def): Documentable { - $obj = $def['definition']; - if (!$obj is ScannedFunction) { - return $def; - } - $to_fix = keyset[ - 'fun', - 'meth_caller', - 'class_meth', - 'inst_meth', - ]; - if (!C\contains_key($to_fix, $obj->getName())) { - return $def; - } - $def['definition'] = new ScannedFunction( - $obj->getASTx(), - "HH\\".$obj->getName(), - $obj->getContext(), - $obj->getAttributes(), - $obj->getDocComment(), - $obj->getGenericTypes(), - $obj->getReturnType(), - $obj->getParameters(), - ); - return $def; - } - - private static async function parseAsync( - Traversable<string> $sources, - ): Awaitable<vec<Documentable>> { - $parsers = await Vec\map_async( - $sources, - async $file ==> { - $parsed = await FileParser::fromFileAsync($file); - Log::v('.'); - return $parsed; - }, - ); - return $parsers - |> Vec\map($$, $parser ==> Documentables\from_parser($parser)) - |> Vec\flatten($$) - |> Vec\map($$, $def ==> self::correctHHIOnlyDefs($def)) - |> Vec\filter( - $$, - $documentable ==> { - $parent = $documentable['parent']; - if ( - $parent !== null && - ScannedDefinitionFilters::shouldNotDocument($parent) - ) { - return false; - } - return !ScannedDefinitionFilters::shouldNotDocument( - $documentable['definition'], - ); - }, - ); - } - - private static function buildMarkdown( - APIProduct $product, - vec<Documentable> $documentables, - \Facebook\HHAPIDoc\Index $index, - ): vec<string> { - $root = BuildPaths::APIDOCS_MARKDOWN.'/'.$product; - - if (!\is_dir($root)) { - \mkdir($root, /* mode = */ 0755, /* recursive = */ true); - } - $md_paths = MarkdownPaths::get($product); - $ctx = ( - new HHAPIDoc\DocumentationBuilderContext( - $index, - new HHAPIDocExt\PathProvider(), - shape( - 'format' => HHAPIDoc\OutputFormat::MARKDOWN, - 'syntaxHighlighting' => true, - 'hidePrivateMethods' => true, - 'hideInheritedMethods' => false, - ), - ) - ); - $builder = new HHAPIDocExt\MarkdownBuilder($ctx); - - return Vec\map($documentables, $documentable ==> { - Log::v('.'); - $md = $builder->getDocumentation($documentable); - $what = $documentable['definition']; - if ($what is ScannedMethod) { - $parent = TypeAssert\not_null($documentable['parent']); - $path = $md_paths->getPathForClassishMethod( - self::getClassishAPIDefinitionType($parent), - $parent->getName(), - $what->getName(), - ); - } else if ($what is ScannedFunction) { - $path = $md_paths->getPathForFunction($what->getName()); - } else if ($what is ScannedClassish) { - $path = $md_paths->getPathForClassish( - self::getClassishAPIDefinitionType($what), - $what->getName(), - ); - } else { - invariant_violation( - "Can't handle definition of type %s", - \get_class($what), - ); - } - \file_put_contents($path, $md."\n<!-- HHAPIDOC -->\n"); - return $path; - }); - } - - private static function getClassishAPIDefinitionType( - ScannedDefinition $definition, - ): APIDefinitionType { - if ($definition is ScannedClass) { - return APIDefinitionType::CLASS_DEF; - } - if ($definition is ScannedInterface) { - return APIDefinitionType::INTERFACE_DEF; - } - if ($definition is ScannedTrait) { - return APIDefinitionType::TRAIT_DEF; - } - invariant_violation("Can't handle type %s", \get_class($definition)); - } -} diff --git a/src/build/Log.php b/src/build/Log.php deleted file mode 100644 index 219710097..000000000 --- a/src/build/Log.php +++ /dev/null @@ -1,80 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -enum Color: string { - RESET = '[0m'; - BLACK = '[30m'; - RED = '[31m'; - GREEN = '[32m'; - YELLOW = '[33m'; - PURPLE = '[35m'; - BLUE = '[34m'; - CYAN = '[36m'; - WHITE = '[37m'; -} - -class Log { - const int NONE = 0; - const int ERROR = 1; - const int WARN = 3; - const int INFO = 7; - const int VERBOSE = 15; - - public static int $loglevel = self::VERBOSE; - - private static ImmMap<int, Color> $color = ImmMap { - self::ERROR => Color::RED, - self::WARN => Color::YELLOW, - self::INFO => Color::GREEN, - self::VERBOSE => Color::RESET, - }; - - public static function e( - \HH\FormatString<\PlainSprintf> $msg, - mixed ...$args - ): void { - self::print(self::ERROR, \vsprintf($msg, $args)); - } - - public static function w(string $msg): void { - self::print(self::WARN, $msg); - } - - public static function i( - \HH\FormatString<\PlainSprintf> $msg, - mixed ...$args - ): void { - self::print(self::INFO, \vsprintf($msg, $args)); - } - - public static function v( - \HH\FormatString<\PlainSprintf> $msg, - mixed ...$args - ): void { - self::print(self::VERBOSE, \vsprintf($msg, $args)); - } - - private static function print(int $loglevel, string $msg): void { - if (self::$loglevel & $loglevel) { - $color = self::$color[$loglevel]; - if (\strpos($msg, "\n") === 0) { - $msg = \strftime("\n%Y-%m-%d %H:%M:%S] ").\ltrim($msg); - } - print(self::color($color, $msg)); - } - } - - private static function color(Color $color, string $msg): string { - return \chr(27).$color.$msg.\chr(27).Color::RESET; - } -} diff --git a/src/build/MarkdownRenderer.php b/src/build/MarkdownRenderer.php deleted file mode 100644 index f3b7d2b35..000000000 --- a/src/build/MarkdownRenderer.php +++ /dev/null @@ -1,63 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -use namespace Facebook\Markdown; - -final class MarkdownRenderer { - <<__Memoize>> - private function getParserContext(): Markdown\ParserContext { - $parser_ctx = (new Markdown\ParserContext()) - ->setBlockContext( - (new MarkdownExt\BlockContext()) - ->prependBlockTypes( - MarkdownExt\YamlFrontMatterBlock::class, - MarkdownExt\ExamplesIncludeBlock::class, - MarkdownExt\IncludeGeneratedMarkdownBlock::class, - ), - ) - ->setSourceType(Markdown\SourceType::TRUSTED) - ->enableHTML_UNSAFE(); - $parser_ctx->getInlineContext() - ->prependInlineTypes(MarkdownExt\AutoLinkifyInline::class); - return $parser_ctx; - } - - <<__Memoize>> - private function getRenderContext( - ): MarkdownExt\RenderContext { - $render_ctx = (new MarkdownExt\RenderContext()) - ->appendFilters( - new MarkdownExt\HeadingAnchorsFilter(), - new MarkdownExt\VersionedImagesFilter(), - new MarkdownExt\InternalMarkdownLinksFilter(), - new MarkdownExt\PrettyCodeBlocksFilter(), - ); - return $render_ctx; - } - - public function renderMarkdownToHTML( - string $file, - string $markdown, - ): string { - $parser_ctx = $this->getParserContext() - ->resetFileData() - ->setFilePath($file); - $render_ctx = $this - ->getRenderContext() - ->resetFileData() - ->setFilePath($file); - - $doc = Markdown\parse($parser_ctx, $markdown); - return (new MarkdownExt\HTMLRenderer($render_ctx))->render($doc); - } -} diff --git a/src/build/PHPDocsIndexReader.php b/src/build/PHPDocsIndexReader.php deleted file mode 100644 index 19f3a4924..000000000 --- a/src/build/PHPDocsIndexReader.php +++ /dev/null @@ -1,91 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -final class PHPDocsIndexReader { - private Map<string, string> $classes = Map {}; - private Map<string, string> $functions = Map {}; - private Map<string, string> $methods = Map {}; - private Map<string, string> $articles = Map {}; - - public function __construct(string $content) { - $old_index = \json_decode($content); - - foreach ($old_index as $entry) { - list($name, $id, $type) = $entry; - if (!$type) { - continue; - } - - if ($type === 'example') { - continue; - } - - $name = \html_entity_decode($name); - - if ($type === 'phpdoc:classref') { - $name = \explode('<', $name)[0]; // remove generics - $this->classes[$name] = $id; - continue; - } - - if ($type === 'refentry') { - $parts = (new Vector(\explode('::', $name))) - ->map($x ==> \explode('<', $x)[0]); - - if (\count($parts) === 1) { - $this->functions[$parts[0]] = $id; - continue; - } - - invariant( - \count($parts) === 2, - "Definition %s has %d parts", - $name, - \count($parts), - ); - $this->methods[\implode('::', $parts)] = $id; - continue; - } - - $this->articles[$id] = $id; - } - } - - public function getClasses(): ImmMap<string, string> { - return $this->classes->toImmMap(); - } - - public function getFunctions(): ImmMap<string, string> { - return $this->functions->toImmMap(); - } - - public function getMethods(): ImmMap<string, string> { - return $this->methods->toImmMap(); - } - - public function getAllAPIDefinitions(): ImmMap<string, string> { - $defs = Map {}; - $defs->setAll($this->getClasses()); - $defs->setAll($this->getMethods()); - $defs->setAll($this->getFunctions()); - return $defs->toImmMap(); - } - - public function getArticles(): ImmMap<string, string> { - $defs = $this->classes->values()->toSet(); - $defs->addAll($this->functions->values()); - $defs->addAll($this->methods->values()); - - return $this->articles->filter($x ==> !$defs->contains($x))->toImmMap(); - } -} diff --git a/src/build/PHPIniSupportInHHVMBuildStep.php b/src/build/PHPIniSupportInHHVMBuildStep.php deleted file mode 100644 index 250bd7762..000000000 --- a/src/build/PHPIniSupportInHHVMBuildStep.php +++ /dev/null @@ -1,80 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -use namespace HH\Lib\{Str, Vec}; - -final class PHPIniSupportInHHVMBuildStep extends BuildStep { - - <<__Override>> - public function buildAll(): void { - Log::i("\nPHPIniSupportInHHVM"); - - \file_put_contents( - BuildPaths::PHP_INI_SUPPORT_IN_HHVM_JSON, - JSON\encode_dict($this->getIndexData()), - ); - } - - - private function getIndexData(): dict<string, string> { - // all the HHVM ini settings - $settings = Vec\keys(\ini_get_all()); - // The ones that are PHP settings (i.e., don't start with HHVM) - $php_supported_settings = Vec\filter( - $settings, - $setting ==> !Str\contains($setting, 'hhvm.'), - ); - // Remove curl.namedPools, which is not a PHP setting - $php_supported_settings = Vec\filter( - $php_supported_settings, - $php_supported_settings ==> !Str\contains($php_supported_settings, 'curl.namedPools'), - ); - $php_settings_with_urls = $this->getPHPSettingsWithURLs(); - - $out = dict[]; - foreach ($php_supported_settings as $setting) { - // default to here if no URL exists for specific setting - $url = idx($php_settings_with_urls, $setting); - if ($url === null) { - $url = 'http://php.net/manual/en/ini.list.php'; - } else { - $url = \sprintf( - 'http://php.net/manual/en/%s', - $php_settings_with_urls[$setting], - ); - } - $out[$setting] = $url; - } - return $out; - } - - private function getPHPSettingsWithURLs(): dict<string, string> { - // The HTML is not well formatted. We know that. Turn off outputting errors. - \libxml_use_internal_errors(true); - $dom = new \DOMDocument(); - $html_content = \HH\Asio\join( - \HH\Asio\curl_exec('http://php.net/manual/en/ini.list.php'), - ); - $dom->loadHTML($html_content); - $xpath = new \DOMXPath($dom); - // Query all the settings with URL references - $nodes = $xpath->query("//tbody//tr//td//a"); - - $settings = dict[]; - foreach ($nodes as $node) { - // settingName => URL - $settings[$node->nodeValue] = $node->attributes->item(0)->nodeValue; - } - return $settings; - } -} diff --git a/src/build/PHPIniSupportInHHVMMarkdownBuildStep.php b/src/build/PHPIniSupportInHHVMMarkdownBuildStep.php deleted file mode 100644 index b2b7834ef..000000000 --- a/src/build/PHPIniSupportInHHVMMarkdownBuildStep.php +++ /dev/null @@ -1,61 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -use namespace Facebook\TypeSpec; - -final class PHPIniSupportInHHVMMarkdownBuildStep extends BuildStep { - <<__Override>> - public function buildAll(): void { - Log::i("\nPHPIniSupportInHHVMMarkdownBuild"); - $settings = \file_get_contents(BuildPaths::PHP_INI_SUPPORT_IN_HHVM_JSON) - |> JSON\decode_as_dict($$) - |> TypeSpec\dict(TypeSpec\string(), TypeSpec\string())->assertType($$); - if (!\is_dir(BuildPaths::GUIDES_GENERATED_MARKDOWN)) { - \mkdir( - BuildPaths::GUIDES_GENERATED_MARKDOWN, - /* mode = */ 0755, - /* recursive = */ true, - ); - } - $md = $this->getMarkdown($settings); - \file_put_contents( - BuildPaths::GUIDES_GENERATED_MARKDOWN.'/php_ini_support_in_hhvm.md', - $md, - ); - } - - private function getMarkdown(dict<string, string> $settings): string { - $md = ''; - $cols = 5; - // Create blank table headers - $md .= \str_repeat(' Option |', $cols); - $md = \rtrim($md, '|'); - $md .= "\n"; - $md .= \str_repeat('------ |', $cols); - $md = \rtrim($md, '|'); - $md .= "\n"; - // Add settings to table - $col = 0; - foreach ($settings as $setting => $url) { - if ($col === $cols) { - $md = \rtrim($md, '|'); - $md .= "\n"; - $col = 0; - } - $md .= '['.$setting.']('.$url.') |'; - $col++; - } - - return $md; - } -} diff --git a/src/build/RoutingCodegenBuildStep.php b/src/build/RoutingCodegenBuildStep.php deleted file mode 100644 index 39220f432..000000000 --- a/src/build/RoutingCodegenBuildStep.php +++ /dev/null @@ -1,90 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -use type Facebook\HackRouter\Codegen; - -use namespace Facebook\{HackCodegen as hcg, TypeAssert}; - -final class RoutingCodegenBuildStep extends BuildStep { - <<__Override>> - public function buildAll(): void { - Log::i("\nBuilding Router-related codegen..."); - Codegen::forTree( - LocalConfig::ROOT.'/src/site', - shape( - 'controllerBase' => \RoutableController::class, - 'router' => self::getRouterConfig(), - 'requestParameters' => self::getRequestParametersConfig(), - 'uriBuilders' => self::getUriBuildersConfig(), - 'hackCodegenConfig' => (new hcg\HackCodegenConfig()) - ->withRootDir(LocalConfig::ROOT), - ), - )->build(); - } - - private static function getRouterConfig(): Codegen::TRouterCodegenConfig { - return shape( - 'file' => LocalConfig::ROOT.'/src/site/RouterCodegenBase.php', - 'class' => 'RouterCodegenBase', - 'abstract' => true, - ); - } - - private static function getRequestParametersConfig( - ): Codegen::TRequestParametersCodegenConfig { - $root = LocalConfig::ROOT.'/src/site/controllers/codegen/'; - return shape( - 'getParameters' => $class ==> { - $class = TypeAssert\classname_of(\WebController::class, $class); - $spec = $class::getParametersSpec(); - $out = Vector {}; - foreach ($spec['required'] as $p) { - $out[] = shape('spec' => $p, 'optional' => false); - } - foreach ($spec['optional'] as $p) { - $out[] = shape('spec' => $p, 'optional' => true); - } - return $out->immutable(); - }, - 'trait' => shape( - 'requireExtends' => ImmSet { - \WebController::class, - }, - 'methodName' => 'getParameters', - 'getRawParametersCode' => '$this->getParameters_PRIVATE_IMPL()', - ), - 'output' => $classname ==> shape( - 'file' => $root.$classname.'Parameters.php', - 'class' => shape( - 'name' => $classname.'Parameters', - ), - 'trait' => shape( - 'name' => $classname.'ParametersTrait', - ), - ), - ); - } - - private static function getUriBuildersConfig( - ): Codegen::TUriBuilderCodegenConfig { - $root = LocalConfig::ROOT.'/src/site/controllers/codegen/'; - return shape( - 'output' => $classname ==> shape( - 'file' => $root.$classname.'URIBuilder.php', - 'class' => shape( - 'name' => $classname.'URIBuilder', - ), - ), - ); - } -} diff --git a/src/build/SASSBuildStep.php b/src/build/SASSBuildStep.php deleted file mode 100644 index 3c9e0bee5..000000000 --- a/src/build/SASSBuildStep.php +++ /dev/null @@ -1,33 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -final class SASSBuildStep extends BuildStep { - <<__Override>> - public function buildAll(): void { - \HH\Asio\join($this->buildAllAsync()); - } - - private async function buildAllAsync(): Awaitable<void> { - Log::i("\nBuilding SASS..."); - $exit_code = null; - list($exit_code, $stdout, $stderr) = await _Private\execute_async( - null, - SASSDependenciesBuildStep::getDartSASSExecutablePath(), - '--load-path='.LocalConfig::ROOT.'/sass', - '--load-path='.SASSDependenciesBuildStep::getFontAwesomeDir().'/scss', - LocalConfig::ROOT.'/sass/core.scss', - BuildPaths::CORE_CSS, - ); - invariant($exit_code === 0, "Failed to build core CSS: %s%s", $stdout,$stderr); - } -} diff --git a/src/build/SASSDependenciesBuildStep.php b/src/build/SASSDependenciesBuildStep.php deleted file mode 100644 index 1a36bbd22..000000000 --- a/src/build/SASSDependenciesBuildStep.php +++ /dev/null @@ -1,146 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -use namespace HH\Lib\{C, Str}; -use function HHVM\UserDocumentation\_Private\execute_async; - -final class SASSDependenciesBuildStep extends BuildStep { - const type TPlatformConfig = shape( - 'platform' => string, - 'url' => string, - 'sha256' => string, - ); - - public static function getPlatformConfiguration(): self::TPlatformConfig { - if (\HH\Lib\_Private\_OS\IS_MACOS) { - return shape( - 'platform' => 'macos-x64', - 'url' => - 'https://github.com/sass/dart-sass/releases/download/1.47.0/dart-sass-1.47.0-macos-x64.tar.gz', - 'sha256' => - '456392668cdd538f8c403e5b9cdd675cc9d7e9b7a8c0a6239a9114e114f2fa0d', - ); - } - - return shape( - 'platform' => 'linux-x64', - 'url' => - 'https://github.com/sass/dart-sass/releases/download/1.47.0/dart-sass-1.47.0-linux-x64.tar.gz', - 'sha256' => - '8e736455d56fb36f01904c5f24df0f98392eca090a1f2b666ac0985dd50d47c5', - ); - } - - private static function getDartSASSExecutableDir(): string { - $config = self::getPlatformConfiguration(); - return BuildPaths::FINAL_DIR. - '/dart-sass-'. - $config['platform']. - '-'. - Str\slice(self::getPlatformConfiguration()['sha256'], 0, 8); - } - - public static function getDartSASSExecutablePath(): string { - return self::getDartSASSExecutableDir().'/sass'; - } - - <<__Override>> - public function buildAll(): void { - \HH\Asio\join(async { - concurrent { - await self::installDartSASSAsync(); - await self::installFontAwesomeAsync(); - } - }); - } - - public static function getFontAwesomeDir(): string { - return BuildPaths::FINAL_DIR.'/fontawesome-free-5.15.4-web'; - } - - private static async function installFontAwesomeAsync(): Awaitable<void> { - $dir = self::getFontAwesomeDir(); - $test_file = $dir.'/scss/_core.scss'; - if (\file_exists($test_file)) { - Log::i("\nfont-awesome already installed."); - return; - } - Log::i("\nInstalling font-awesome..."); - - $url = 'https://github.com/FortAwesome/Font-Awesome/releases/download/5.15.4/fontawesome-free-5.15.4-web.zip'; - $zip_file_name = C\lastx(Str\split($url, '/')); - $zip_file_path = BuildPaths::SCRATCH_DIR.'/'.$zip_file_name; - - await self::downloadAndVerifyAsync($url, $zip_file_path, 'b9554077f70ac13c2e687e30d0fef15d5b64852b04b2a87fdb35f3edec395ae7'); - await execute_async( - shape('working_directory' => \dirname($dir)), - 'unzip', - $zip_file_path, - ); - - if (!\file_exists($test_file)) { - throw new \Exception('Failed to extract Font-Awesome - was looking for '.$test_file); - } - } - - private static async function downloadAndVerifyAsync( - string $url, - string $path, - string $expected_sha256, - ): Awaitable<void> { - await execute_async(null, 'wget', '-O', $path, $url); - $actual_sha256 = \hash('sha256', \file_get_contents($path)); - if ($actual_sha256 !== $expected_sha256) { - throw new \Exception(Str\format( - 'Hash of "%s" does not match: expected "%s", got "%s"', - $url, - $expected_sha256, - $actual_sha256, - )); - } - - } - - private static async function installDartSASSAsync(): Awaitable<void> { - if (\is_executable(self::getDartSASSExecutablePath())) { - Log::i("\nDartSASS is already installed."); - return; - } - Log::i("\nInstalling DartSASS for SASS..."); - $config = self::getPlatformConfiguration(); - $tar_name = C\lastx(Str\split($config['url'], '/')); - $tar_path = BuildPaths::SCRATCH_DIR.'/'.$tar_name; - - await self::downloadAndVerifyAsync( - $config['url'], - $tar_path, - $config['sha256'], - ); - - $dir = self::getDartSASSExecutableDir(); - if (!\is_dir($dir)) { - \mkdir($dir); - } - await execute_async( - shape('working_directory' => $dir), - 'tar', - '-zxvf', - $tar_path, - '--strip-components', - '1', - ); - if (!\file_exists(self::getDartSASSExecutablePath())) { - throw new \Exception('Failed to extract SASS binary'); - } - } -} diff --git a/src/build/SiteMapBuildStep.php b/src/build/SiteMapBuildStep.php deleted file mode 100644 index 345563ed5..000000000 --- a/src/build/SiteMapBuildStep.php +++ /dev/null @@ -1,88 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -use namespace HH\Lib\{C, Vec}; - -final class SiteMapBuildStep extends BuildStep { - const string ROOT = 'https://docs.hhvm.com'; - - <<__Override>> - public function buildAll(): void { - Log::i("\nBuilding Google Site Map"); - $url_lists = ImmVector { - $this->getIndexPages(), - $this->getAPIPages(), - $this->getGuidePages(), - }; - - $combined = Vector {}; - foreach ($url_lists as $url_list) { - $combined->addAll($url_list); - } - invariant( - \count($combined) < 50000, - 'more than 50,000 URLs in sitemap, need to split sitemap for Google', - ); - - $combined = $combined - ->map($x ==> self::ROOT.$x) - ->map($x ==> $x."\n"); - $text = \implode('', $combined); - - invariant( - \strlen($text) < 50 * 1024 * 1024, - 'site map > 50MB, need to split sitemap for Google', - ); - - \file_put_contents(BuildPaths::SITE_MAP, $text); - } - - private function getIndexPages(): ImmVector<string> { - return ImmVector { - '/', - '/hack/', - '/hhvm/', - '/hack/reference/', - }; - } - - private function getAPIPages(): vec<string> { - return Vec\concat( - $this->getPagesFromNavData( - APINavData::get(APIProduct::HACK)->getNavData(), - ), - $this->getPagesFromNavData( - APINavData::get(APIProduct::HSL)->getNavData(), - ), - ); - } - - private function getGuidePages(): ImmVector<string> { - return $this->getPagesFromNavData(GuidesNavData::getNavData()); - } - - private function getPagesFromNavData( - dict<string, NavDataNode> $roots, - ): ImmVector<string> { - $out = Vector {}; - $to_visit = \array_values($roots); - while (!C\is_empty($to_visit)) { - $node = \array_shift(inout $to_visit); - foreach ($node['children'] as $child) { - $to_visit[] = $child; - } - $out[] = $node['urlPath']; - } - return $out->toImmVector(); - } -} diff --git a/src/build/StaticResourceMapBuildStep.php b/src/build/StaticResourceMapBuildStep.php deleted file mode 100644 index 64b8e54c6..000000000 --- a/src/build/StaticResourceMapBuildStep.php +++ /dev/null @@ -1,78 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -final class StaticResourceMapBuildStep extends BuildStep { - private static function getTypes(): Map<string, string> { - return Map { - 'css' => 'text/css', - 'js' => 'application/javascript', - 'png' => 'image/png', - 'svg' => 'image/svg+xml', - // FIXME: NEEDS LESS JPEG (#81) - 'jpg' => 'image/jpeg', - 'jpeg' => 'image/jpeg', - 'otf' => 'application/vnd.ms-opentype', - 'eot' => 'application/vnd.ms-fontobject', - 'ttf' => 'application/x-font-ttf', - 'woff' => 'application/x-font-woff', - 'woff2' => 'font/woff2', - }; - } - - <<__Memoize>> - private static function getRoot(): string { - return \realpath(LocalConfig::ROOT.'/public/'); - } - - <<__Override>> - public function buildAll(): void { - Log::i("\nStaticResourcesMapBuild"); - - $sources = self::findSources( - self::getRoot(), - self::getTypes()->keys()->toSet(), - ); - - $map = self::makeMap($sources); - - \file_put_contents( - BuildPaths::STATIC_RESOURCES_MAP_JSON, - JSON\encode_dict($map), - ); - } - - private static function makeMap( - vec<string> $sources, - ): dict<string, StaticResourceMapEntry> { - $map = dict[]; - - $prefix_len = \strlen(self::getRoot()); - - $mimetype_map = self::getTypes(); - - foreach ($sources as $source) { - $relative = \substr($source, $prefix_len); - $full_hash = \hash('sha256', \file_get_contents($source)); - $ext = \pathinfo($source, \PATHINFO_EXTENSION); - - $map[$relative] = shape( - 'localPath' => $source, - 'checksum' => \substr($full_hash, 0, 16), - 'mtime' => \filemtime($source), - 'mimeType' => $mimetype_map->at($ext), - ); - } - - return $map; - } -} diff --git a/src/build/UnifiedAPIIndexBuildStep.php b/src/build/UnifiedAPIIndexBuildStep.php deleted file mode 100644 index 44c691fb1..000000000 --- a/src/build/UnifiedAPIIndexBuildStep.php +++ /dev/null @@ -1,153 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -use namespace HH\Lib\{C, Str}; -use namespace Facebook\{HackCodegen as CG, TypeAssert}; - -// Index of all definitions, so that markdown processing can -// automatically linkify them -final class UnifiedAPIIndexBuildStep extends BuildStep { - use CodegenBuildStep; - - <<__Override>> - public function buildAll(): void { - Log::i("\nUnifiedAPIIndexBuildStep"); - $cg = $this->getCodegenFactory(); - - $defs = Map {}; - $defs->setAll($this->getHackAPILinks(APIProduct::HACK)); - $defs->setAll($this->getHackAPILinks(APIProduct::HSL)); - $defs->setAll($this->getHackAPILinks(APIProduct::HSL_EXPERIMENTAL)); - $defs->setAll($this->getSpecialAttributeLinks()); - - $cg->codegenFile(BuildPaths::UNIFIED_INDEX) - ->setNamespace("HHVM\\UserDocumentation") - ->addClass( - $cg->codegenClass('UnifiedIndexData') - ->setIsFinal(true) - ->setIsAbstract(true) - ->addMethod( - $cg->codegenMethod('getIndex') - ->setIsStatic(true) - ->setReturnType('dict<string, string>') - ->setBody( - $cg->codegenHackBuilder() - ->addReturn( - dict($defs), - CG\HackBuilderValues::dict( - CG\HackBuilderKeys::export(), - CG\HackBuilderValues::export(), - ), - ) - ->getCode(), - ), - ), - ) - ->save(); - // Make it available to later build steps - require_once(BuildPaths::UNIFIED_INDEX); - - - $jump_index = dict[]; - foreach ($defs as $name => $url) { - $name = Str\lowercase($name); - if ( - (!C\contains_key($jump_index, $name)) || - Str\length($jump_index[$name]) > Str\length($url) - ) { - $jump_index[$name] = $url; - } - } - - $cg->codegenFile(BuildPaths::JUMP_INDEX) - ->setNamespace("HHVM\\UserDocumentation") - ->addClass( - $cg->codegenClass('JumpIndexData') - ->setIsFinal(true) - ->setIsAbstract(true) - ->addMethod( - $cg->codegenMethod('getIndex') - ->setIsStatic(true) - ->setReturnType('dict<string, string>') - ->setBody( - $cg->codegenHackBuilder() - ->addReturn( - $jump_index, - CG\HackBuilderValues::dict( - CG\HackBuilderKeys::export(), - CG\HackBuilderValues::export(), - ), - ) - ->getCode(), - ), - ), - ) - ->save(); - } - - private function getHackAPILinks( - APIProduct $product, - ): ImmMap<string, string> { - Log::v("\nProcessing %s API Index", $product); - - $out = Map {}; - $maybe_set = (string $name, string $url) ==> { - if ( - (!C\contains_key($out, $name)) || - Str\length($out[$name]) > Str\length($url) - ) { - $out[$name] = $url; - } - }; - - foreach (APIDefinitionType::getValues() as $type) { - $defs = APIIndex::get($product)->getIndexForType($type); - foreach ($defs as $_ => $def) { - $name = $def['name']; - $maybe_set($name, $def['urlPath']); - - if ($type === APIDefinitionType::FUNCTION_DEF) { - continue; - } - - $def = TypeAssert\matches_type_structure( - type_alias_structure(APIClassIndexEntry::class), - $def, - ); - - $methods = $def['methods']; - - foreach ($methods as $_ => $method) { - $name = $method['className'].'::'.$method['name']; - $maybe_set($name, $method['urlPath']); - } - } - } - return $out->toImmMap(); - } - - // For special attributes that don't exist in our API reference, but can be - // used in APIs, manually add special /j/search capability - private function getSpecialAttributeLinks(): ImmMap<string, string> { - return ImmMap { - '__memoize' => '/hack/attributes/special#__memoize', - '__consistentconstruct' => - '/hack/attributes/special#__consistentconstruct', - '__override' => '/hack/attributes/special#__override', - '__deprecated' => '/hack/attributes/special#__deprecated', - '__mockclass' => '/hack/attributes/special#__mockclass', - '__isfoldable' => '/hack/attributes/special#__isfoldable', - '__native' => '/hack/attributes/special#__native', - }; - } -} diff --git a/src/build/UpdateAutoloaderBuildStep.php b/src/build/UpdateAutoloaderBuildStep.php deleted file mode 100644 index 0678b7bd5..000000000 --- a/src/build/UpdateAutoloaderBuildStep.php +++ /dev/null @@ -1,50 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -use type Facebook\AutoloadMap\{IncludedRoots, RootImporter, Writer}; - -/** Update the HHVM autoload map. - * - * As we codegen Hack classes, we want a new autoload map with the generated - * classes. - */ -final class UpdateAutoloaderBuildStep extends BuildStep { - <<__Override>> - public function buildAll(): void { - Log::i("UpdateAutoloaderBuildStep\n"); - self::generateAutoloadMap(); - } - - public static function generateAutoloadMap(): void { - $dev = \Facebook\AutoloadMap\Generated\is_dev(); - $importer = new RootImporter( - LocalConfig::ROOT, - $dev ? IncludedRoots::DEV_AND_PROD : IncludedRoots::PROD_ONLY, - ); - - $config = $importer->getConfig(); - $handler = $dev - ? ($config['devFailureHandler'] ?? null) - : ($config['failureHandler'] ?? null); - - (new Writer()) - ->setBuilder($importer) - ->setRoot(LocalConfig::ROOT) - ->setRelativeAutoloadRoot($config['relativeAutoloadRoot']) - ->setFailureHandler( - /* HH_IGNORE_ERROR[4110] silent upcast from string to failure handler*/ $handler, - ) - ->setIsDev($dev) - ->writeToDirectory(LocalConfig::ROOT.'/vendor/'); - } -} diff --git a/src/build/UpdateTagsCLI.hack b/src/build/UpdateTagsCLI.hack deleted file mode 100644 index 0452869c8..000000000 --- a/src/build/UpdateTagsCLI.hack +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -use type Facebook\CLILib\CLIBase; -use namespace Facebook\CLILib\CLIOptions; -use namespace HH\Lib\{C, Dict, Str, Vec}; -use namespace Facebook\HackCodegen as CG; - -final class UpdateTagsCLI extends CLIBase { - const dict<APIProduct, (string, string)> REPOS_AND_TAG_PREFIXES = dict[ - APIProduct::HACK => tuple('facebook/hhvm', 'HHVM-'), - APIProduct::HSL => tuple('hhvm/hsl', 'v'), - APIProduct::HSL_EXPERIMENTAL => tuple('hhvm/hsl-experimental', 'v'), - ]; - private dict<APIProduct, string> $forcedTags = dict[]; - - <<__Override>> - protected function getSupportedOptions(): vec<CLIOptions\CLIOption> { - return vec[ - CLIOptions\with_required_string( - $version ==> { - $this->forcedTags[APIProduct::HACK] = $version; - }, - 'Use the specified HHVM tag instead of the latest release', - '--hhvm-tag', - ), - CLIOptions\with_required_string( - $version ==> { - $this->forcedTags[APIProduct::HSL] = $version; - }, - 'Use the specified HSL version instead of the latest release', - '--hsl-tag', - ), - CLIOptions\with_required_string( - $version ==> { - $this->forcedTags[APIProduct::HSL_EXPERIMENTAL] = $version; - }, - 'Use the specified HSL-Experimental version instead of the latest release', - '--hsl-experimental-tag', - ), - - ]; - } - - private async function getTagAsync(APIProduct $product): Awaitable<string> { - $forced = $this->forcedTags[$product] ?? null; - if ($forced !== null) { - return $forced; - } - list($project, $prefix) = self::REPOS_AND_TAG_PREFIXES[$product]; - - $refs = vec[ - 'git', - 'ls-remote', - '--tags', - 'https://github.com/'.$project.'.git', - '--quiet', - $prefix.'*' - ] - |> Vec\map($$, $arg ==> \escapeshellarg($arg)) - |> Str\join($$, ' ') - |> Str\trim(\shell_exec($$)) - |> Str\split($$, "\n"); - $tags = keyset[]; - foreach ($refs as $line) { - $parts = Str\split($line, "\t"); - // $ref = $parts[0]; - $name = $parts[1]; - $tags[] = Str\strip_prefix($name, 'refs/tags/'); - } - return Vec\sort($tags, ($a, $b) ==> \version_compare($a, $b)) - |> C\lastx($$); - } - - <<__Override>> - public async function mainAsync(): Awaitable<int> { - $new_tags = await Dict\map_with_key_async( - self::REPOS_AND_TAG_PREFIXES, - async ($product, $_) ==> await $this->getTagAsync($product), - ); - - $changes = dict[]; - foreach ($new_tags as $product => $new_tag) { - if ((PRODUCT_TAGS[$product] ?? null) !== $new_tag) { - $changes[$product] = $new_tag; - } - } - $stdout = $this->getTerminal()->getStdout(); - - if (C\is_empty($changes)) { - await $stdout->writeAllAsync("Nothing to do.\n"); - return 0; - } - await $stdout->writeAllAsync( - Dict\map_with_key( - $changes, - ($k, $v) ==> Str\format('%s to tag "%s"', $k, $v), - ) - |> Str\join($$, ', and ') - |> 'Changing '.$$."...\n", - ); - - if (C\contains_key($changes, APIProduct::HACK)) { - await $this->updateHHVMVersionAsync($changes[APIProduct::HACK]); - } - - $tags_file = LocalConfig::ROOT.'/src/codegen/PRODUCT_TAGS.php'; - await $stdout->writeAllAsync(' - Updating '.$tags_file."\n"); - $config = new CG\HackCodegenConfig(); - $cg = new CG\HackCodegenFactory( - $config->withFormatter(new CG\HackfmtFormatter($config)), - ); - $cg->codegenFile($tags_file) - ->setNamespace("HHVM\\UserDocumentation") - ->addConstant( - $cg->codegenConstant('PRODUCT_TAGS') - ->setType('dict<APIProduct, string>') - ->setValue( - $new_tags, - CG\HackBuilderValues::dict( - CG\HackBuilderKeys::lambda( - ($_, $p) ==> 'APIProduct::'.APIProduct::getNames()[$p], - ), - CG\HackBuilderValues::export(), - ), - ), - ) - ->save(); - - await $stdout->writeAllAsync( - "Done! Next steps:\n". - " - update your HHVM installation if needed\n". - " - php composer.phar update\n". - " - hhvm bin/build.php\n". - " - hh_client\n". - " - hhvm vendor/bin/hacktest tests/\n", - ); - return 0; - } - - private async function updateHHVMVersionAsync( - string $hhvm_tag, - ): Awaitable<void> { - $new_major_minor = $hhvm_tag - |> Str\strip_prefix($$, 'HHVM-') - |> Str\split($$, '.') - |> Vec\take($$, 2) - |> Str\join($$, '.'); - $old_major_minor = PRODUCT_TAGS[APIProduct::HACK] - |> Str\strip_prefix($$, 'HHVM-') - |> Str\split($$, '.') - |> Vec\take($$, 2) - |> Str\join($$, '.'); - $stdout = $this->getTerminal()->getStdout(); - - await $stdout->writeAllAsync(" - updating composer.json\n"); - $this->updateComposerJson($new_major_minor); - - await $stdout->writeAllAsync(" - updating Dockerfiles\n"); - $dockerfiles = \glob(LocalConfig::ROOT.'/.deploy/*.Dockerfile'); - $dockerfiles[] = LocalConfig::ROOT.'/.devcontainer/Dockerfile'; - - foreach ($dockerfiles as $path) { - \file_get_contents($path) - |> Str\replace( - $$, - 'hhvm-proxygen:'.$old_major_minor.'-latest', - 'hhvm-proxygen:'.$new_major_minor.'-latest', - ) - |> Str\replace( - $$, - 'hhvm:'.$old_major_minor.'-latest', - 'hhvm:'.$new_major_minor.'-latest', - ) - |> \file_put_contents($path, $$); - } - await $stdout->writeAllAsync(" - updating GitHub Actions\n"); - $path = LocalConfig::ROOT.'/.github/workflows/build-and-test.yml'; - \file_get_contents($path) - |> Str\replace( - $$, - "hhvm: [ '".$old_major_minor."' ]", - "hhvm: [ '".$new_major_minor."' ]", - ) - |> \file_put_contents($path, $$); - } - - private function updateComposerJson(string $hhvm_major_minor): void { - $path = LocalConfig::ROOT.'/composer.json'; - $composer = \json_decode( - \file_get_contents($path), - /* assoc = */ true, - /* depth = */ 512, - \JSON_FB_HACK_ARRAYS, - ); - $composer['require']['hhvm'] = $hhvm_major_minor.'.*'; - \file_put_contents( - $path, - \json_encode($composer, \JSON_PRETTY_PRINT | \JSON_UNESCAPED_SLASHES). - "\n", - ); - } -} diff --git a/src/codegen/PRODUCT_TAGS.php b/src/codegen/PRODUCT_TAGS.php deleted file mode 100644 index b151a6692..000000000 --- a/src/codegen/PRODUCT_TAGS.php +++ /dev/null @@ -1,13 +0,0 @@ -<?hh // strict -/** - * This file is generated. Do not modify it manually! - * - * @generated SignedSource<<27c0c9a0df9e3256d320e0a0877d8964>> - */ -namespace HHVM\UserDocumentation; - -const dict<APIProduct, string> PRODUCT_TAGS = dict[ - APIProduct::HACK => 'HHVM-4.164.0', - APIProduct::HSL => 'v4.108.1', - APIProduct::HSL_EXPERIMENTAL => 'v4.108.0', -]; diff --git a/src/hh-apidoc-extensions/APIDefinitionTypeBasedPathProvider.php b/src/hh-apidoc-extensions/APIDefinitionTypeBasedPathProvider.php deleted file mode 100644 index f1e0b1ed6..000000000 --- a/src/hh-apidoc-extensions/APIDefinitionTypeBasedPathProvider.php +++ /dev/null @@ -1,83 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation\HHAPIDocExt; - -use type HHVM\UserDocumentation\APIDefinitionType; -use namespace Facebook\HHAPIDoc; - -trait APIDefinitionTypeBasedPathProvider<T as ?string> { - require implements HHAPIDoc\IPathProvider<T>; - - abstract protected function getPathForClassish( - APIDefinitionType $type, - string $class, - ): T; - - abstract protected function getPathForClassishMethod( - APIDefinitionType $type, - string $class, - string $method, - ): T; - - final public function getPathForClass(string $class): T { - return $this->getPathForClassish(APIDefinitionType::CLASS_DEF, $class); - } - - public function getPathForInterface(string $class): T { - return $this->getPathForClassish(APIDefinitionType::INTERFACE_DEF, $class); - } - - public function getPathForTrait(string $class): T { - return $this->getPathForClassish(APIDefinitionType::TRAIT_DEF, $class); - } - - final public function getPathForClassMethod( - string $class, - string $method, - ): T { - return $this->getPathForClassishMethod( - APIDefinitionType::CLASS_DEF, - $class, - $method, - ); - } - - final public function getPathForInterfaceMethod( - string $class, - string $method, - ): T { - return $this->getPathForClassishMethod( - APIDefinitionType::INTERFACE_DEF, - $class, - $method, - ); - } - public function getPathForTraitMethod(string $trait, string $method): T { - return $this->getPathForClassishMethod( - APIDefinitionType::TRAIT_DEF, - $trait, - $method, - ); - } - - public function getPathForTransparentTypeAlias(string $alias): string { - invariant_violation( - 'Transparent type aliases are not implemented: %s', - $alias, - ); - } - - public function getPathForOpaqueTypeAlias(string $alias): string { - invariant_violation('Opaque type aliases are not implemented: %s', $alias); - } - -} diff --git a/src/hh-apidoc-extensions/MarkdownBuilder.php b/src/hh-apidoc-extensions/MarkdownBuilder.php deleted file mode 100644 index ce368734a..000000000 --- a/src/hh-apidoc-extensions/MarkdownBuilder.php +++ /dev/null @@ -1,49 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation\HHAPIDocExt; - -use namespace Facebook\HHAPIDoc; -use namespace HH\Lib\{C, Keyset, Vec}; - -final class MarkdownBuilder extends HHAPIDoc\DocumentationBuilder { - <<__Override>> - protected function getPageSections( - ): keyset<classname<HHAPIDoc\PageSections\PageSection>> { - $inherited = Keyset\filter( - parent::getPageSections(), - $section ==> - $section !== HHAPIDoc\PageSections\NameHeading::class && - // InterfaceSynopsis moved to the bottom (see below) - $section !== HHAPIDoc\PageSections\InterfaceSynopsis::class, - ); - $sections = Vec\concat( - vec[ - PageSections\FrontMatter::class, - ], - $inherited, - vec[ - PageSections\Examples::class, - HHAPIDoc\PageSections\InterfaceSynopsis::class, - ], - ); - // Insert "Guides" after description. - $desc_key = C\find_key( - $sections, - $s ==> $s === HHAPIDoc\PageSections\Description::class, - ) as nonnull; - return Keyset\union( - Vec\take($sections, $desc_key + 1), - vec[PageSections\Guides::class], - Vec\slice($sections, $desc_key + 1), - ); - } -} diff --git a/src/hh-apidoc-extensions/PageSections/Examples.php b/src/hh-apidoc-extensions/PageSections/Examples.php deleted file mode 100644 index ed3c02b5c..000000000 --- a/src/hh-apidoc-extensions/PageSections/Examples.php +++ /dev/null @@ -1,47 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation\HHAPIDocExt\PageSections; - -use type Facebook\DefinitionFinder\{ScannedClassish, ScannedFunction}; -use type Facebook\HHAPIDoc\PageSections\PageSection; -use type HHVM\UserDocumentation\BuildPaths; -use namespace HH\Lib\Str; - -final class Examples extends PageSection { - <<__Override>> - public function getMarkdown(): ?string { - if ($this->parent !== null) { - $subdirectory = 'class.'.$this->parent->getName().'/'; - } else if ($this->definition is ScannedClassish) { - $subdirectory = 'class.'; - } else if ($this->definition is ScannedFunction) { - $subdirectory = 'function.'; - } else { - invariant_violation( - 'Please add support for definitions of type %s to %s.', - \get_class($this->definition), - __METHOD__, - ); - } - $subdirectory .= $this->definition->getName(); - - $path = Str\format( - '%s/%s.md', - BuildPaths::API_EXAMPLES_DIR, - Str\replace($subdirectory, '\\', '.'), - ); - - return \file_exists($path) - ? "## Examples\n\n".\file_get_contents($path) - : null; - } -} diff --git a/src/hh-apidoc-extensions/PageSections/FrontMatter.php b/src/hh-apidoc-extensions/PageSections/FrontMatter.php deleted file mode 100644 index 0e7662e2b..000000000 --- a/src/hh-apidoc-extensions/PageSections/FrontMatter.php +++ /dev/null @@ -1,76 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation\HHAPIDocExt\PageSections; - -use type Facebook\HHAPIDoc\PageSections\PageSection; -use type HHVM\UserDocumentation\{LocalConfig, YAMLMeta}; -use type Facebook\DefinitionFinder\ScannedClassish; -use namespace HHVM\UserDocumentation\JSON; -use namespace HH\Lib\{C, Str, Vec}; - -final class FrontMatter extends PageSection { - <<__Override>> - public function getMarkdown(): string { - $json = JSON\encode_shape(YAMLMeta::class, $this->getData()); - return "```yamlmeta\n".$json."\n```"; - } - - private function getData(): YAMLMeta { - $def = $this->definition; - $data = shape( - 'name' => $def->getName(), - 'namespace' => $def->getNamespaceName(), - 'sources' => Vec\map( - $this->documentable['sources'], - $source ==> Str\strip_prefix($source, LocalConfig::ROOT.'/'), - ), - ); - - $class = $this->parent; - if ($class) { - $data['class'] = $class->getName(); - } else if ($def is ScannedClassish) { - $data['class'] = $def->getName(); - } - - $top_level_def = $class ?? $def; - - if ( - ( - $top_level_def->getNamespaceName() === "HH\\Lib" || - Str\starts_with($top_level_def->getNamespaceName(), "HH\\Lib\\") - ) && - !C\any($data['sources'], $s ==> Str\starts_with($s, 'api-sources/hsl-experimental')) - ) { - $data['fbonly messages'] ??= vec[]; - $data['fbonly messages'][] = Str\format( - '%s is available as `%s` in the www repository.', - $class is nonnull ? 'The containing class' : 'This', - Str\strip_prefix($top_level_def->getName(), 'HH\\Lib\\'), - ); - } else if ( - C\any( - $data['sources'], - $s ==> Str\starts_with($s, 'api-sources/hsl-experimental/'), - ) - ) { - $data['lib'] = shape( - 'name' => 'the Hack Standard Library - Experimental Additions', - 'github' => 'hhvm/hsl-experimental', - 'composer' => 'hhvm/hsl-experimental', - ); - } - - - return $data; - } -} diff --git a/src/hh-apidoc-extensions/PageSections/Guides.php b/src/hh-apidoc-extensions/PageSections/Guides.php deleted file mode 100644 index 950a59e5c..000000000 --- a/src/hh-apidoc-extensions/PageSections/Guides.php +++ /dev/null @@ -1,41 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation\HHAPIDocExt\PageSections; - -use type Facebook\HHAPIDoc\PageSections\PageSection; -use type HHVM\UserDocumentation\GuidesNavData; -use namespace HH\Lib\{C, Str}; - -final class Guides extends PageSection { - - <<__Override>> - public function getMarkdown(): ?string { - $guides = $this->docBlock?->getTagsByName('@guide'); - if ($guides is null || C\is_empty($guides)) { - return null; - } - - $markdown = '## Guide'; - if (C\count($guides) > 1) { - $markdown .= 's'; - } - $markdown .= "\n\n"; - - foreach ($guides as $path) { - $path = Str\strip_suffix($path, '/'); - $name = GuidesNavData::pathToName(C\lastx(Str\split($path, '/'))); - $markdown .= Str\format("* [%s](%s)\n", $name, $path); - } - - return $markdown; - } -} diff --git a/src/hh-apidoc-extensions/PathProvider.php b/src/hh-apidoc-extensions/PathProvider.php deleted file mode 100644 index d2ebb167a..000000000 --- a/src/hh-apidoc-extensions/PathProvider.php +++ /dev/null @@ -1,91 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation\HHAPIDocExt; - -use type HHVM\UserDocumentation\APIProduct; -use namespace Facebook\HHAPIDoc; -use namespace HH\Lib\{C, Vec}; - -final class PathProvider implements HHAPIDoc\IPathProvider<?string> { - private vec<HHAPIDoc\IPathProvider<?string>> $providers; - - public function __construct() { - $this->providers = APIProduct::getValues() - |> Vec\map($$, $p ==> new ProductPathProvider($p)); - } - - public function getPathForClass(string $class): ?string { - return $this->providers - |> Vec\map($$, $p ==> $p->getPathForClass($class)) - |> Vec\filter_nulls($$) - |> C\first($$); - } - - public function getPathForInterface(string $class): ?string { - return $this->providers - |> Vec\map($$, $p ==> $p->getPathForInterface($class)) - |> Vec\filter_nulls($$) - |> C\first($$); - } - - public function getPathForTrait(string $class): ?string { - return $this->providers - |> Vec\map($$, $p ==> $p->getPathForTrait($class)) - |> Vec\filter_nulls($$) - |> C\first($$); - } - - public function getPathForClassMethod( - string $class, - string $method, - ): ?string { - return $this->providers - |> Vec\map($$, $p ==> $p->getPathForClassMethod($class, $method)) - |> Vec\filter_nulls($$) - |> C\first($$); - } - - public function getPathForInterfaceMethod( - string $class, - string $method, - ): ?string { - return $this->providers - |> Vec\map($$, $p ==> $p->getPathForInterfaceMethod($class, $method)) - |> Vec\filter_nulls($$) - |> C\first($$); - } - - public function getPathForTraitMethod( - string $trait, - string $method, - ): ?string { - return $this->providers - |> Vec\map($$, $p ==> $p->getPathForTraitMethod($trait, $method)) - |> Vec\filter_nulls($$) - |> C\first($$); - } - - public function getPathForFunction(string $function): ?string { - return $this->providers - |> Vec\map($$, $p ==> $p->getPathForFunction($function)) - |> Vec\filter_nulls($$) - |> C\first($$); - } - - public function getPathForOpaqueTypeAlias(string $_alias): ?string { - return null; - } - - public function getPathForTransparentTypeAlias(string $_alias): ?string { - return null; - } -} diff --git a/src/hh-apidoc-extensions/ProductPathProvider.php b/src/hh-apidoc-extensions/ProductPathProvider.php deleted file mode 100644 index 005c638b7..000000000 --- a/src/hh-apidoc-extensions/ProductPathProvider.php +++ /dev/null @@ -1,59 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation\HHAPIDocExt; - -use namespace Facebook\HHAPIDoc; -use type HHVM\UserDocumentation\{APIDefinitionType, APIIndex, APIProduct}; -use namespace HH\Lib\Str; - -final class ProductPathProvider implements HHAPIDoc\IPathProvider<?string> { - use APIDefinitionTypeBasedPathProvider<?string>; - private APIIndex $index; - - public function __construct(APIProduct $product) { - $this->index = APIIndex::get($product); - } - - private static function normalize(string $name): string { - return Str\replace($name, "\\", '.'); - } - - protected function getPathForClassish( - APIDefinitionType $type, - string $class, - ): ?string { - $def = $this->index->getClassIndex($type)[self::normalize($class)] ?? null; - return $def === null ? null : $def['urlPath']; - } - - protected function getPathForClassishMethod( - APIDefinitionType $type, - string $class, - string $method, - ): ?string { - $class = $this->index - ->getClassIndex($type)[self::normalize($class)] ?? - null; - if ($class === null) { - return null; - } - return $class['methods'][$method]['urlPath'] ?? null; - } - - public function getPathForFunction(string $function): ?string { - $def = $this->index->getFunctionIndex()[self::normalize($function)] ?? null; - if ($def === null) { - return null; - } - return $def['urlPath']; - } -} diff --git a/src/main.hhi b/src/main.hhi deleted file mode 100644 index e688c9623..000000000 --- a/src/main.hhi +++ /dev/null @@ -1,8 +0,0 @@ -<?hh // strict - -/** This declaration exists so that contributors get a typechecker error if they - * add a function called \main() to the guides examples. - */ -<<__Deprecated("I am not a main function, I am just a tribute")>> -function main(): void { -} diff --git a/src/markdown-extensions/AutoLinkifyInline.php b/src/markdown-extensions/AutoLinkifyInline.php deleted file mode 100644 index e74de0c5f..000000000 --- a/src/markdown-extensions/AutoLinkifyInline.php +++ /dev/null @@ -1,161 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation\MarkdownExt; - -use type HHVM\UserDocumentation\{UnifiedIndexData, YAMLMeta}; - -use namespace Facebook\Markdown\Inlines; -use namespace HH\Lib\{Regex, Str, Vec}; - -/** - * Given something like `Vec\map()`, automatically make it a link - */ -final class AutoLinkifyInline extends Inlines\Link { - private static bool $disabled = false; - - <<__Override>> - public static function consume( - Inlines\Context $context, - string $markdown, - int $offset, - ): ?(Inlines\Link, int) { - if (self::$disabled) { - return null; - } - - // If there is a link at the current position, parse it using the standard - // Inlines\Link, but with auto-linkifying disabled because nested links are - // invalid HTML. - self::$disabled = true; - try { - $result = Inlines\Link::consume($context, $markdown, $offset); - } finally { - self::$disabled = false; - } - if ($result is nonnull) { - return $result; - } - - $result = Inlines\CodeSpan::consume($context, $markdown, $offset); - if ($result === null) { - return null; - } - list($quoted, $offset) = $result; - - $content = $quoted->getCode(); - if ($content === null) { - return null; - } - - if (Str\starts_with($content, '$')) { - return null; - } - - $matches = Regex\first_match($content, re"/^[^(<]+/"); - if ($matches is null) { - return null; - } - $definition = $matches[0]; - - if (Str\contains($definition, ' ')) { - return null; - } - - $block_context = $context->getBlockContext(); - invariant( - $block_context is BlockContext, - 'Expected block context to be a %s', - BlockContext::class, - ); - $meta = $block_context->getYamlMeta(); - - $name = ($meta['name'] ?? null); - if ($name !== null && Str\ends_with($name, $definition)) { - return null; - } - - $method = self::getMethodTarget($meta, $definition); - - $prefixes = vec[ - $meta['namespace'] ?? null, - '', - "HH", - "HH\\Lib", - "HH\\Lib\\Experimental", - ] - |> Vec\filter_nulls($$); - - $suffixes = vec[$definition, $method] - |> Vec\filter_nulls($$); - - $to_try = self::product2($prefixes, $suffixes) - |> Vec\map($$, $parts ==> { - // Concat namespace parts and ignore parts that are empty - list($prefix, $suffix) = $parts; - return vec[$prefix, $suffix] - |> Vec\filter($$, $part ==> !Str\is_empty($part)) - |> Str\join($$, '\\'); - }); - - $index = self::getIndex(); - - foreach ($to_try as $def) { - $target = $index[$def] ?? null; - if ($target !== null) { - return tuple(self::makeAutoLink($quoted, $target), $offset); - } - } - - return null; - } - - private static function product2<Tv1, Tv2>( - Traversable<Tv1> $first, - Traversable<Tv2> $second, - ): Iterator<(Tv1, Tv2)> { - foreach ($first as $f) { - foreach ($second as $s) { - yield tuple($f, $s); - } - } - } - - private static function getMethodTarget( - ?YAMLMeta $yaml, - string $def, - ): ?string { - if ($yaml === null) { - return null; - } - if (Str\contains($def, '::')) { - return null; - } - $class = $yaml['class'] ?? null; - if ($class === null) { - return null; - } - - return $class.'::'.Str\strip_prefix($def, '::'); - } - - private static function makeAutoLink( - Inlines\CodeSpan $code, - string $target, - ): Inlines\Link { - return new Inlines\Link(vec[$code], $target, null); - } - - <<__Memoize>> - private static function getIndex(): dict<string, string> { - return UnifiedIndexData::getIndex(); - } -} diff --git a/src/markdown-extensions/BlockContext.php b/src/markdown-extensions/BlockContext.php deleted file mode 100644 index 3ac34b699..000000000 --- a/src/markdown-extensions/BlockContext.php +++ /dev/null @@ -1,34 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation\MarkdownExt; - -use type HHVM\UserDocumentation\YAMLMeta; -use namespace Facebook\Markdown\UnparsedBlocks; - -final class BlockContext extends UnparsedBlocks\Context { - private ?YAMLMeta $yamlMeta = null; - - public function setYamlMeta(YAMLMeta $meta): this { - $this->yamlMeta = $meta; - return $this; - } - - public function getYamlMeta(): ?YAMLMeta { - return $this->yamlMeta; - } - - <<__Override>> - public function resetFileData(): this { - $this->yamlMeta = null; - return parent::resetFileData(); - } -} diff --git a/src/markdown-extensions/ExampleIncludeBlock.php b/src/markdown-extensions/ExampleIncludeBlock.php deleted file mode 100644 index 3831f0420..000000000 --- a/src/markdown-extensions/ExampleIncludeBlock.php +++ /dev/null @@ -1,196 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation\MarkdownExt; - -use namespace Facebook\Markdown\UnparsedBlocks; - -use namespace HH\Lib\{C, Keyset, Regex, Str}; - -final class ExamplesIncludeBlock implements UnparsedBlocks\BlockProducer { - - const START_MARKER = '@example-start'; - const END_MARKER = '@example-end'; - - const string PATTERN = '/^@@ (?<dir>[^@ ]+)'. - '(?<file>[^@ \\/]+\\.(php|hack)'. - '(?:.type-errors)?'. - '(?:.(hhvm|typechecker).expect[f]?)?'. - ') @@$/'; - - public static function consume( - UnparsedBlocks\Context $context, - UnparsedBlocks\Lines $lines, - ): ?(UnparsedBlocks\Block, UnparsedBlocks\Lines) { - list($first, $rest) = $lines->getFirstLineAndRest(); - $matches = darray[]; - if (\preg_match_with_matches(self::PATTERN, $first, inout $matches) !== 1) { - return null; - } - - $dir = (string)$matches['dir']; - $file = (string)$matches['file']; - - if (Str\starts_with($dir, '/')) { - $file = $dir.$file; - } else { - $md = $context->getFilePath(); - invariant($md !== null, 'must have file path set on block context'); - $root = \dirname($md); - $subdir = Str\strip_suffix(\basename($md), '.md'); - - // 01-foo/examples/bar.php is referenced in the markdown as - // foo/examples/bar.php, to make re-ordering easier - $match = Str\trim_left($subdir, '1234567890-'); - if (!Str\starts_with($dir, $match)) { - return null; - } - - $file = $root.'/'.$subdir.Str\strip_prefix($dir, $match).$file; - } - - - invariant( - \file_exists($file), - 'failed to find file %s, referenced by %s', - $file, - $context->getFilePath(), - ); - - return tuple( - UnparsedBlocks\BlockSequence::flatten( - self::getExampleBlock($file), - self::getOutputBlock($file), - ), - $rest, - ); - } - - private static function getExampleBlock(string $file): UnparsedBlocks\Block { - $code = \file_get_contents($file); - - $start_pos = Str\search($code, self::START_MARKER); - if ($start_pos is nonnull) { - // Actual start should be the next line after the marker. - $start_pos = Str\search($code, "\n", $start_pos) as nonnull; - $code = Str\slice($code, $start_pos + 1); - - invariant( - !Str\contains($code, self::START_MARKER), - '%s contains multiple %s', - $file, - self::START_MARKER, - ); - - $end_pos = Str\search($code, self::END_MARKER); - if ($end_pos is nonnull) { - $code = Str\slice($code, 0, $end_pos); - // Actual end should be the end of the previous line before the marker. - $end_pos = Str\search_last($code, "\n") as nonnull; - $code = Str\slice($code, 0, $end_pos + 1); - } - } else { - // No explicit start marker, use magic. - - // First, strip initial boilerplate lines (<?hh/namespace/use/empty). - $code = Regex\replace( - $code, - re"/^( *(<\\?hh.*|namespace .+;|use namespace HH\\\\.+;|)\n)+/", - '', - ); - - // If the remaining code is a single <<__EntryPoint>> function, extract - // its body. - $match = Regex\first_match( - $code, - re"/^ - \\s* - <<__EntryPoint>> - \\s* - function \\s+ [_a-zA-Z0-9]+\\(\\): \\s* void \\s* { \\n - (?<body> - # one or more indented or empty lines - (\\ \\ .*\\n|\\n)+ - ) - } - \\s* - $/x", - ); - - if ($match is nonnull) { - $code = $match['body']; - } - } - - invariant( - !Str\contains($code, self::END_MARKER), - '%s contains %s without a matching %s', - $file, - self::END_MARKER, - self::START_MARKER, - ); - - // If all (non-empty) lines are indented (usually happens if we extracted a - // function body above), find the minimum indentation and unindent by that - // amount. - if (!Regex\matches($code, re"/^[^ \n]/m")) { - $code = Regex\every_match($code, re"/^ +/m") - |> Keyset\map($$, $match ==> $match[0]) - |> Keyset\sort($$) - |> C\firstx($$) - |> Str\replace($code, "\n".$$, "\n"); - } - - $code = Regex\replace($code, re"/ *\\\\init_docs_autoloader\\(\\);\n/", ''); - - return new UnparsedBlocks\FencedCodeBlock(Str\trim($code), 'Hack'); - } - - private static function getOutputBlock(string $file): ?UnparsedBlocks\Block { - if (\file_exists($file.'.no.auto.output')) { - return null; - } - - $out = $file.'.example.hhvm.out'; - $expect = $file.'.hhvm.expect'; - - $out_exists = \file_exists($out); - $expect_exists = \file_exists($expect); - - invariant( - !($out_exists && $expect_exists), - 'both %s and %s exist.', - $out, - $expect, - ); - - invariant( - $out_exists || $expect_exists || Str\contains($file, '.inc.php'), - 'none of %s, %s, or %s exist.', - $out, - $expect, - $file.'.no.auto.output', - ); - if (!($out_exists || $expect_exists)) { - return null; - } - - $out = $out_exists ? $out : $expect; - - return UnparsedBlocks\BlockSequence::flatten( - new UnparsedBlocks\HTMLBlock('<em>Output</em>'), - new UnparsedBlocks\FencedCodeBlock( - Str\trim(\file_get_contents($out)), - null, - ), - ); - } -} diff --git a/src/markdown-extensions/HTMLRenderer.php b/src/markdown-extensions/HTMLRenderer.php deleted file mode 100644 index 685273b7f..000000000 --- a/src/markdown-extensions/HTMLRenderer.php +++ /dev/null @@ -1,49 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation\MarkdownExt; - -use namespace Facebook\Markdown; -use namespace HH\Lib\{Str, Vec}; - -final class HTMLRenderer extends Markdown\HTMLRenderer { - <<__Override>> - protected function renderTableExtension( - Markdown\Blocks\TableExtension $table, - ): string { - return '<div class="tableWrapper">'. - parent::renderTableExtension($table). - '</div>'; - } - - <<__Override>> - protected function renderTableDataCell( - Markdown\Blocks\TableExtension $table, - int $_row_idx, - int $col_idx, - Markdown\Blocks\TableExtension::TCell $cell, - ): string { - $align = $table->getColumnAlignments()[$col_idx]; - if ($align !== null) { - $align = ' align="'.$align.'"'; - } - $heading = $table->getHeader()[$col_idx] - |> Vec\map($$, $part ==> $part->getContentAsPlainText()) - |> Str\join($$, ''); - return '<td'. - $align. - ' data-heading="'. - self::escapeAttribute($heading). - '">'. - $this->renderNodes($cell). - '</td>'; - } -} diff --git a/src/markdown-extensions/HeadingAnchorsFilter.php b/src/markdown-extensions/HeadingAnchorsFilter.php deleted file mode 100644 index c42142abc..000000000 --- a/src/markdown-extensions/HeadingAnchorsFilter.php +++ /dev/null @@ -1,60 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation\MarkdownExt; - -use namespace Facebook\Markdown\Blocks; -use namespace HH\Lib\{C, Str, Vec}; -use type Facebook\Markdown\{ASTNode, RenderContext, RenderFilter}; - -final class HeadingAnchorsFilter extends RenderFilter { - private vec<HeadingWithAnchor> $previous = vec[]; - - <<__Override>> - public function resetFileData(): this { - $this->previous = vec[]; - return $this; - } - - <<__Override>> - public function filter(RenderContext $_, ASTNode $heading): vec<ASTNode> { - if (!$heading is Blocks\Heading) { - return vec[$heading]; - } - - $id_prefix = ''; - if ($heading->getLevel() > 1) { - for ($i = C\count($this->previous) - 1; $i >= 0; --$i) { - $last = $this->previous[$i]; - if ($last->getLevel() < $heading->getLevel()) { - $id_prefix = $last->getID().'__'; - break; - } - } - } - - $id = $heading->getHeading() - |> Vec\map($$, $inline ==> $inline->getContentAsPlainText()) - |> Str\join($$, '') - |> \preg_replace('/\s+/', '-', $$) - |> \preg_replace('/[^a-zA-Z0-9_\.-]/', '', $$) - |> Str\lowercase($$) - |> $id_prefix.$$; - - $with_anchor = new HeadingWithAnchor( - $heading->getLevel(), - $heading->getHeading(), - $id, - ); - $this->previous[] = $with_anchor; - return vec[$with_anchor]; - } -} diff --git a/src/markdown-extensions/HeadingWithAnchor.php b/src/markdown-extensions/HeadingWithAnchor.php deleted file mode 100644 index a9484b661..000000000 --- a/src/markdown-extensions/HeadingWithAnchor.php +++ /dev/null @@ -1,57 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation\MarkdownExt; - -use namespace Facebook\Markdown; -use namespace HH\Lib\{Str, Vec}; - -final class HeadingWithAnchor - extends Markdown\Blocks\LeafBlock - implements Markdown\RenderableAsHTML { - public function __construct( - private int $level, - private vec<Markdown\Inlines\Inline> $heading, - private string $id, - ) { - } - - public function getLevel(): int { - return $this->level; - } - - public function getID(): string { - return $this->id; - } - - public function renderAsHTML( - Markdown\RenderContext $_ctx, - Markdown\HTMLRenderer $renderer, - ): string { - $contents = $this->heading - |> Vec\map($$, $part ==> $renderer->render($part)) - |> Str\join($$, ''); - $id = Markdown\_Private\plain_text_to_html_attribute($this->id); - return '<h'. - $this->level. - ' class="headingWithAnchor"'. - ' id="'. - $id. - '">'. - $contents. - '<a href="#'. - $id. - '"><i class="glyphIcon fa fa-link"></i></a>'. - '</h'. - $this->level. - ">\n"; - } -} diff --git a/src/markdown-extensions/IncludeGeneratedMarkdownBlock.php b/src/markdown-extensions/IncludeGeneratedMarkdownBlock.php deleted file mode 100644 index d06a6538d..000000000 --- a/src/markdown-extensions/IncludeGeneratedMarkdownBlock.php +++ /dev/null @@ -1,87 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation\MarkdownExt; - -use type HHVM\UserDocumentation\BuildPaths; -use namespace Facebook\Markdown\UnparsedBlocks; -use namespace HH\Lib\Str; - -final class IncludeGeneratedMarkdownBlock - implements UnparsedBlocks\BlockProducer { - const string PATTERN = '/^@@ guides-generated-markdown\/(?<file>[^ @]+) @@$/'; - - public static function consume( - UnparsedBlocks\Context $context, - UnparsedBlocks\Lines $lines, - ): ?(UnparsedBlocks\Block, UnparsedBlocks\Lines) { - list($first, $rest) = $lines->getFirstLineAndRest(); - $matches = darray[]; - if (\preg_match_with_matches(self::PATTERN, $first, inout $matches) !== 1) { - return null; - } - - $file = BuildPaths::GUIDES_GENERATED_MARKDOWN.'/'.$matches['file']; - invariant( - \file_exists($file), - "'%s' does not exist - expected by '%s'", - $file, - $context->getFilePath(), - ); - - $inner_doc = UnparsedBlocks\parse($context, \file_get_contents($file)); - - return tuple($inner_doc, $rest); - } - - private static function getExampleBlock(string $file): UnparsedBlocks\Block { - return new UnparsedBlocks\FencedCodeBlock( - \file_get_contents($file), - 'Hack', - ); - } - private static function getOutputBlock(string $file): ?UnparsedBlocks\Block { - if (\file_exists($file.'.no.auto.output')) { - return null; - } - - $out = $file.'.example.hhvm.out'; - $expect = $file.'.hhvm.expect'; - - $out_exists = \file_exists($out); - $expect_exists = \file_exists($expect); - - invariant( - !($out_exists && $expect_exists), - 'both %s and %s exist.', - $out, - $expect, - ); - - invariant( - $out_exists || $expect_exists || Str\contains($file, '.inc.php'), - 'none of %s, %s, or %s exist.', - $out, - $expect, - $file.'.no.auto.output', - ); - if (!($out_exists || $expect_exists)) { - return null; - } - - $out = $out_exists ? $out : $expect; - - return UnparsedBlocks\BlockSequence::flatten( - new UnparsedBlocks\HTMLBlock('<em>Output</em>'), - new UnparsedBlocks\FencedCodeBlock(\file_get_contents($out), null), - ); - } -} diff --git a/src/markdown-extensions/InternalMarkdownLinksFilter.php b/src/markdown-extensions/InternalMarkdownLinksFilter.php deleted file mode 100644 index c847abcd5..000000000 --- a/src/markdown-extensions/InternalMarkdownLinksFilter.php +++ /dev/null @@ -1,64 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation\MarkdownExt; - -use type Facebook\Markdown\{ASTNode, RenderContext, RenderFilter}; -use namespace Facebook\Markdown\Inlines; -use namespace HH\Lib\Str; - -final class InternalMarkdownLinksFilter extends RenderFilter { - <<__Override>> - public function filter(RenderContext $_, ASTNode $node): vec<ASTNode> { - if ($node is Inlines\Link) { - return $this->filterLink($node); - } - if ($node is Inlines\AutoLink) { - return $this->filterAutoLink($node); - } - return vec[$node]; - } - - private function filterLink(Inlines\Link $link): vec<ASTNode> { - $old = $link->getDestination(); - $new = $this->getNewDestination($old); - if ($old === $new) { - return vec[$link]; - } - return vec[ - new Inlines\Link($link->getText(), $new, $link->getTitle()), - ]; - } - - private function filterAutoLink(Inlines\AutoLink $link): vec<ASTNode> { - $old = $link->getDestination(); - $new = $this->getNewDestination($old); - if ($old === $new) { - return vec[$link]; - } - return vec[ - new Inlines\AutoLink($link->getText(), $new), - ]; - } - - private function getNewDestination(string $uri): string { - $path = \parse_url($uri, \PHP_URL_PATH); - if ($path === null || !Str\ends_with($path, '.md')) { - return $uri; - } - - $host = \parse_url($uri, \PHP_URL_HOST); - if ($host !== null) { - return $uri; - } - return Str\replace($uri, $path, Str\strip_suffix($path, '.md')); - } -} diff --git a/src/markdown-extensions/PrettyCodeBlock.php b/src/markdown-extensions/PrettyCodeBlock.php deleted file mode 100644 index 45849cbb4..000000000 --- a/src/markdown-extensions/PrettyCodeBlock.php +++ /dev/null @@ -1,17 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation\MarkdownExt; - -use namespace Facebook\Markdown\Blocks; - -final class PrettyCodeBlock extends Blocks\CodeBlock { -} diff --git a/src/markdown-extensions/PrettyCodeBlocksFilter.php b/src/markdown-extensions/PrettyCodeBlocksFilter.php deleted file mode 100644 index c4d1ba568..000000000 --- a/src/markdown-extensions/PrettyCodeBlocksFilter.php +++ /dev/null @@ -1,54 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation\MarkdownExt; - -use type Facebook\Markdown\{ASTNode, RenderContext, RenderFilter}; -use namespace Facebook\Markdown\Blocks; -use namespace HH\Lib\{Str, Vec}; - -/** - * Re-format code blocks to be rendered nicely. - * - * 1. wrap in <div class="highlight"> - * 2. change language from Hack to PHP for now. - */ -final class PrettyCodeBlocksFilter extends RenderFilter { - <<__Override>> - public function filter(RenderContext $_, ASTNode $node): vec<ASTNode> { - if (!$node is Blocks\CodeBlock) { - return vec[$node]; - } - if ($node is PrettyCodeBlock) { - return vec[$node]; - } - - $info_string = $node->getInfoString(); - $classes = 'highlight fbgfm'; - $code = $node->getCode(); - if ($info_string !== null && Str\starts_with_ci($info_string, 'hack')) { - if (Str\lowercase($info_string) === 'hacksignature') { - $code = Str\split($code, "\n") |> Vec\drop($$, 1) |> Str\join($$, "\n"); - } - - $classes .= ' source-language-'.$info_string; - $info_string = 'PHP'; - } else { - $classes .= ' output-block'; - } - - return vec[ - new Blocks\HTMLBlock('<div class="'.$classes.'">'), - new PrettyCodeBlock($info_string, $code), - new Blocks\HTMLBlock('</div>'), - ]; - } -} diff --git a/src/markdown-extensions/RenderContext.php b/src/markdown-extensions/RenderContext.php deleted file mode 100644 index 5af6e692f..000000000 --- a/src/markdown-extensions/RenderContext.php +++ /dev/null @@ -1,51 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation\MarkdownExt; - -use namespace HH\Lib\Keyset; - -final class RenderContext extends \Facebook\HHAPIDoc\MarkdownExt\RenderContext { - - private ?string $filePath; - - public function setFilePath(string $file_path): this { - invariant( - $this->filePath is null, - 'Tried to set new path without calling resetFileData()', - ); - $this->filePath = $file_path; - return $this; - } - - public function getFilePath(): string { - invariant( - $this->filePath is nonnull, - 'getFilePath() called without calling setFilePath() first', - ); - return $this->filePath; - } - - <<__Override>> - public function resetFileData(): this { - parent::resetFileData(); - $this->filePath = null; - return $this; - } - - <<__Override>> - public function getImplicitPrefixes(): keyset<string> { - return Keyset\union( - parent::getImplicitPrefixes(), - keyset["HH\Lib\\Experimental\\"], - ); - } -} diff --git a/src/markdown-extensions/VersionedImagesFilter.php b/src/markdown-extensions/VersionedImagesFilter.php deleted file mode 100644 index 2ede47f4b..000000000 --- a/src/markdown-extensions/VersionedImagesFilter.php +++ /dev/null @@ -1,46 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation\MarkdownExt; - -use type HHVM\UserDocumentation\StaticResourceMap; -use type Facebook\Markdown\{ASTNode, RenderContext, RenderFilter}; -use namespace Facebook\Markdown\Inlines; -use namespace HH\Lib\Str; - -final class VersionedImagesFilter extends RenderFilter { - <<__Override>> - public function filter(RenderContext $_, ASTNode $node): vec<ASTNode> { - if (!$node is Inlines\Image) { - return vec[$node]; - } - - $path = $node->getSource(); - $entry = StaticResourceMap::getNullableEntryForFile($path); - - if ($entry === null) { - return vec[$node]; - } - - $versioned_path = \StaticResourcesControllerURIBuilder::getPath(shape( - 'Checksum' => $entry['checksum'], - 'File' => Str\strip_prefix($path, '/'), - )); - - return vec[ - new Inlines\Image( - $node->getDescription(), - $versioned_path, - $node->getTitle(), - ), - ]; - } -} diff --git a/src/markdown-extensions/YamlFrontMatterBlock.php b/src/markdown-extensions/YamlFrontMatterBlock.php deleted file mode 100644 index cf5cfdbfc..000000000 --- a/src/markdown-extensions/YamlFrontMatterBlock.php +++ /dev/null @@ -1,223 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation\MarkdownExt; - -use type HHVM\UserDocumentation\YAMLMeta; -use namespace Facebook\Markdown\UnparsedBlocks; -use namespace HHVM\UserDocumentation\JSON; -use namespace HH\Lib\{C, Dict, Str, Vec}; - -abstract class YamlFrontMatterBlock implements UnparsedBlocks\BlockProducer { - <<__Override>> - public static function consume( - UnparsedBlocks\Context $context, - UnparsedBlocks\Lines $lines, - ): ?(UnparsedBlocks\Block, UnparsedBlocks\Lines) { - $match = UnparsedBlocks\FencedCodeBlock::consume($context, $lines); - if ($match === null) { - return null; - } - list($block, $rest) = $match; - if ($block->getInfoString() !== 'yamlmeta') { - return null; - } - - invariant( - $context is BlockContext, - 'Expected context to be a %s', - BlockContext::class, - ); - - $data = JSON\decode_as_shape(YAMLMeta::class, $block->getContent()); - $context->setYamlMeta($data); - - $messages = Vec\filter_nulls(vec[ - self::getVersionRequirementMessage($data), - self::getLibMessage($data), - self::getFacebookMessages($data), - self::getNoteMessages($data), - self::getTipMessages($data), - self::getCautionMessages($data), - self::getDangerMessages($data), - ]); - - if (C\is_empty($messages)) { - return tuple(new UnparsedBlocks\BlockSequence(vec[]), $rest); - } - $messages = new UnparsedBlocks\BlockSequence($messages); - - return tuple( - UnparsedBlocks\BlockSequence::flatten( - new UnparsedBlocks\HTMLBlock('<div class="message">'), - $messages, - new UnparsedBlocks\HTMLBlock('</div>'), - ), - $rest, - ); - } - - private static function getVersionRequirementMessage( - YAMLMeta $data, - ): ?UnparsedBlocks\Block { - $versions = $data['min-versions'] ?? null; - if ($versions === null) { - return null; - } - $experimental = null; - if ($data['experimental'] ?? false) { - $experimental = ', and is currently experimental'; - } - - return UnparsedBlocks\BlockSequence::flatten( - new UnparsedBlocks\HTMLBlock('<div class="message api apiFromLib">'), - new UnparsedBlocks\InlineSequenceBlock( - 'This functionality requires '. - ( - $versions - |> Dict\map_with_key( - $$, - ($name, $ver) ==> \sprintf('%s %s or later', $name, $ver), - ) - |> Str\join($$, ', ') - ). - $experimental. - '.', - ), - new UnparsedBlocks\HTMLBlock('</div>'), - ); - } - - private static function getLibMessage(YAMLMeta $data): ?UnparsedBlocks\Block { - $lib = $data['lib'] ?? null; - if ($lib === null) { - return null; - } - - // TODO: fix XHP in namespaces - return new UnparsedBlocks\HTMLBlock( - '<div class="message api apiFromLib">'. - 'Requires '. - '<a href="https://github.com/'. - $lib['github']. - '/">'. - $lib['name']. - '</a> to be installed.'. - '</div>', - ); - } - - private static function getFacebookMessages( - YAMLMeta $data, - ): ?UnparsedBlocks\Block { - $messages = $data['fbonly messages'] ?? null; - if ($messages === null) { - return null; - } - - // TODO: fix XHP in namespaces - $messages = Vec\map( - $messages, - $message ==> new UnparsedBlocks\InlineSequenceBlock( - '<div data-nosnippet class="message api fbOnly">'. - "**Meta Engineer?**\n\n". - '<p>'. - $message. - "</p>\n". - '<!-- '. - 'Not a Meta engineer... yet? https://metacareers.com/'. - " -->\n". - '</div>', - ), - ); - return new UnparsedBlocks\BlockSequence($messages); - } - - private static function getNoteMessages( - YAMLMeta $data, - ): ?UnparsedBlocks\Block { - $note_messages = $data['note'] ?? null; - if ($note_messages === null) { - return null; - } - - $note_messages = Vec\map( - $note_messages, - $note_message ==> new UnparsedBlocks\InlineSequenceBlock( - '<div class="message note">'. - "**Note:**\n\n". - $note_message. - '</div>', - ), - ); - return new UnparsedBlocks\BlockSequence($note_messages); - } - - private static function getTipMessages( - YAMLMeta $data, - ): ?UnparsedBlocks\Block { - $tip_messages = $data['tip'] ?? null; - if ($tip_messages === null) { - return null; - } - - $tip_messages = Vec\map( - $tip_messages, - $tip_message ==> new UnparsedBlocks\InlineSequenceBlock( - '<div class="message tip">'. - "**Tip:**\n\n". - $tip_message. - '</div>', - ), - ); - return new UnparsedBlocks\BlockSequence($tip_messages); - } - - private static function getCautionMessages( - YAMLMeta $data, - ): ?UnparsedBlocks\Block { - $caution_messages = $data['caution'] ?? null; - if ($caution_messages === null) { - return null; - } - - $caution_messages = Vec\map( - $caution_messages, - $caution_message ==> new UnparsedBlocks\InlineSequenceBlock( - '<div class="message caution">'. - "**Caution:**\n\n". - $caution_message. - '</div>', - ), - ); - return new UnparsedBlocks\BlockSequence($caution_messages); - } - - private static function getDangerMessages( - YAMLMeta $data, - ): ?UnparsedBlocks\Block { - $danger_messages = $data['danger'] ?? null; - if ($danger_messages === null) { - return null; - } - - $danger_messages = Vec\map( - $danger_messages, - $danger_message ==> new UnparsedBlocks\InlineSequenceBlock( - '<div class="message danger">'. - "**Warning:**\n\n". - $danger_message. - '</div>', - ), - ); - return new UnparsedBlocks\BlockSequence($danger_messages); - } -} diff --git a/src/search/APISearchResult.php b/src/search/APISearchResult.php deleted file mode 100644 index dccb6ee8a..000000000 --- a/src/search/APISearchResult.php +++ /dev/null @@ -1,79 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -use namespace HH\Lib\Str; - -final class APISearchResult extends SearchResult { - public function __construct( - private APIProduct $product, - private APIDefinitionType $type, - string $name, - string $href, - float $score, - ) { - switch ($product) { - case APIProduct::HSL: - case APIProduct::HSL_EXPERIMENTAL: - if (Str\starts_with($name, 'HH\\Lib\\Legacy_FIXME')) { - $score *= SearchScores::HSL_LEGACY_FIXME_API_MULTIPLIER; - } else { - $score *= SearchScores::HSL_API_MULTIPLIER; - } - break; - case APIProduct::HACK: - $score *= SearchScores::HACK_API_MULTIPLIER; - break; - } - - switch ($type) { - case APIDefinitionType::CLASS_DEF: - $score *= SearchScores::CLASS_MULTIPLIER; - break; - case APIDefinitionType::INTERFACE_DEF: - $score *= SearchScores::INTERFACE_MULTIPLIER; - break; - case APIDefinitionType::TRAIT_DEF: - $score *= SearchScores::TRAIT_MULTIPLIER; - break; - case APIDefinitionType::FUNCTION_DEF: - if (Str\contains($name, '::')) { - $score *= SearchScores::METHOD_MULTIPLIER; - } else { - $score *= SearchScores::FUNCTION_MULTIPLIER; - } - break; - } - - parent::__construct($name, $href, $score); - } - - <<__Override>> - public function getResultTypeText(): string { - $type = $this->type; - if ($type === APIDefinitionType::FUNCTION_DEF) { - if (Str\contains($this->getTitle(), '::')) { - $type = 'method'; - } - } - switch ($this->product) { - case APIProduct::HACK: - $product = 'Hack'; - break; - case APIProduct::HSL: - case APIProduct::HSL_EXPERIMENTAL: - $product = 'HSL'; - break; - } - return $product.' '.$type; - } -} diff --git a/src/search/GuidePageSearchResult.php b/src/search/GuidePageSearchResult.php deleted file mode 100644 index 3b8a75b18..000000000 --- a/src/search/GuidePageSearchResult.php +++ /dev/null @@ -1,42 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - - -final class GuidePageSearchResult extends SearchResult { - public function __construct( - private GuidesProduct $product, - string $guide, - string $page, - float $score, - ) { - $score *= SearchScores::GUIDES_MULTIPLIER; - $score += SearchScores::GUIDES_BOOST; - - $title = Guides::normalizeName($product, $guide, $page); - $href = URLBuilder::getPathForGuidePage($product, $guide, $page); - parent::__construct($title, $href, $score); - } - - <<__Override>> - public function getResultTypeText(): string { - switch ($this->product) { - case GuidesProduct::HACK: - $product = 'Hack'; - break; - case GuidesProduct::HHVM: - $product = 'HHVM'; - break; - } - return $product.' guide'; - } -} diff --git a/src/search/SearchResult.php b/src/search/SearchResult.php deleted file mode 100644 index 357f0c595..000000000 --- a/src/search/SearchResult.php +++ /dev/null @@ -1,37 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - - -abstract class SearchResult { - - public function __construct( - private string $title, - private string $href, - private float $score, - ) { - } - - final public function getScore(): float { - return $this->score; - } - - final public function getTitle(): string { - return $this->title; - } - - final public function getHref(): string { - return $this->href; - } - - abstract public function getResultTypeText(): string; -} diff --git a/src/search/SearchScores.php b/src/search/SearchScores.php deleted file mode 100644 index 65b053707..000000000 --- a/src/search/SearchScores.php +++ /dev/null @@ -1,59 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -abstract final class SearchScores { - ///// Base scores ///// - - const float EXACT_MATCH_SCORE = 100.0; - const float PREFIX_MATCH_SCORE = 90.0; - const float SUFFIX_MATCH_SCORE = 90.0; - const float WORD_MATCH_SCORE = 90.0; - const float SUBSTRING_MATCH_SCORE = 2.0; - const float HARDCODED_RESULT_SCORE = 200.0; - - ///// Penalties ///// - - // e.g. search for 'map set', find HH\Map::set - const float IN_ORDER_WORD_SPLIT_MULTIPLIER = 0.9; - // e.g. search for 'map set', find HH\Set::map - const float OUT_OF_ORDER_WORD_SPLIT_MULTIPLIER = 0.5; - - const float COMPONENT_MATCH_MULTIPLIER = 0.9; - const float SYNONYM_MATCH_MULTIPLIER = 0.5; - const float SHORT_MATCH_MULTIPLIER = 0.1; - // raw is length/distance - const float LEVENSHTEIN_MULTIPLIER = 8.0; - - const float HREF_MATCH_MULTIPLIER = 0.5; - const float CONTENT_MATCH_MULTIPLIER = 0.1; - - ///// API Reference Weights /// - - const float HSL_API_MULTIPLIER = 4.0; - const float HSL_LEGACY_FIXME_API_MULTIPLIER = 0.2; - const float HACK_API_MULTIPLIER = 1.0; - - const float FUNCTION_MULTIPLIER = 1.0; - const float METHOD_MULTIPLIER = 0.9; - const float CLASS_MULTIPLIER = 1.2; - const float INTERFACE_MULTIPLIER = 1.0; - const float TRAIT_MULTIPLIER = 1.0; - - ///// Guide Weights ///// - - const float GUIDES_MULTIPLIER = 3.0; - const float GUIDES_BOOST = 5.0; - // e.g. async/introduction before async/extensions - const float GUIDE_INTRODUCTION_MULTIPLIER = 1.1; -} -; diff --git a/src/search/SearchTermMatcher.php b/src/search/SearchTermMatcher.php deleted file mode 100644 index b51925565..000000000 --- a/src/search/SearchTermMatcher.php +++ /dev/null @@ -1,305 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ -namespace HHVM\UserDocumentation; - -use namespace HH\Lib\{C, Keyset, Math, Str, Vec}; -use namespace Facebook\TypeAssert; - -abstract final class SearchTermMatcher { - // hard-coded operator synonyms - const string ARITHMETIC = 'arithmetic'; - const string ASSERTIONS = 'type assertion'; - const string ASSIGNMENT = 'assignment'; - const string BINARY_PIPE = 'pipe'; - const string BITWISE = 'bitwise'; - const string COALESCE = 'coalesce'; - const string COMPARISONS = 'comparison'; - const string CONCATENATION = 'concatenation'; - const string EQUALITY = 'equality'; - const string ERROR_CONTROL = 'suppress error'; - const string INCREMENTING_DECREMENTING = 'increment decrement'; - const string LOGICAL = 'logical'; - const string MEMBER_SELECTION = 'objects properties methods'; - const string PRECEDENCE = 'precedence'; - const string SCOPE_RESOLUTION = 'select scope resolution'; - const string SUBSCRIPT = 'subscript'; - const string TERNARY = 'ternary'; - - const dict<string, keyset<string>> SYNONYMS = dict[ - 'vec' => keyset['c'], - 'dict' => keyset['c'], - 'keyset' => keyset['c'], - 'vector' => keyset['vec'], - 'map' => keyset['dict'], - 'set' => keyset['keyset'], - 'string' => keyset['str'], - 'varray' => keyset['vec'], - 'darray' => keyset['dict'], - 'array' => keyset['dict', 'keyset', 'vec'], - // Arithmetic - '+' => keyset[self::ARITHMETIC, self::PRECEDENCE], - '-' => keyset[self::ARITHMETIC, self::PRECEDENCE], - '*' => keyset[self::ARITHMETIC, self::PRECEDENCE], - '/' => keyset[self::ARITHMETIC, self::PRECEDENCE], - '%' => keyset[self::ARITHMETIC, self::PRECEDENCE], - '**' => keyset[self::ARITHMETIC, self::PRECEDENCE], - // Assignment - '=' => keyset[self::ASSIGNMENT, self::PRECEDENCE], - '**=' => keyset[self::ASSIGNMENT, self::PRECEDENCE], - '*=' => keyset[self::ASSIGNMENT, self::PRECEDENCE], - '/=' => keyset[self::ASSIGNMENT, self::PRECEDENCE], - '%=' => keyset[self::ASSIGNMENT, self::PRECEDENCE], - '+=' => keyset[self::ASSIGNMENT, self::PRECEDENCE], - '-=' => keyset[self::ASSIGNMENT, self::PRECEDENCE], - '.=' => keyset[self::ASSIGNMENT, self::PRECEDENCE], - '<<=' => keyset[self::ASSIGNMENT, self::PRECEDENCE], - '>>=' => keyset[self::ASSIGNMENT, self::PRECEDENCE], - '&=' => keyset[self::ASSIGNMENT, self::PRECEDENCE], - '^=' => keyset[self::ASSIGNMENT, self::PRECEDENCE], - '|=' => keyset[self::ASSIGNMENT, self::PRECEDENCE], - // Comparisons - '>' => keyset[self::COMPARISONS, self::PRECEDENCE], - '<' => keyset[self::COMPARISONS, self::PRECEDENCE], - '>=' => keyset[self::COMPARISONS, self::PRECEDENCE], - '<=' => keyset[self::COMPARISONS, self::PRECEDENCE], - // Equality - '==' => keyset[self::EQUALITY, self::PRECEDENCE], - '!=' => keyset[self::EQUALITY, self::PRECEDENCE], - '===' => keyset[self::EQUALITY, self::PRECEDENCE], - '!==' => keyset[self::EQUALITY, self::PRECEDENCE], - '<=>' => keyset[self::EQUALITY, self::PRECEDENCE], - // Logical - '&&' => keyset[self::LOGICAL, self::PRECEDENCE], - '||' => keyset[self::LOGICAL, self::PRECEDENCE], - '!' => keyset[self::LOGICAL, self::PRECEDENCE], - // Bitwise - '&' => keyset[self::BITWISE, self::PRECEDENCE], - '|' => keyset[self::BITWISE, self::PRECEDENCE], - '^' => keyset[self::BITWISE, self::PRECEDENCE], - '<<' => keyset[self::BITWISE, self::PRECEDENCE], - '>>' => keyset[self::BITWISE, self::PRECEDENCE], - '~' => keyset[self::BITWISE, self::PRECEDENCE], - // Assertions - 'is' => keyset[self::ASSERTIONS, self::PRECEDENCE], - 'as' => keyset[self::ASSERTIONS, self::PRECEDENCE], - '?as' => keyset[self::ASSERTIONS, self::PRECEDENCE], - // Binary Pipe - '|>' => keyset[self::BINARY_PIPE, self::PRECEDENCE], - // Coalesce - '??' => keyset[self::COALESCE, self::PRECEDENCE], - '??=' => keyset[self::COALESCE, self::PRECEDENCE], - // Concatenation - '.' => keyset[self::CONCATENATION, self::PRECEDENCE], - // Error Control - '@' => keyset[self::ERROR_CONTROL, self::PRECEDENCE], - // Incrementing / Decrementing - '++' => keyset[self::INCREMENTING_DECREMENTING, self::PRECEDENCE], - '--' => keyset[self::INCREMENTING_DECREMENTING, self::PRECEDENCE], - // Member Selection - '->' => keyset[self::MEMBER_SELECTION, self::PRECEDENCE], - '?->' => keyset[self::MEMBER_SELECTION, self::PRECEDENCE], - '->:' => keyset[self::MEMBER_SELECTION], - // Subscript - '[]' => keyset[self::SUBSCRIPT, self::PRECEDENCE], - // Ternary - '?' => keyset[self::TERNARY, self::PRECEDENCE], - ':' => keyset[self::TERNARY, self::PRECEDENCE], - '?:' => keyset[self::TERNARY, self::PRECEDENCE], - // Scope Resolution - '::' => keyset[self::SCOPE_RESOLUTION], - ]; - - protected static function matchFullTerm( - string $content, - string $term, - ): ?float { - if (Str\length($term) === 0) { - return null; - } - - if ($term === $content) { - return SearchScores::EXACT_MATCH_SCORE; - } - - if (Str\contains($term, ' ')) { - return null; - } - - $multi = 1.0; - if (Str\length($term) < 3 || Str\length($content) < 3) { - $multi = SearchScores::SHORT_MATCH_MULTIPLIER; - } - - if (Str\starts_with($content, $term)) { - return SearchScores::PREFIX_MATCH_SCORE * $multi; - } - if (Str\ends_with($content, $term)) { - return SearchScores::SUFFIX_MATCH_SCORE * $multi; - } - if (C\contains(Str\split($content, ' '), $term)) { - return SearchScores::WORD_MATCH_SCORE * $multi; - } - - if (Str\contains($content, $term)) { - return SearchScores::SUBSTRING_MATCH_SCORE * $multi; - } - - return null; - } - - protected static function matchWords( - string $content, - string $term, - keyset<string> $terms, - ): ?float { - $parts = Str\split($term, ' '); - if (C\count($parts) === 1) { - return null; - } - - $terms = Keyset\union($terms, $parts); - - $total = 0.0; - foreach ($parts as $idx => $part) { - $score = self::matchTermInner($content, $part, $terms); - if ($score === null) { - return null; - } - $total += $score; - } - $score = $total / C\count($parts); - - $idx = 0; - foreach ($parts as $part) { - $new_idx = $part - |> Keyset\union(vec[$$], self::SYNONYMS[Str\lowercase($$)] ?? vec[]) - |> Vec\map($$, $part ==> Str\search($content, $part, $idx + 1)) - |> Vec\filter_nulls($$) - |> Math\min($$); - if ($new_idx === null) { - return $score * SearchScores::OUT_OF_ORDER_WORD_SPLIT_MULTIPLIER; - } - $idx = $new_idx; - } - return $score * SearchScores::IN_ORDER_WORD_SPLIT_MULTIPLIER; - } - - protected static function matchComponents( - string $content, - string $term, - keyset<string> $terms, - ): ?float { - $parts = Str\split($content, '\\') - |> Vec\map($$, $part ==> Str\split($part, '::')) - |> Vec\flatten($$); - if (C\count($parts) === 1) { - return null; - } - - $terms = Keyset\union($terms, $parts); - - $score = $parts - |> Vec\map($$, $part ==> self::matchTermInner($part, $term, $terms)) - |> Vec\filter_nulls($$) - |> Math\max($$); - - if ($score === null) { - return null; - } - - return $score * SearchScores::COMPONENT_MATCH_MULTIPLIER; - } - - protected static function matchSynonyms( - string $content, - string $term, - keyset<string> $terms, - ): ?float { - $synonyms = self::SYNONYMS[Str\lowercase($term)] ?? null; - if ($synonyms === null) { - return null; - } - - $synonyms = Keyset\filter($synonyms, $s ==> !C\contains_key($terms, $s)); - $terms = Keyset\union($terms, $synonyms); - - $score = $synonyms - |> Vec\map($$, $synonym ==> { - return self::matchTermInner($content, $synonym, $terms); - }) - |> Vec\filter_nulls($$) - |> Math\max($$); - if ($score === null) { - return null; - } - - return $score * SearchScores::SYNONYM_MATCH_MULTIPLIER; - } - - <<__Memoize>> - public static function matchTerm(string $content, string $term): ?float { - $content = Str\lowercase($content); - $term = Str\lowercase($term); - return self::matchTermInner($content, $term, keyset[$term]); - } - - protected static function matchTermInner( - string $content, - string $term, - keyset<string> $terms, - ): ?float { - $matches = vec[ - self::matchFullTerm($content, $term), - self::matchWords($content, $term, $terms), - self::matchSynonyms($content, $term, $terms), - ]; - - if (Str\length($content) < 80) { - // Don't try these on long-form content - $matches = Vec\concat( - $matches, - vec[ - self::matchComponents($content, $term, $terms), - self::matchEditDistance($content, $term), - ], - ); - } - return Math\max(Vec\filter_nulls($matches)); - } - - protected static function matchEditDistance( - string $content, - string $term, - ): ?float { - if ($content === $term) { - return null; - } - - $length = Math\minva( - Str\length($content), - Str\split($term, ' ') - |> Vec\map($$, $word ==> Str\length($word)) - |> Math\max($$) - |> TypeAssert\not_null($$), - ); - $diff = \levenshtein($content, $term); - if ($diff >= Math\minva($length, 3)) { - return null; - } - if ($diff === -1) { - return null; - } - - return ((float)$length) / - ((float)$diff) * - SearchScores::LEVENSHTEIN_MULTIPLIER; - } -} diff --git a/src/site/Breadcrumbs.php b/src/site/Breadcrumbs.php deleted file mode 100644 index 73f240b74..000000000 --- a/src/site/Breadcrumbs.php +++ /dev/null @@ -1,32 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -use type HHVM\UserDocumentation\{APIProduct, GuidesProduct}; - -abstract final class Breadcrumbs { - public static function getRootAPIBreadcrumb( - APIProduct $product, - ): (string, ?string) { - switch ($product) { - case APIProduct::HACK: - return tuple( - 'Hack', - GuidesListControllerURIBuilder::getPath(shape( - 'Product' => GuidesProduct::HACK, - )), - ); - case APIProduct::HSL: - return tuple('HSL', null); - case APIProduct::HSL_EXPERIMENTAL: - return tuple('HSL (Experimental)', null); - } - } -} diff --git a/src/site/HHVMDocumentationSite.php b/src/site/HHVMDocumentationSite.php deleted file mode 100644 index 40d61ee2e..000000000 --- a/src/site/HHVMDocumentationSite.php +++ /dev/null @@ -1,92 +0,0 @@ -<?hh -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -use namespace Facebook\HackRouter; -use type Facebook\Experimental\Http\Message\{ - ResponseInterface, - ServerRequestInterface, -}; -use namespace HH\Lib\{File, IO}; - -final class HHVMDocumentationSite { - public static async function respondToAsync( - ServerRequestInterface $request, - ): Awaitable<void> { - // TODO: add Filesystem\temporary_file_non_disposable() to the HSL - $buffer_path = \sys_get_temp_dir().'/'.\bin2hex(\random_bytes(16)); - $write_handle = File\open_write_only( - $buffer_path, - File\WriteMode::MUST_CREATE, - ); - $response = (new \Usox\HackTTP\Response($write_handle)); - $response = await self::getResponseForRequestAsync($request, $response); - \http_response_code($response->getStatusCode()); - foreach ($response->getHeaders() as $key => $values) { - foreach ($values as $value) { - \header($key.': '.$value, /* replace = */ false); - } - } - $write_handle->close(); - $read_handle = File\open_read_only($buffer_path); - using ($read_handle->closeWhenDisposed()) { - $out = IO\request_output(); - $content = await $read_handle->readAllAsync(); - await $out->writeAllAsync($content); - } - \unlink($buffer_path); - } - - private static function routeRequest( - ServerRequestInterface $request, - ): (classname<RoutableController>, ImmMap<string, string>) { - try { - return (new Router())->routeRequest($request); - } catch (HackRouter\NotFoundException $e) { - throw new HTTPNotFoundException('', 0, $e); - } catch (HackRouter\MethodNotAllowedException $e) { - throw new HTTPMethodNotAllowedException('', 0, $e); - } - } - - public static async function getResponseForRequestAsync( - ServerRequestInterface $request, - ResponseInterface $response, - ): Awaitable<ResponseInterface> { - try { - try { - list($controller, $vars) = self::routeRequest($request); - } catch (HTTPNotFoundException $e) { - // Try to add trailing if we couldn't find a controller - $orig_uri = $request->getUri(); - $with_trailing_slash = $request - ->withUri($orig_uri->withPath($orig_uri->getPath().'/')); - - try { - list($controller, $vars) = self::routeRequest($with_trailing_slash); - // If we're here, it's routable with a trailing / - return await ( - new RedirectException($with_trailing_slash->getUri()->getPath()) - )->getResponseAsync($request, $response); - } catch (HTTPException $f) { - throw $e; // original exception, not the new one - } - } - - // This is outside of the try so that we don't try adding a trailing - // slash if the controller itself throws a 404 - return await (new $controller($vars, $request))->getResponseAsync( - $response, - ); - } catch (HTTPException $e) { - return await $e->getResponseAsync($request, $response); - } - } -} diff --git a/src/site/Router.php b/src/site/Router.php deleted file mode 100644 index 194cafbb0..000000000 --- a/src/site/Router.php +++ /dev/null @@ -1,13 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -final class Router extends RouterCodegenBase { -} diff --git a/src/site/RouterCodegenBase.php b/src/site/RouterCodegenBase.php deleted file mode 100644 index 5995ce73a..000000000 --- a/src/site/RouterCodegenBase.php +++ /dev/null @@ -1,41 +0,0 @@ -<?hh // strict -/** - * This file is generated. Do not modify it manually! - * - * To re-generate this file run bin/build.php - * - * - * @generated SignedSource<<fb5413d791dcce65673ce712ba927872>> - */ - -abstract class RouterCodegenBase - extends \Facebook\HackRouter\BaseRouter<classname<\RoutableController>> { - - <<__Override>> - final public function getRoutes( - ): ImmMap<\Facebook\HackRouter\HttpMethod, ImmMap<string, classname<\RoutableController>>> { - $map = ImmMap { - \Facebook\HackRouter\HttpMethod::GET => ImmMap { - '/{Product:(?:hack|hsl|hsl\\-experimental)}/reference/{Type:(?:class|trait|interface|function)}/{Name}/' => - \APIClassPageController::class, - '/{Product:(?:hack|hsl|hsl\\-experimental)}/reference/' => - \APIFullListController::class, - '/{Product:(?:hack|hsl|hsl\\-experimental)}/reference/{Type:(?:class|trait|interface|function)}/' => - \APIListByTypeController::class, - '/{Product:(?:hack|hsl|hsl\\-experimental)}/reference/{Type:(?:class|trait|interface|function)}/{Class}/{Method}/' => - \APIMethodPageController::class, - '/{Product:(?:hhvm|hack)}/{Guide}/{Page}' => \GuidePageController::class, - '/{Product:(?:hhvm|hack)}/' => \GuidesListController::class, - '/' => \HomePageController::class, - '/j/{Keyword}' => \JumpController::class, - '/manual/en/{LegacyId}.php' => \LegacyRedirectController::class, - '/{Product:(?:hhvm|hack)}/{Guide}/' => - \RedirectToGuideFirstPageController::class, - '/robots.txt' => \RobotsTxtController::class, - '/search' => \SearchController::class, - '/s/{Checksum}/{File:.+}' => \StaticResourcesController::class, - }, - }; - return $map; - } -} diff --git a/src/site/URLBuilder.php b/src/site/URLBuilder.php deleted file mode 100644 index 45c0ec70c..000000000 --- a/src/site/URLBuilder.php +++ /dev/null @@ -1,98 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation; - -final class URLBuilder { - public static function getPathForClass( - APIProduct $product, - shape( - 'name' => string, - 'type' => APIDefinitionType, - ... - ) $class, - ): string { - return \APIClassPageControllerURIBuilder::getPath(shape( - 'Product' => $product, - 'Name' => \strtr($class['name'], "\\", '.'), - 'Type' => $class['type'], - )); - } - - public static function getPathForMethod( - APIProduct $product, - shape( - 'name' => string, - 'className' => string, - 'classType' => APIDefinitionType, - ... - ) $method, - ): string { - return \APIMethodPageControllerURIBuilder::getPath(shape( - 'Product' => $product, - 'Class' => \strtr($method['className'], "\\", '.'), - 'Method' => $method['name'], - 'Type' => $method['classType'], - )); - } - - public static function getPathForFunction( - APIProduct $product, - shape( - 'name' => string, - ... - ) $function, - ): string { - return \APIClassPageControllerURIBuilder::getPath(shape( - 'Product' => $product, - 'Name' => \strtr($function['name'], "\\", '.'), - 'Type' => APIDefinitionType::FUNCTION_DEF, - )); - } - - public static function getPathForProductGuides( - GuidesProduct $product, - ): string { - return \GuidesListControllerURIBuilder::getPath(shape( - 'Product' => $product, - )); - } - - public static function getPathForProductAPIReference( - APIProduct $product, - ): string { - return \APIFullListControllerURIBuilder::getPath(shape( - 'Product' => $product, - )); - } - - public static function getPathForGuide( - GuidesProduct $product, - string $topic, - ): string { - return \RedirectToGuideFirstPageControllerURIBuilder::getPath(shape( - 'Product' => $product, - 'Guide' => $topic, - )); - } - - public static function getPathForGuidePage( - GuidesProduct $product, - string $topic, - string $page, - ): string { - return \GuidePageControllerURIBuilder::getPath(shape( - 'Product' => $product, - 'Guide' => $topic, - 'Page' => $page, - )); - } -} diff --git a/src/site/UriPattern.php b/src/site/UriPattern.php deleted file mode 100644 index 4cffa8105..000000000 --- a/src/site/UriPattern.php +++ /dev/null @@ -1,26 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -use type HHVM\UserDocumentation\{APIDefinitionType, APIProduct, GuidesProduct}; - -final class UriPattern extends \Facebook\HackRouter\UriPattern { - public function apiProduct(string $name): this { - return $this->enum(APIProduct::class, $name); - } - - public function guidesProduct(string $name): this { - return $this->enum(GuidesProduct::class, $name); - } - - public function definitionType(string $name): this { - return $this->enum(APIDefinitionType::class, $name); - } -} diff --git a/src/site/controllers/APIClassPageController.php b/src/site/controllers/APIClassPageController.php deleted file mode 100644 index 476926c76..000000000 --- a/src/site/controllers/APIClassPageController.php +++ /dev/null @@ -1,136 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -use type HHVM\UserDocumentation\{ - APIDefinitionType, - APIIndex, - APIIndexEntry, - APIProduct, - URLBuilder, -}; - -use namespace HH\Lib\{C, Str}; - -final class APIClassPageController extends APIPageController { - use APIClassPageControllerParametersTrait; - - <<__Override>> - public static function getUriPattern(): UriPattern { - return (new UriPattern()) - ->literal('/') - ->apiProduct('Product') - ->literal('/reference/') - ->definitionType('Type') - ->literal('/') - ->string('Name') - ->literal('/'); - } - - <<__Memoize, __Override>> - protected function getRootDefinition(): APIIndexEntry { - $this->redirectIfAPIRenamed(); - $definition_name = $this->getParameters()['Name']; - - $index = APIIndex::get($this->getParameters()['Product']) - ->getIndexForType($this->getDefinitionType()); - if (!array_key_exists($definition_name, $index)) { - throw new HTTPNotFoundException(); - } - return $index[$definition_name]; - } - - <<__Override>> - public async function getTitleAsync(): Awaitable<string> { - return $this->getRootDefinition()['name'] - |> Str\strip_prefix($$, "HH\\Lib\\Experimental\\") - |> Str\strip_prefix($$, "HH\\Lib\\"); - } - - <<__Override>> - protected async function getHeadingAsync(): Awaitable<string> { - return $this->getRootDefinition()['name']; - } - - <<__Override>> - protected function getHTMLFilePath(): string { - return $this->getRootDefinition()['htmlPath']; - } - - private function redirectIfHSLAPIWithHackProduct(): void { - $p = $this->getParameters(); - if ($p['Product'] !== APIProduct::HACK) { - return; - } - - $index = APIIndex::get(APIProduct::HACK)->getIndexForType($p['Type']); - $name = $p['Name']; - if (C\contains_key($index, $name)) { - return; - } - - $index = APIIndex::get(APIProduct::HSL)->getIndexForType($p['Type']); - $entry = $index[$name] ?? null; - if ($entry === null) { - return; - } - - throw new RedirectException($entry['urlPath']); - } - - <<__Override>> - protected function redirectIfAPIRenamed(): void { - $this->redirectIfHSLAPIWithHackProduct(); - - $redirect_to = $this->getRenamedAPI($this->getParameters()['Name']); - - if ($redirect_to === null) { - return; - } - - $product = $this->getParameters()['Product']; - $type = $this->getDefinitionType(); - if ($type === APIDefinitionType::FUNCTION_DEF) { - $url = URLBuilder::getPathForFunction( - $product, - shape('name' => $redirect_to), - ); - } else { - $url = URLBuilder::getPathForClass($product, shape( - 'name' => $redirect_to, - 'type' => $type, - )); - } - - throw new RedirectException($url); - } - - <<__Override>> - protected function getBreadcrumbs(): vec<(string, ?string)> { - $parameters = $this->getParameters(); - $root = $this->getRootDefinition(); - - return vec[ - Breadcrumbs::getRootAPIBreadcrumb($parameters['Product']), - tuple( - 'Reference', - URLBuilder::getPathForProductAPIReference($parameters['Product']), - ), - tuple( - \ucwords($this->getDefinitionType()), - APIListByTypeControllerURIBuilder::getPath(shape( - 'Product' => $parameters['Product'], - 'Type' => $parameters['Type'], - )), - ), - tuple($root['name'], $root['urlPath']), - ]; - } -} diff --git a/src/site/controllers/APIFullListController.php b/src/site/controllers/APIFullListController.php deleted file mode 100644 index 90f31fbd7..000000000 --- a/src/site/controllers/APIFullListController.php +++ /dev/null @@ -1,55 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -use namespace Facebook\XHP\Core as x; -use type HHVM\UserDocumentation\{APIDefinitionType, APIProduct, api_list}; - -final class APIFullListController extends WebPageController { - use APIFullListControllerParametersTrait; - - <<__Override>> - public static function getUriPattern(): UriPattern { - return (new UriPattern()) - ->literal('/') - ->apiProduct('Product') - ->literal('/reference/'); - } - - <<__Override>> - final protected function getBreadcrumbs(): vec<(string, ?string)> { - $parameters = $this->getParameters(); - return vec[ - Breadcrumbs::getRootAPIBreadcrumb($parameters['Product']), - tuple('Reference', APIFullListControllerURIBuilder::getPath($parameters)), - ]; - } - - <<__Override>> - protected async function getTitleAsync(): Awaitable<string> { - switch ($this->getParameters()['Product']) { - case APIProduct::HACK: - return 'Hack APIs'; - case APIProduct::HSL: - return 'The Hack Standard Library'; - case APIProduct::HSL_EXPERIMENTAL: - return 'The Hack Standard Library - Experimental Additions'; - } - } - - <<__Override>> - final protected async function getBodyAsync(): Awaitable<x\node> { - return - <api_list - product={$this->getParameters()['Product']} - types={new ImmSet(APIDefinitionType::getValues())} - />; - } -} diff --git a/src/site/controllers/APIListByTypeController.php b/src/site/controllers/APIListByTypeController.php deleted file mode 100644 index 89bf7776e..000000000 --- a/src/site/controllers/APIListByTypeController.php +++ /dev/null @@ -1,67 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - - -use namespace Facebook\XHP\Core as x; -use type HHVM\UserDocumentation\{APIProduct, api_list}; - -final class APIListByTypeController extends WebPageController { - use APIListByTypeControllerParametersTrait; - - <<__Override>> - public static function getUriPattern(): UriPattern { - return (new UriPattern()) - ->literal('/') - ->apiProduct('Product') - ->literal('/reference/') - ->definitionType('Type') - ->literal('/'); - } - - <<__Override>> - protected function getBreadcrumbs(): vec<(string, ?string)> { - $parameters = $this->getParameters(); - return vec[ - Breadcrumbs::getRootAPIBreadcrumb($parameters['Product']), - tuple( - 'Reference', - APIFullListControllerURIBuilder::getPath(shape( - 'Product' => $parameters['Product'], - )), - ), - tuple( - \ucwords($parameters['Type']), - APIListByTypeControllerURIBuilder::getPath($parameters), - ), - ]; - } - - <<__Override>> - protected async function getTitleAsync(): Awaitable<string> { - switch ($this->getParameters()['Product']) { - case APIProduct::HACK: - return 'Hack APIs'; - case APIProduct::HSL: - return 'The Hack Standard Library'; - case APIProduct::HSL_EXPERIMENTAL: - return 'The Hack Standard Library - Experimental Additions'; - } - } - - <<__Override>> - final protected async function getBodyAsync(): Awaitable<x\node> { - return - <api_list - product={$this->getParameters()['Product']} - types={ImmSet {$this->getParameters()['Type']}} - />; - } -} diff --git a/src/site/controllers/APIMethodPageController.php b/src/site/controllers/APIMethodPageController.php deleted file mode 100644 index 410fba829..000000000 --- a/src/site/controllers/APIMethodPageController.php +++ /dev/null @@ -1,144 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -use type HHVM\UserDocumentation\{ - APIClassIndexEntry, - APIIndex, - APIMethodIndexEntry, - APIProduct, - URLBuilder, -}; -use namespace HH\Lib\C; - -final class APIMethodPageController extends APIPageController { - use APIMethodPageControllerParametersTrait; - - <<__Override>> - public static function getUriPattern(): UriPattern { - return (new UriPattern()) - ->literal('/') - ->apiProduct('Product') - ->literal('/reference/') - ->definitionType('Type') - ->literal('/') - ->string('Class') - ->literal('/') - ->string('Method') - ->literal('/'); - } - - <<__Memoize, __Override>> - protected function getRootDefinition(): APIClassIndexEntry { - $this->redirectIfAPIRenamed(); - $definition_name = $this->getParameters()['Class']; - $index = APIIndex::get($this->getParameters()['Product']) - ->getClassIndex($this->getDefinitionType()); - if (!array_key_exists($definition_name, $index)) { - throw new HTTPNotFoundException(); - } - return $index[$definition_name]; - } - - <<__Memoize>> - private function getMethodDefinition(): APIMethodIndexEntry { - $method_name = $this->getParameters()['Method']; - $methods = $this->getRootDefinition()['methods']; - if (!array_key_exists($method_name, $methods)) { - throw new HTTPNotFoundException(); - } - return $methods[$method_name]; - } - - <<__Override>> - protected function getSideNavSubpath(): vec<string> { - return vec[$this->getMethodDefinition()['name']]; - } - - <<__Override>> - public async function getTitleAsync(): Awaitable<string> { - return $this->getRootDefinition()['name']. - '::'. - $this->getMethodDefinition()['name']; - } - - <<__Override>> - protected function getHTMLFilePath(): string { - return $this->getMethodDefinition()['htmlPath']; - } - - <<__Override>> - protected function getBreadcrumbs(): vec<(string, ?string)> { - $parameters = $this->getParameters(); - $root = $this->getRootDefinition(); - $method = $this->getMethodDefinition(); - - return vec[ - Breadcrumbs::getRootAPIBreadcrumb($parameters['Product']), - tuple( - 'Reference', - URLBuilder::getPathForProductAPIReference($parameters['Product']), - ), - tuple( - \ucwords($this->getDefinitionType()), - APIListByTypeControllerURIBuilder::getPath(shape( - 'Product' => $parameters['Product'], - 'Type' => $parameters['Type'], - )), - ), - tuple($root['name'], $root['urlPath']), - tuple($method['name'], null), - ]; - } - private function redirectIfHSLAPIWithHackProduct(): void { - $p = $this->getParameters(); - if ($p['Product'] !== APIProduct::HACK) { - return; - } - - $class = $p['Class']; - - $index = APIIndex::get(APIProduct::HACK)->getClassIndex($p['Type']); - if (C\contains_key($index, $class)) { - return; - } - - $index = APIIndex::get(APIProduct::HSL)->getClassIndex($p['Type']); - $class_entry = $index[$class] ?? null; - if ($class_entry === null) { - return; - } - $method_entry = $class_entry['methods'][$p['Method']] ?? null; - if ($method_entry === null) { - return; - } - - throw new RedirectException($method_entry['urlPath']); - } - - <<__Override>> - protected function redirectIfAPIRenamed(): void { - $this->redirectIfHSLAPIWithHackProduct(); - - $redirect_to = $this->getRenamedAPI($this->getParameters()['Class']); - if ($redirect_to === null) { - return; - } - $product = $this->getParameters()['Product']; - $type = $this->getDefinitionType(); - throw new RedirectException( - URLBuilder::getPathForMethod($product, shape( - 'name' => $this->getParameters()['Method'], - 'className' => $redirect_to, - 'classType' => $type, - )), - ); - } -} diff --git a/src/site/controllers/APIPageController.php b/src/site/controllers/APIPageController.php deleted file mode 100644 index 2a14cd1e1..000000000 --- a/src/site/controllers/APIPageController.php +++ /dev/null @@ -1,95 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -use namespace HH\Lib\Vec; -use namespace Facebook\XHP\Core as x; -use type Facebook\XHP\HTML\div; -use namespace HHVM\UserDocumentation\ui; -use type HHVM\UserDocumentation\{ - APIDefinitionType, - APIIndexEntry, - APINavData, - APIProduct, - BuildPaths, - HTMLFileRenderable, -}; - -abstract class APIPageController extends WebPageController { - <<__Memoize>> - final protected function getDefinitionType(): APIDefinitionType { - return $this->getParameters_PRIVATE_IMPL() - ->getEnum(APIDefinitionType::class, 'Type'); - } - - abstract protected function getRootDefinition(): APIIndexEntry; - - <<__Override>> - final protected async function getBodyAsync(): Awaitable<x\node> { - return - <div class="referencePageWrapper"> - {$this->getInnerContent()} - </div>; - } - - abstract protected function getHTMLFilePath(): string; - - final protected function getInnerContent(): x\node { - return self::invariantTo404(() ==> { - $path = $this->getHTMLFilePath(); - return - <div class="innerContent"> - {new HTMLFileRenderable($path, BuildPaths::APIDOCS_HTML)} - </div>; - }); - } - - abstract protected function redirectIfAPIRenamed(): void; - - final protected function getRenamedAPI(string $old): ?string { - $change_map = ImmMap { - 'ImmMap' => 'HH.ImmMap', - 'ImmSet' => 'HH.ImmSet', - 'ImmVector' => 'HH.ImmVector', - 'Map' => 'HH.Map', - 'Pair' => 'HH.Pair', - 'Set' => 'HH.Set', - 'Vector' => 'HH.Vector', - }; - - return $change_map[$old] ?? null; - } - - <<__Override>> - final protected function getSideNav(): x\node { - $api_nav_data = APINavData::get($this->getParameters()['Product']); - $path = Vec\concat( - vec[ - $api_nav_data->getRootNameForType($this->getDefinitionType()), - $this->getRootDefinition()['name'], - ], - $this->getSideNavSubpath(), - ); - return ( - <ui:navbar - data={$api_nav_data->getNavData()} - activePath={$path} - extraNavListClass="apiNavList" - /> - ); - } - - abstract protected function getParameters( - ): shape('Product' => APIProduct, ...); - - protected function getSideNavSubpath(): vec<string> { - return vec[]; - } -} diff --git a/src/site/controllers/GuidePageController.php b/src/site/controllers/GuidePageController.php deleted file mode 100644 index 0b73cb631..000000000 --- a/src/site/controllers/GuidePageController.php +++ /dev/null @@ -1,285 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -use namespace Facebook\XHP\Core as x; -use namespace HHVM\UserDocumentation\ui; -use type Facebook\XHP\HTML\{div, span}; -use type HHVM\UserDocumentation\{ - Guides, - GuidesIndex, - GuidesNavData, - GuidesProduct, - HTMLFileRenderable, - NavDataNode, - PaginationDataNode, - UIGlyphIcon, - URLBuilder, -}; - -use function HHVM\UserDocumentation\type_alias_structure; - -use namespace Facebook\{TypeAssert, TypeSpec}; -use namespace HH\Lib\{C, Dict}; - -final class GuidePageController extends WebPageController { - use GuidePageControllerParametersTrait; - - <<__Override>> - public static function getUriPattern(): UriPattern { - return (new UriPattern()) - ->literal('/') - ->guidesProduct('Product') - ->literal('/') - ->string('Guide') - ->literal('/') - ->string('Page'); - } - - <<__Memoize>> - private function getProduct(): GuidesProduct { - return $this->getParameters()['Product']; - } - - <<__Memoize>> - private function getGuide(): string { - return $this->getParameters()['Guide']; - } - - <<__Memoize>> - private function getPage(): string { - return $this->getParameters()['Page']; - } - - <<__Override>> - protected async function beforeResponseAsync(): Awaitable<void> { - $params = $this->getParameters(); - $redirect_to = Guides::getGuidePageRedirects( - $params['Product'], - )[$params['Guide']][$params['Page']] ?? - Guides::getGuideRedirects($params['Product'])[$params['Guide']] ?? - null; - - if ($redirect_to === null) { - return; - } - list($guide, $page) = $redirect_to; - $page = $page ?? - C\firstx(GuidesIndex::getPages($params['Product'], $guide)); - throw new RedirectException(GuidePageControllerURIBuilder::getPath(shape( - 'Product' => $params['Product'], - 'Guide' => $guide, - 'Page' => $page, - ))); - } - - <<__Override>> - public async function getTitleAsync(): Awaitable<string> { - list($product, $guide, $page) = tuple( - $this->getProduct(), - $this->getGuide(), - $this->getPage(), - ); - return self::invariantTo404( - () ==> Guides::normalizeName($product, $guide, $page), - ); - } - - <<__Override>> - protected async function getBodyAsync(): Awaitable<x\node> { - return - <div class="guidePageWrapper"> - {$this->getInnerContent()} - {$this->getPaginationLinks()} - {$this->getFeedbackForm()} - </div>; - } - - protected function getPaginationLinks(): x\node { - list($product, $guide, $page) = tuple( - $this->getProduct(), - GuidesNavData::pathToName($this->getGuide()), - GuidesNavData::pathToName($this->getPage()), - ); - - $paging = <div class="paginationLinks" />; - $nav_data = GuidesNavData::getNavData()[$product]['children'] - |> TypeSpec\dict( - TypeSpec\string(), - TypeSpec\__Private\from_type_structure( - type_alias_structure(NavDataNode::class), - ), - )->assertType($$); - - $paging->appendChild( - $this->getPaginationLink($nav_data, $guide, $page, false), - ); - $paging->appendChild( - $this->getPaginationLink($nav_data, $guide, $page, true), - ); - return $paging; - } - - protected function getPaginationLink( - dict<string, NavDataNode> $guides, - string $guide, - string $page, - bool $next = false, - ): x\node { - $adjacent_page = $this->getAdjacentPage($guides, $guide, $page, $next); - - if ($adjacent_page === null) { - return <x:frag />; - } - $page = $adjacent_page['page']; - $guide = $adjacent_page['guide']; - - $guide_title = $guide[0]; - $page_title = <x:frag />; - if ($guide_title !== $page[0]) { - $guide_title .= ':'; - $page_title = - <span class="paginationPageTitle"> - {$page[0]} - </span>; - } - - $class = "paginationLink "; - $class = $class.($next ? "next" : "previous"); - - if ($next) { - $align = 'right'; - $glyph = UIGlyphIcon::RIGHT; - } else { - $align = 'left'; - $glyph = UIGlyphIcon::LEFT; - } - - return - <div class={$class}> - <ui:button - align={$align} - href={$page[1]['urlPath']} - glyph={$glyph} - size="medium"> - {$page_title} - <span class="paginationGuideTitle"> - {$guide_title} - </span> - </ui:button> - </div>; - } - - protected function getAdjacentPage( - dict<string, NavDataNode> $guides, - string $guide, - string $page, - bool $next = false, - ): ?PaginationDataNode { - $sibling_pages = $guides[$guide]['children']; - $sibling_pages = $next ? array_reverse($sibling_pages) : $sibling_pages; - $adjacent_page = null; - - // Gets last page if next = true, first page if previous (next = false) - $head_page = C\first_key($sibling_pages); - - if ($page === $head_page) { - $adj = $this->getAdjacentGuide($guides, $guide, $next); - if ($adj !== null) { - list($adjacent_guide, $adjacent_guide_data) = $adj; - $guide_pages = $adjacent_guide_data['children']; - $guide_pages = $next ? $guide_pages : array_reverse($guide_pages); - $adjacent_page = shape( - 'page' => tuple(C\first_keyx($guide_pages), C\firstx($guide_pages)), - 'guide' => tuple($adjacent_guide, $adjacent_guide_data), - ); - } - } else { - foreach ($sibling_pages as $sibling => $sibling_data) { - if ($sibling === $page) { - break; - } - $adjacent_page = shape( - 'page' => tuple($sibling, $sibling_data), - 'guide' => tuple($guide, $guides[$guide]), - ); - } - } - return $adjacent_page; - } - - protected function getAdjacentGuide( - dict<string, NavDataNode> $guides, - string $current_guide, - bool $next = false, - ): ?(string, NavDataNode) { - $adj_guide = null; - $guides = $next ? array_reverse($guides) : $guides; - foreach ($guides as $guide => $data) { - if ($guide === $current_guide) { - break; - } - $adj_guide = tuple($guide, $data); - } - return $adj_guide; - } - - protected function getFeedbackForm(): x\node { - $feedback = <ui:feedback/>; - return $feedback; - } - - <<__Override>> - protected function getBreadcrumbs(): vec<(string, ?string)> { - $product = $this->getProduct(); - $product_url = URLBuilder::getPathForProductGuides($product); - $guide = $this->getGuide(); - $page = Guides::normalizePart($this->getPage()); - - return vec[ - tuple($product, $product_url), - tuple('Learn', $product_url), - tuple( - Guides::normalizePart($guide), - URLBuilder::getPathForGuide($product, $guide), - ), - tuple($page, null), - ]; - } - - <<__Override>> - protected function getSideNav(): x\node { - $ts = type_alias_structure(NavDataNode::class); - $data = Dict\map( - GuidesNavData::getNavData()[$this->getProduct()]['children'], - $child ==> TypeAssert\matches_type_structure($ts, $child), - ); - return ( - <ui:navbar - data={$data} - activePath={vec[ - GuidesNavData::pathToName($this->getGuide()), - GuidesNavData::pathToName($this->getPage()), - ]} - /> - ); - } - - protected function getInnerContent(): x\node { - return self::invariantTo404(() ==> { - $path = GuidesIndex::getFileForPage( - $this->getProduct(), - $this->getGuide(), - $this->getPage(), - ); - return <div class="innerContent">{new HTMLFileRenderable($path)}</div>; - }); - } -} diff --git a/src/site/controllers/GuidesListController.php b/src/site/controllers/GuidesListController.php deleted file mode 100644 index aee6f6230..000000000 --- a/src/site/controllers/GuidesListController.php +++ /dev/null @@ -1,169 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -use namespace Facebook\XHP\Core as x; -use type Facebook\XHP\HTML\{a, div, h3, h4, li, p, ul}; -use type HHVM\UserDocumentation\{CategoriesHHVM, CategoriesHack, GuidesIndex, GuidesProduct, URLBuilder}; - -final class GuidesListController extends WebPageController { - use GuidesListControllerParametersTrait; - - <<__Override>> - public static function getUriPattern(): UriPattern { - return (new UriPattern()) - ->literal('/') - ->guidesProduct('Product') - ->literal('/'); - } - - <<__Override>> - public async function getTitleAsync(): Awaitable<string> { - switch ($this->getProduct()) { - case GuidesProduct::HHVM: - return 'HHVM Documentation'; - case GuidesProduct::HACK: - return 'Hack Documentation'; - } - } - - protected function getInnerContent(): x\node { - $product = $this->getProduct(); - $guides = GuidesIndex::getGuides($product); - - $root = <ul />; - - // Hack / HHVM categories - $category_root = $root; - - $getting_started = <ul class="guideList" />; - $control_flow = <ul class="guideList" />; - $classes_interfaces_traits = <ul class="guideList" />; - $types_generics = <ul class="guideList" />; - $learn = <ul class="guideList" />; - $experimental = <ul class="guideList" />; - - foreach ($guides as $guide) { - $pages = GuidesIndex::getPages($product, $guide); - $url = URLBuilder::getPathForGuidePage($product, $guide, $pages[0]); - - $title = ucwords(strtr($guide, '-', ' ')); - $category = trim($this->getGuideCategory($guide)); - - switch($category){ - case CategoriesHack::GETTING_STARTED: - $category_root = $getting_started; - break; - case CategoriesHack::CONTROL_FLOW: - $category_root = $control_flow; - break; - case CategoriesHack::CLASSES_INTERFACES_TRAITS: - $category_root = $classes_interfaces_traits; - break; - case CategoriesHack::TYPES_GENERICS: - $category_root = $types_generics; - break; - case CategoriesHack::EXPERIMENTAL: - $category_root = $experimental; - break; - case CategoriesHHVM::LEARN: - $category_root = $learn; - break; - default: - $category_root = $root; - break; - } - - $category_root->appendChild( - <li> - <h4 class={$category}><a href={$url}>{$title}</a></h4> - <div class="guideDescription"> - {$this->getGuideSummary($guide)} - </div> - </li>, - ); - } - - if ($product === GuidesProduct::HACK){ - $root->appendChild(<li><h3 class="listTitle">{CategoriesHack::GETTING_STARTED}</h3><div class="guideListWrapper">{$getting_started}</div></li>); - $root->appendChild(<li><h3 class="listTitle">{CategoriesHack::CONTROL_FLOW}</h3><div class="guideListWrapper">{$control_flow}</div></li>); - $root->appendChild(<li><h3 class="listTitle">{CategoriesHack::CLASSES_INTERFACES_TRAITS}</h3><div class="guideListWrapper">{$classes_interfaces_traits}</div></li>); - $root->appendChild(<li><h3 class="listTitle">{CategoriesHack::TYPES_GENERICS}</h3><div class="guideListWrapper">{$types_generics}</div></li>); - $root->appendChild(<li><h3 class="listTitle">{CategoriesHack::EXPERIMENTAL}</h3><div>{$experimental}</div></li>); - } - - if ($product === GuidesProduct::HHVM){ - $root->appendChild(<li><h3 class="listTitle">{CategoriesHHVM::LEARN}</h3><div>{$learn}</div></li>); - } - - return $root; - } - - <<__Override>> - protected async function getBodyAsync(): Awaitable<x\node> { - $body = - <x:frag> - <div class="guideListWrapper"> - {$this->getInnerContent()} - </div> - </x:frag>; - if ($this->getProduct() === 'hack') { - $body->appendChild( - <div class="guideListWrapper"> - <h3 class="listTitle"> - <a href="/hack/reference/">Built-in API Reference</a> - </h3> - <p> - Full reference docs for all functions, classes, interfaces, and - traits in the Hack language. - </p> - <h3 class="listTitle"> - <a href="/hsl/reference/">Standard Library API Reference</a> - </h3> - <p> - Full reference docs for all functions, classes, interfaces, and - traits in the Hack Standard Library. - </p> - </div>, - ); - } - return $body; - } - - protected function getGuideCategory(string $guide): string { - $path = GuidesIndex::getFileForCategory($this->getProduct(), $guide); - if (file_get_contents($path)) { - return file_get_contents($path); - } - return ''; - } - - protected function getGuideSummary(string $guide): ?x\node { - $path = GuidesIndex::getFileForSummary($this->getProduct(), $guide); - if (file_get_contents($path)) { - return <x:frag>{file_get_contents($path)}</x:frag>; - } - return NULL; - } - - <<__Override>> - protected function getBreadcrumbs(): vec<(string, ?string)> { - $product = $this->getProduct(); - return vec[ - tuple($product, URLBuilder::getPathForProductGuides($product)), - tuple('Learn', null), - ]; - } - - <<__Memoize>> - private function getProduct(): GuidesProduct { - return $this->getParameters()['Product']; - } -} diff --git a/src/site/controllers/HTTP404Controller.php b/src/site/controllers/HTTP404Controller.php deleted file mode 100644 index e2b2a650e..000000000 --- a/src/site/controllers/HTTP404Controller.php +++ /dev/null @@ -1,177 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -use namespace HH\Lib\C; -use namespace Facebook\XHP\Core as x; -use type Facebook\XHP\HTML\{a, div, i, p, span}; -use type HHVM\UserDocumentation\{ - APILegacyRedirectData, - JumpIndexData, - LegacyRedirects, - github_issue_link, -}; - -final class HTTP404Controller extends NonRoutableWebPageController { - <<__Override>> - public async function getTitleAsync(): Awaitable<string> { - return 'Page Not Found'; - } - - <<__Override>> - public function getExtraBodyClass(): ?string { - return 'notFoundErrorPage'; - } - - private function getSuggestedUrl(string $path): ?string { - $url = idx(JumpIndexData::getIndex(), strtolower($path)); - if ($url !== null) { - return $url; - } - - $url = LegacyRedirects::getUrlForId($path); - if ($url !== null) { - return $url; - } - - $candidates = darray[]; - foreach (APILegacyRedirectData::getIndex() as $id => $url) { - if (stripos($id, $path) !== false) { - $candidates[$url] = $url; - } - } - - if ($candidates) { - uksort( - inout $candidates, - function(string $a, string $b): int { - $a = strlen($a); - $b = strlen($b); - if ($a > $b) { - return 1; - } else if ($a < $b) { - return -1; - } - return 0; - }, - ); - return C\first_key($candidates); - } - - return null; - } - - <<__Override>> - public async function getBodyAsync(): Awaitable<x\node> { - return - <x:frag> - <div class="notFoundIcon"> - <span class="logoCSS notFoundIconCSS notFound_4_IconCSS"> - <i class="logoPolygon a a1" /> - <i class="logoPolygon a a2" /> - <i class="logoPolygon a a3" /> - <i class="logoPolygon a a4" /> - <i class="logoPolygon b b1" /> - <i class="logoPolygon b b2" /> - <i class="logoPolygon b b3" /> - </span> - <span class="logoCSS notFoundIconCSS notFound_0_IconCSS"> - <i class="logoPolygon a a1" /> - <i class="logoPolygon a a2" /> - <i class="logoPolygon a a3" /> - <i class="logoPolygon b b1" /> - <i class="logoPolygon b b2" /> - <i class="logoPolygon b b3" /> - </span> - <span class="logoCSS notFoundIconCSS notFound_4_IconCSS"> - <i class="logoPolygon a a1" /> - <i class="logoPolygon a a2" /> - <i class="logoPolygon a a3" /> - <i class="logoPolygon a a4" /> - <i class="logoPolygon b b1" /> - <i class="logoPolygon b b2" /> - <i class="logoPolygon b b3" /> - </span> - </div> - {$this->getNotFoundMessage()} - <p class="notFoundMessage"> - You might want to try finding what you need from <a href="/">the - front page</a> or the Hack or HHVM links above. - </p> - <p class="notFoundMessage"> - If you think you're seeing this page in error, please - <github_issue_link - issueTitle={$this->getGithubIssueTitle()} - issueBody={ - $this->getGithubIssueBody() - }>file an issue</github_issue_link>. - </p> - </x:frag>; - } - - protected function getNotFoundMessage(): x\node { - $path = $this->getRequestedPath(); - $parts = explode('/', $path); - - if (count($parts) === 2) { - $id = $parts[1]; - $url = $this->getSuggestedUrl($id); - if ($url !== null) { - return ( - <p class="notFoundMessage"> - The page you requested does not exist; maybe you want - <a href={$url}>{$url}</a> instead? - </p> - ); - } - } - - return ( - <p class="notFoundMessage"> - The page you requested does not exist. - </p> - ); - } - - <<__Override>> - protected function getStatusCode(): int { - return 404; - } - - <<__Override>> - protected function getGithubIssueTitle(): string { - $request_path = $this->getRequestedPath(); - return '404: '.$request_path; - } - - <<__Override>> - protected function getGithubIssueBody(): string { - return <<<EOF -Please complete the information below: - -# How I got to this page: - -- e.g. "I clicked a link on <address of other site>" - -# What I expected to find here: - -- e.g. "Documentation that tells me how to <do something>" -EOF; - } - - <<__Override>> - protected function requireSecureConnection(): void { - /* No-op implementation so that the 404 handler doesn't throw a redirect - * exception. If you need something similar, maybe add a - * 'BypassHTTPSEnforcement' interface or similar, and check for that in the - * superclass implementation. - */ - } -} diff --git a/src/site/controllers/HomePageController.php b/src/site/controllers/HomePageController.php deleted file mode 100644 index 717618178..000000000 --- a/src/site/controllers/HomePageController.php +++ /dev/null @@ -1,145 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -use namespace Facebook\XHP\Core as x; -use type Facebook\XHP\HTML\{a, div, h2, h3, h4, li, p, ul}; -use type HHVM\UserDocumentation\{CategoriesHHVM, CategoriesHack, GuidesIndex, GuidesProduct}; - -final class HomePageController extends WebPageController { - <<__Override>> - public static function getUriPattern(): UriPattern { - return (new UriPattern())->literal('/'); - } - - <<__Override>> - public async function getTitleAsync(): Awaitable<string> { - return 'HHVM and Hack Documentation'; - } - - protected function getInnerContent(GuidesProduct $product): x\node { - $guides = GuidesIndex::getGuides($product); - - $root = <ul />; - - // Hack / HHVM categories - $category_root = $root; - $getting_started = <ul class="guideList" />; - $control_flow = <ul class="guideList" />; - $classes_interfaces_traits = <ul class="guideList" />; - $types_generics = <ul class="guideList" />; - $learn = <ul class="guideList" />; - $experimental = <ul class="guideList" />; - - foreach ($guides as $guide) { - $pages = GuidesIndex::getPages($product, $guide); - $url = GuidePageControllerURIBuilder::getPath(shape( - 'Product' => $product, - 'Guide' => $guide, - 'Page' => $pages[0], - )); - - $title = ucwords(strtr($guide, '-', ' ')); - $category = trim($this->getGuideCategory($product, $guide)); - - switch($category){ - case CategoriesHack::GETTING_STARTED: - $category_root = $getting_started; - break; - case CategoriesHack::CONTROL_FLOW: - $category_root = $control_flow; - break; - case CategoriesHack::CLASSES_INTERFACES_TRAITS: - $category_root = $classes_interfaces_traits; - break; - case CategoriesHack::TYPES_GENERICS: - $category_root = $types_generics; - break; - case CategoriesHack::EXPERIMENTAL: - $category_root = $experimental; - break; - case CategoriesHHVM::LEARN: - $category_root = $learn; - break; - default: - $category_root = $root; - break; - } - - $category_root->appendChild( - <li> - <h4 class={$category}><a href={$url}>{$title}</a></h4> - <div class="guideDescription"> - {$this->getGuideSummary($product, $guide)} - </div> - </li>, - ); - } - - if ($product === GuidesProduct::HACK){ - $root->appendChild(<li><h3 class="listTitle">{CategoriesHack::GETTING_STARTED}</h3><div class="guideListWrapper">{$getting_started}</div></li>); - $root->appendChild(<li><h3 class="listTitle">{CategoriesHack::CONTROL_FLOW}</h3><div class="guideListWrapper">{$control_flow}</div></li>); - $root->appendChild(<li><h3 class="listTitle">{CategoriesHack::CLASSES_INTERFACES_TRAITS}</h3><div class="guideListWrapper">{$classes_interfaces_traits}</div></li>); - $root->appendChild(<li><h3 class="listTitle">{CategoriesHack::TYPES_GENERICS}</h3><div class="guideListWrapper">{$types_generics}</div></li>); - $root->appendChild(<li><h3 class="listTitle">{CategoriesHack::EXPERIMENTAL}</h3><div class="guideListWrapper">{$experimental}</div></li>); - } - - if ($product === GuidesProduct::HHVM){ - $root->appendChild(<li><h3 class="listTitle">{CategoriesHHVM::LEARN}</h3><div>{$learn}</div></li>); - } - - return $root; - } - - protected function getGuideCategory( - GuidesProduct $product, - string $guide, - ): string { - $path = GuidesIndex::getFileForCategory($product, $guide); - if (file_get_contents($path)) { - return file_get_contents($path); - } - return ''; - } - - protected function getGuideSummary( - GuidesProduct $product, - string $guide, - ): ?x\node { - $path = GuidesIndex::getFileForSummary($product, $guide); - if (file_get_contents($path)) { - return <x:frag>{file_get_contents($path)}</x:frag>; - } - return NULL; - } - - <<__Override>> - protected async function getBodyAsync(): Awaitable<x\node> { - return - <x:frag> - <div class="guideListWrapper"> - <h2 class="listTitle">Hack</h2> - {$this->getInnerContent(GuidesProduct::HACK)} - <h3 class="listTitle"> - <a href="/hack/reference/">Hack API Reference</a> - </h3> - <p>Full reference docs for all functions, classes, interfaces, and traits in the Hack language.</p> - <h3 class="listTitle"> - <a href="/hsl/reference/">Hack Standard Library Reference</a> - </h3> - <p>Full reference docs for all functions, classes, interfaces, and traits in the Hack Standard Library (HSL).</p> - </div> - <div class="guideListWrapper"> - <h2 class="listTitle">HHVM</h2> - {$this->getInnerContent(GuidesProduct::HHVM)} - </div> - </x:frag>; - } -} diff --git a/src/site/controllers/JumpController.php b/src/site/controllers/JumpController.php deleted file mode 100644 index 47b1ffb0d..000000000 --- a/src/site/controllers/JumpController.php +++ /dev/null @@ -1,44 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -use type HHVM\UserDocumentation\JumpIndexData; -use type Facebook\Experimental\Http\Message\ResponseInterface; - -final class JumpController - extends WebController - implements RoutableGetController { - use JumpControllerParametersTrait; - - const keyset<string> PREFIXES = keyset['', 'HH\\', 'HH\\Lib\\', 'HH\\Asio\\']; - - public static function getUriPattern(): UriPattern { - return (new UriPattern()) - ->literal('/j/') - ->string('Keyword'); - } - - <<__Override>> - public function getResponseAsync( - ResponseInterface $_, - ): Awaitable<ResponseInterface> { - $keyword = $this->getParameters()['Keyword']; - - $data = JumpIndexData::getIndex(); - foreach (self::PREFIXES as $prefix) { - $url = idx($data, strtolower($prefix.$keyword)); - if ($url is string) { - throw new RedirectException($url); - } - } - - throw new RedirectException('/search?term='.urlencode($keyword)); - } -} diff --git a/src/site/controllers/LegacyRedirectController.php b/src/site/controllers/LegacyRedirectController.php deleted file mode 100644 index 919d36c02..000000000 --- a/src/site/controllers/LegacyRedirectController.php +++ /dev/null @@ -1,40 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -use type HHVM\UserDocumentation\LegacyRedirects; -use type Facebook\Experimental\Http\Message\ResponseInterface; - -final class LegacyRedirectController - extends WebController - implements RoutableGetController { - use LegacyRedirectControllerParametersTrait; - - public static function getUriPattern(): UriPattern { - return (new UriPattern()) - ->literal('/manual/en/') - ->string('LegacyId') - ->literal('.php'); - } - - <<__Override>> - public async function getResponseAsync( - ResponseInterface $_, - ): Awaitable<ResponseInterface> { - $id = $this->getParameters()['LegacyId']; - - $url = LegacyRedirects::getUrlForId($id); - if ($url !== null) { - throw new RedirectException($url); - } - - throw new HTTPNotFoundException(); - } -} diff --git a/src/site/controllers/NonRoutableWebPageController.php b/src/site/controllers/NonRoutableWebPageController.php deleted file mode 100644 index 958fe7b30..000000000 --- a/src/site/controllers/NonRoutableWebPageController.php +++ /dev/null @@ -1,416 +0,0 @@ -<?hh // strict -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -use type HHVM\UserDocumentation\{ - LocalConfig, - UIGlyphIcon, - comment, - github_issue_link, - search_bar, -}; -use type Facebook\Experimental\Http\Message\{ - ResponseInterface, - ServerRequestInterface, -}; -use type Facebook\XHP\HTML\{ - a, - body, - div, - doctype, - footer, - h1, - h2, - head, - html, - i, - li, - link, - meta, - script, - span, - strong, - title, - ul, -}; - -use namespace HH\Lib\C; -use namespace Facebook\XHP\Core as x; -use namespace HHVM\UserDocumentation\{script, static_res, ui}; - -abstract class NonRoutableWebPageController extends WebController { - protected abstract function getTitleAsync(): Awaitable<string>; - protected abstract function getBodyAsync(): Awaitable<x\node>; - - protected function getHeadingAsync(): Awaitable<string> { - return $this->getTitleAsync(); - } - - protected function getExtraBodyClass(): ?string { - return null; - } - - protected function getGithubIssueTitle(): ?string { - /* Bad automatic title: "Issue with /foo/bar" - * Good automatic title: "404: /foo/bar" - * - * There isn't a general way to create a good title, so leave it blank and - * hope the user picks something decent. We get the URL in the - * automatically-appended metadata anyway. - * - * "Issue with /foo/bar" is 'bad' because we will want to rename any issues - * with that title during triage to something more descriptive. - */ - - return null; - } - - /** Extend this if you want custom logic (e.g. redirects) before anything - * else happens. */ - protected async function beforeResponseAsync(): Awaitable<void> {} - - protected function getGithubIssueBody(): string { - return <<<EOF -Please complete the information below: - -# Where is the problem? - -- e.g. "The section describing how widgets work" - -# What is the problem? - -- e.g. "It doesn't explain that widgets are singletons" -EOF; - } - - <<__Override>> - final public async function getResponseAsync( - ResponseInterface $response, - ): Awaitable<ResponseInterface> { - await $this->beforeResponseAsync(); - concurrent { - $title = await $this->getTitleAsync(); - $content = await $this->getContentPaneAsync(); - } - $content->appendChild($this->getFooter()); - - $extra_class = $this->getExtraBodyClass(); - $body_class = $this->getBodyClass($extra_class); - $google_analytics = null; - $open_search = null; - $require_secure = false; - - $canonical_url = 'http://docs.hhvm.com'.$this->getRequestedPath(); - switch ($this->getRequestedHost()) { - case 'beta.docs.hhvm.com': - throw new RedirectException($canonical_url); - case 'docs.hhvm.com': - $google_analytics = - <script:google_analytics trackingID="UA-49208336-3" />; - $open_search = - <link - rel="search" - type="application/opensearchdescription+xml" - href="/search.xml" - />; - $require_secure = true; - break; - case 'staging.docs.hhvm.com': - $require_secure = true; - break; - default: // probably dev environment - break; - } - - if ($require_secure) { - $this->requireSecureConnection(); - } - - $xhp = - <doctype> - <html> - <head> - <title>{$title} - - - - - - - - - - - {$open_search} - - Build ID: {LocalConfig::getBuildID()} - - - - {$google_analytics} - - ; - } -} diff --git a/src/site/controllers/RedirectToGuideFirstPageController.php b/src/site/controllers/RedirectToGuideFirstPageController.php deleted file mode 100644 index fe4ad930e..000000000 --- a/src/site/controllers/RedirectToGuideFirstPageController.php +++ /dev/null @@ -1,60 +0,0 @@ -literal('/') - ->guidesProduct('Product') - ->literal('/') - ->string('Guide') - ->literal('/'); - } - - <<__Override>> - public async function getResponseAsync( - ResponseInterface $_, - ): Awaitable { - $params = $this->getParameters(); - $product = GuidesProduct::assert($params['Product']); - $guide = $params['Guide']; - $guide_redirect = Guides::getGuideRedirects($product)[$guide] ?? null; - $page = null; - - if ($guide_redirect !== null) { - list($guide, $page) = $guide_redirect; - } - - if ($page === null) { - $pages = self::invariantTo404( - () ==> GuidesIndex::getPages($product, $guide), - ); - $page = $pages[0]; - } - - $path = self::invariantTo404(() ==> { - return URLBuilder::getPathForGuidePage($product, $guide, $page); - }); - throw new RedirectException($path); - } -} diff --git a/src/site/controllers/RobotsTxtController.php b/src/site/controllers/RobotsTxtController.php deleted file mode 100644 index fd664caf1..000000000 --- a/src/site/controllers/RobotsTxtController.php +++ /dev/null @@ -1,39 +0,0 @@ -literal('/robots.txt'); - } - - const string DO_NOT_CRAWL_FILE = - LocalConfig::ROOT.'/public/robots.txt-do-not-crawl'; - const string DEFAULT_FILE = LocalConfig::ROOT.'/public/robots.txt-default'; - - <<__Override>> - public async function getResponseAsync( - ResponseInterface $response, - ): Awaitable { - if ($this->getRequestedHost() === 'docs.hhvm.com') { - $source = self::DEFAULT_FILE; - } else { - $source = self::DO_NOT_CRAWL_FILE; - } - - await $response->getBody()->writeAllAsync(\file_get_contents($source)); - return $response->withHeader('Content-Type', vec['text/plain']); - } -} diff --git a/src/site/controllers/RoutableController.php b/src/site/controllers/RoutableController.php deleted file mode 100644 index 46639cc3e..000000000 --- a/src/site/controllers/RoutableController.php +++ /dev/null @@ -1,16 +0,0 @@ -> - public static function getUriPattern(): UriPattern { - return (new UriPattern())->literal('/search'); - } - - <<__Override>> - protected static function getExtraParametersSpec( - ): self::TParameterDefinitions { - return shape( - 'required' => ImmVector { - new StringRequestParameter( - StringRequestParameterSlashes::ALLOW_SLASHES, - 'term', - ), - }, - 'optional' => ImmVector {}, - ); - } - - <<__Override>> - public async function getTitleAsync(): Awaitable { - return "Search results for '{$this->getSearchTerm()}':"; - } - - <<__Override>> - protected async function getBodyAsync(): Awaitable { - $search_results = $this->getSearchResults(); - - if (C\is_empty($search_results)) { - return ( -

-

No results found.

-
- ); - } - - $results = Vec\map( - $search_results, - $result ==> -
  • getScore())}> - getHref()}>{$result->getTitle()} - {$result->getResultTypeText()} -
  • , - ); - - return ( -
    -
      {$results}
    -
    - ); - } - - <<__Memoize>> - private function getSearchTerm(): string { - return $this->getParameters()['term']; - } - - private function getSearchResults(): vec { - $term = $this->getSearchTerm(); - $results = vec[ - $this->getHardcodedResults(), - GuidesIndex::search($term), - APIIndex::searchAllProducts($term), - ] - |> Vec\flatten($$) - |> Vec\sort_by($$, $result ==> -($result->getScore())); - - if (C\count($results) < 5) { - return $results; - } - - $max = $results[0]->getScore(); - return Vec\filter($results, $r ==> $r->getScore() >= 0.3 * $max); - } - - private function getHardcodedResults(): vec { - $term = Str\lowercase($this->getSearchTerm()); - - $hack_array_keywords = keyset[ - 'vec', - 'dict', - 'keyset', - 'vector', - 'immvector', - 'constvector', - 'map', - 'immmap', - 'constmap', - 'set', - 'immset', - 'constset', - ]; - if (!C\contains_key($hack_array_keywords, $term)) { - return vec[]; - } - - return vec[ - new GuidePageSearchResult( - GuidesProduct::HACK, - 'types', - 'arrays', - SearchScores::HARDCODED_RESULT_SCORE, - ), - ]; - } -} diff --git a/src/site/controllers/StaticResourcesController.php b/src/site/controllers/StaticResourcesController.php deleted file mode 100644 index c606f5315..000000000 --- a/src/site/controllers/StaticResourcesController.php +++ /dev/null @@ -1,77 +0,0 @@ -literal('/s/') - ->string('Checksum') - ->literal('/') - ->stringWithSlashes('File'); - } - - <<__Override>> - protected static function getExtraParametersSpec( - ): self::TParameterDefinitions { - return shape( - 'required' => ImmVector {}, - 'optional' => ImmVector {new IntRequestParameter('MTime')}, - ); - } - - <<__Override>> - public async function getResponseAsync( - ResponseInterface $response, - ): Awaitable { - $params = $this->getParameters(); - $checksum = $params['Checksum']; - $file = '/'.$params['File']; - - $entry = self::invariantTo404( - () ==> StaticResourceMap::getEntryForFile($file), - ); - - if ( - $checksum !== $entry['checksum'] && - $checksum !== 'local-changes' && - $checksum !== 'evergreen' - ) { - throw new HTTPNotFoundException(); - } - - await $response->getBody() - ->writeAllAsync(\file_get_contents($entry['localPath'])); - $response = $response->withHeader('Content-Type', vec[$entry['mimeType']]); - - if ( - $checksum === 'local-changes' && $this->getParameters()['MTime'] === null - ) { - $response = $response->withAddedHeader( - 'Cache-Control', - vec['max-age=0, no-cache, no-store'], - ); - } else { - $response = $response->withAddedHeader( - 'Cache-Control', - vec['max-age=31556926'], // 1 year - ) - ->withAddedHeader('ETag', vec['"'.$checksum.'"']); - } - return $response; - } -} diff --git a/src/site/controllers/WebController.php b/src/site/controllers/WebController.php deleted file mode 100644 index a74c5f043..000000000 --- a/src/site/controllers/WebController.php +++ /dev/null @@ -1,177 +0,0 @@ -> -abstract class WebController { - const type TParameterDefinitions = shape( - 'required' => ImmVector, - 'optional' => ImmVector, - ); - - private RequestParameters $parameters; - private ImmMap $rawParameters; - - public function __construct( - ImmMap $parameters, - private ServerRequestInterface $request, - ) { - $combined_params = - (new Map($parameters))->setAll($request->getQueryParams())->immutable(); - - $spec = self::getParametersSpec(); - $this->parameters = new RequestParameters( - $spec['required'], - $spec['optional'], - $combined_params, - ); - $this->rawParameters = $combined_params; - } - - final public static function getParametersSpec( - ): self::TParameterDefinitions { - $uri = self::getUriParametersSpec(); - $extra = static::getExtraParametersSpec(); - return shape( - 'required' => $uri['required']->concat($extra['required']), - 'optional' => $uri['optional']->concat($extra['optional']), - ); - } - - /** Use the codegen traits instead */ - final protected function getParameters_PRIVATE_IMPL(): RequestParameters { - return $this->parameters; - } - - private static function getUriParametersSpec( - ): self::TParameterDefinitions { - try { - $class = TypeAssert\classname_of( - RoutableController::class, - static::class, - ); - } catch (IncorrectTypeException $e) { - return shape('required' => ImmVector {}, 'optional' => ImmVector {}); - } - return shape( - 'required' => $class::getUriPattern()->getParameters(), - 'optional' => ImmVector {}, - ); - } - - protected static function getExtraParametersSpec( - ): self::TParameterDefinitions { - return shape('required' => ImmVector {}, 'optional' => ImmVector {}); - } - - abstract public function getResponseAsync( - ResponseInterface $response, - ): Awaitable; - - final protected function getRequestedPath(): string { - return $this->request->getUri()->getPath(); - } - - final protected function getRequestedHost(): string { - return $this->request->getUri()->getHost(); - } - - protected static function invariantTo404((function(): T) $what): T { - try { - return $what(); - } catch (InvariantException $e) { - throw new HTTPNotFoundException($e->getMessage(), $e->getCode(), $e); - } - } - - final protected function getRawParameter_UNSAFE(string $name): ?string { - $params = $this->rawParameters; - if (!$params->containsKey($name)) { - return null; - } - return $params->at($name); - } - - protected function requireSecureConnection(): void { - $uri = $this->request->getUri(); - if ($uri->getScheme() !== 'https') { - throw new RedirectException($uri->withScheme('https')->toString()); - } - } - - protected function isFacebookIP(): bool { - $ip = $this->getRemoteIPAddress(); - if ($ip === null) { - return false; - } - return is_fb_ip_address($ip); - } - - <<__Memoize>> - private function getRemoteIPAddress(): ?string { - $ip = $this->request->getServerParams()['REMOTE_ADDR'] ?? null; - if ($ip === null) { - return null; - } - $ip = (string)$ip; - $stack = ($this->request->getServerParams()['HTTP_X_FORWARDED_FOR'] ?? '') - |> Str\split((string)$$, ',') - |> Vec\map($$, $part ==> Str\trim($part)) - |> Vec\filter($$, $part ==> !Str\is_empty($part)); - $stack[] = $ip; - while (!C\is_empty($stack)) { - $top = C\lastx($stack); - if (!self::isTrusted($top)) { - return $top; - } - $ip = $top; - $stack = Vec\take($stack, C\count($stack) - 1); - } - - return $ip; - } - - private static function isTrusted(string $ip): bool { - return C\any( - self::getTrustedRanges(), - $range ==> is_ip_in_range($ip, $range), - ); - } - - <<__Memoize>> - private static function getTrustedRanges(): vec<(string, string)> { - return HHVM\UserDocumentation\apc_fetch_or_set_method_data( - self::class, - __FUNCTION__, - () ==> Vec\map( - vec[ - '10.0.0.0/8', - '172.16.0.0/12', - '192.168.0.0/16', - '127.0.0.0/8', - ], - $range ==> cidr_to_bitstring_and_bitmask($range), - ), - ); - } -} diff --git a/src/site/controllers/WebPageController.php b/src/site/controllers/WebPageController.php deleted file mode 100644 index b9df984b4..000000000 --- a/src/site/controllers/WebPageController.php +++ /dev/null @@ -1,15 +0,0 @@ -> - */ - -final class APIClassPageControllerParameters - extends \Facebook\HackRouter\RequestParametersCodegen { - - const type TParameters = shape( - 'Product' => \HHVM\UserDocumentation\APIProduct, - 'Type' => \HHVM\UserDocumentation\APIDefinitionType, - 'Name' => string, - ); - - public function get(): self::TParameters { - $p = $this->getParameters(); - return shape( - 'Product' => $p->getEnum(\HHVM\UserDocumentation\APIProduct::class, 'Product'), - 'Type' => $p->getEnum(\HHVM\UserDocumentation\APIDefinitionType::class, 'Type'), - 'Name' => $p->getString('Name'), - ); - } -} - -trait APIClassPageControllerParametersTrait { - - require extends \WebController; - - <<__Memoize>> - final protected function getParameters( - ): APIClassPageControllerParameters::TParameters { - $raw = $this->getParameters_PRIVATE_IMPL(); - return (new APIClassPageControllerParameters($raw)) - ->get(); - } -} diff --git a/src/site/controllers/codegen/APIClassPageControllerURIBuilder.php b/src/site/controllers/codegen/APIClassPageControllerURIBuilder.php deleted file mode 100644 index 36e79c6b1..000000000 --- a/src/site/controllers/codegen/APIClassPageControllerURIBuilder.php +++ /dev/null @@ -1,35 +0,0 @@ -> - */ - -abstract final class APIClassPageControllerURIBuilder - extends \Facebook\HackRouter\UriBuilderCodegen { - - const classname<\Facebook\HackRouter\HasUriPattern> CONTROLLER = \APIClassPageController::class; - const type TParameters = shape( - 'Product' => \HHVM\UserDocumentation\APIProduct, - 'Type' => \HHVM\UserDocumentation\APIDefinitionType, - 'Name' => string, - ); - - public static function getPath(self::TParameters $parameters): string { - return self::createInnerBuilder() - ->setEnum( - \HHVM\UserDocumentation\APIProduct::class, - 'Product', - $parameters['Product'], - ) - ->setEnum( - \HHVM\UserDocumentation\APIDefinitionType::class, - 'Type', - $parameters['Type'], - ) - ->setString('Name', $parameters['Name'])->getPath(); - } -} diff --git a/src/site/controllers/codegen/APIFullListControllerParameters.php b/src/site/controllers/codegen/APIFullListControllerParameters.php deleted file mode 100644 index 0b0e26817..000000000 --- a/src/site/controllers/codegen/APIFullListControllerParameters.php +++ /dev/null @@ -1,37 +0,0 @@ -> - */ - -final class APIFullListControllerParameters - extends \Facebook\HackRouter\RequestParametersCodegen { - - const type TParameters = shape( - 'Product' => \HHVM\UserDocumentation\APIProduct, - ); - - public function get(): self::TParameters { - $p = $this->getParameters(); - return shape( - 'Product' => $p->getEnum(\HHVM\UserDocumentation\APIProduct::class, 'Product'), - ); - } -} - -trait APIFullListControllerParametersTrait { - - require extends \WebController; - - <<__Memoize>> - final protected function getParameters( - ): APIFullListControllerParameters::TParameters { - $raw = $this->getParameters_PRIVATE_IMPL(); - return (new APIFullListControllerParameters($raw)) - ->get(); - } -} diff --git a/src/site/controllers/codegen/APIFullListControllerURIBuilder.php b/src/site/controllers/codegen/APIFullListControllerURIBuilder.php deleted file mode 100644 index 6296db65a..000000000 --- a/src/site/controllers/codegen/APIFullListControllerURIBuilder.php +++ /dev/null @@ -1,27 +0,0 @@ -> - */ - -abstract final class APIFullListControllerURIBuilder - extends \Facebook\HackRouter\UriBuilderCodegen { - - const classname<\Facebook\HackRouter\HasUriPattern> CONTROLLER = \APIFullListController::class; - const type TParameters = shape( - 'Product' => \HHVM\UserDocumentation\APIProduct, - ); - - public static function getPath(self::TParameters $parameters): string { - return self::createInnerBuilder() - ->setEnum( - \HHVM\UserDocumentation\APIProduct::class, - 'Product', - $parameters['Product'], - )->getPath(); - } -} diff --git a/src/site/controllers/codegen/APIListByTypeControllerParameters.php b/src/site/controllers/codegen/APIListByTypeControllerParameters.php deleted file mode 100644 index cf4e783b1..000000000 --- a/src/site/controllers/codegen/APIListByTypeControllerParameters.php +++ /dev/null @@ -1,39 +0,0 @@ -> - */ - -final class APIListByTypeControllerParameters - extends \Facebook\HackRouter\RequestParametersCodegen { - - const type TParameters = shape( - 'Product' => \HHVM\UserDocumentation\APIProduct, - 'Type' => \HHVM\UserDocumentation\APIDefinitionType, - ); - - public function get(): self::TParameters { - $p = $this->getParameters(); - return shape( - 'Product' => $p->getEnum(\HHVM\UserDocumentation\APIProduct::class, 'Product'), - 'Type' => $p->getEnum(\HHVM\UserDocumentation\APIDefinitionType::class, 'Type'), - ); - } -} - -trait APIListByTypeControllerParametersTrait { - - require extends \WebController; - - <<__Memoize>> - final protected function getParameters( - ): APIListByTypeControllerParameters::TParameters { - $raw = $this->getParameters_PRIVATE_IMPL(); - return (new APIListByTypeControllerParameters($raw)) - ->get(); - } -} diff --git a/src/site/controllers/codegen/APIListByTypeControllerURIBuilder.php b/src/site/controllers/codegen/APIListByTypeControllerURIBuilder.php deleted file mode 100644 index 15b750649..000000000 --- a/src/site/controllers/codegen/APIListByTypeControllerURIBuilder.php +++ /dev/null @@ -1,33 +0,0 @@ -> - */ - -abstract final class APIListByTypeControllerURIBuilder - extends \Facebook\HackRouter\UriBuilderCodegen { - - const classname<\Facebook\HackRouter\HasUriPattern> CONTROLLER = \APIListByTypeController::class; - const type TParameters = shape( - 'Product' => \HHVM\UserDocumentation\APIProduct, - 'Type' => \HHVM\UserDocumentation\APIDefinitionType, - ); - - public static function getPath(self::TParameters $parameters): string { - return self::createInnerBuilder() - ->setEnum( - \HHVM\UserDocumentation\APIProduct::class, - 'Product', - $parameters['Product'], - ) - ->setEnum( - \HHVM\UserDocumentation\APIDefinitionType::class, - 'Type', - $parameters['Type'], - )->getPath(); - } -} diff --git a/src/site/controllers/codegen/APIMethodPageControllerParameters.php b/src/site/controllers/codegen/APIMethodPageControllerParameters.php deleted file mode 100644 index ad43fa0fb..000000000 --- a/src/site/controllers/codegen/APIMethodPageControllerParameters.php +++ /dev/null @@ -1,43 +0,0 @@ -> - */ - -final class APIMethodPageControllerParameters - extends \Facebook\HackRouter\RequestParametersCodegen { - - const type TParameters = shape( - 'Product' => \HHVM\UserDocumentation\APIProduct, - 'Type' => \HHVM\UserDocumentation\APIDefinitionType, - 'Class' => string, - 'Method' => string, - ); - - public function get(): self::TParameters { - $p = $this->getParameters(); - return shape( - 'Product' => $p->getEnum(\HHVM\UserDocumentation\APIProduct::class, 'Product'), - 'Type' => $p->getEnum(\HHVM\UserDocumentation\APIDefinitionType::class, 'Type'), - 'Class' => $p->getString('Class'), - 'Method' => $p->getString('Method'), - ); - } -} - -trait APIMethodPageControllerParametersTrait { - - require extends \WebController; - - <<__Memoize>> - final protected function getParameters( - ): APIMethodPageControllerParameters::TParameters { - $raw = $this->getParameters_PRIVATE_IMPL(); - return (new APIMethodPageControllerParameters($raw)) - ->get(); - } -} diff --git a/src/site/controllers/codegen/APIMethodPageControllerURIBuilder.php b/src/site/controllers/codegen/APIMethodPageControllerURIBuilder.php deleted file mode 100644 index 62b08cfca..000000000 --- a/src/site/controllers/codegen/APIMethodPageControllerURIBuilder.php +++ /dev/null @@ -1,37 +0,0 @@ -> - */ - -abstract final class APIMethodPageControllerURIBuilder - extends \Facebook\HackRouter\UriBuilderCodegen { - - const classname<\Facebook\HackRouter\HasUriPattern> CONTROLLER = \APIMethodPageController::class; - const type TParameters = shape( - 'Product' => \HHVM\UserDocumentation\APIProduct, - 'Type' => \HHVM\UserDocumentation\APIDefinitionType, - 'Class' => string, - 'Method' => string, - ); - - public static function getPath(self::TParameters $parameters): string { - return self::createInnerBuilder() - ->setEnum( - \HHVM\UserDocumentation\APIProduct::class, - 'Product', - $parameters['Product'], - ) - ->setEnum( - \HHVM\UserDocumentation\APIDefinitionType::class, - 'Type', - $parameters['Type'], - ) - ->setString('Class', $parameters['Class']) - ->setString('Method', $parameters['Method'])->getPath(); - } -} diff --git a/src/site/controllers/codegen/GuidePageControllerParameters.php b/src/site/controllers/codegen/GuidePageControllerParameters.php deleted file mode 100644 index 7847e65b9..000000000 --- a/src/site/controllers/codegen/GuidePageControllerParameters.php +++ /dev/null @@ -1,41 +0,0 @@ -> - */ - -final class GuidePageControllerParameters - extends \Facebook\HackRouter\RequestParametersCodegen { - - const type TParameters = shape( - 'Product' => \HHVM\UserDocumentation\GuidesProduct, - 'Guide' => string, - 'Page' => string, - ); - - public function get(): self::TParameters { - $p = $this->getParameters(); - return shape( - 'Product' => $p->getEnum(\HHVM\UserDocumentation\GuidesProduct::class, 'Product'), - 'Guide' => $p->getString('Guide'), - 'Page' => $p->getString('Page'), - ); - } -} - -trait GuidePageControllerParametersTrait { - - require extends \WebController; - - <<__Memoize>> - final protected function getParameters( - ): GuidePageControllerParameters::TParameters { - $raw = $this->getParameters_PRIVATE_IMPL(); - return (new GuidePageControllerParameters($raw)) - ->get(); - } -} diff --git a/src/site/controllers/codegen/GuidePageControllerURIBuilder.php b/src/site/controllers/codegen/GuidePageControllerURIBuilder.php deleted file mode 100644 index 003d1532d..000000000 --- a/src/site/controllers/codegen/GuidePageControllerURIBuilder.php +++ /dev/null @@ -1,31 +0,0 @@ -> - */ - -abstract final class GuidePageControllerURIBuilder - extends \Facebook\HackRouter\UriBuilderCodegen { - - const classname<\Facebook\HackRouter\HasUriPattern> CONTROLLER = \GuidePageController::class; - const type TParameters = shape( - 'Product' => \HHVM\UserDocumentation\GuidesProduct, - 'Guide' => string, - 'Page' => string, - ); - - public static function getPath(self::TParameters $parameters): string { - return self::createInnerBuilder() - ->setEnum( - \HHVM\UserDocumentation\GuidesProduct::class, - 'Product', - $parameters['Product'], - ) - ->setString('Guide', $parameters['Guide']) - ->setString('Page', $parameters['Page'])->getPath(); - } -} diff --git a/src/site/controllers/codegen/GuidesListControllerParameters.php b/src/site/controllers/codegen/GuidesListControllerParameters.php deleted file mode 100644 index 388e832aa..000000000 --- a/src/site/controllers/codegen/GuidesListControllerParameters.php +++ /dev/null @@ -1,37 +0,0 @@ -> - */ - -final class GuidesListControllerParameters - extends \Facebook\HackRouter\RequestParametersCodegen { - - const type TParameters = shape( - 'Product' => \HHVM\UserDocumentation\GuidesProduct, - ); - - public function get(): self::TParameters { - $p = $this->getParameters(); - return shape( - 'Product' => $p->getEnum(\HHVM\UserDocumentation\GuidesProduct::class, 'Product'), - ); - } -} - -trait GuidesListControllerParametersTrait { - - require extends \WebController; - - <<__Memoize>> - final protected function getParameters( - ): GuidesListControllerParameters::TParameters { - $raw = $this->getParameters_PRIVATE_IMPL(); - return (new GuidesListControllerParameters($raw)) - ->get(); - } -} diff --git a/src/site/controllers/codegen/GuidesListControllerURIBuilder.php b/src/site/controllers/codegen/GuidesListControllerURIBuilder.php deleted file mode 100644 index 2b4ea8790..000000000 --- a/src/site/controllers/codegen/GuidesListControllerURIBuilder.php +++ /dev/null @@ -1,27 +0,0 @@ -> - */ - -abstract final class GuidesListControllerURIBuilder - extends \Facebook\HackRouter\UriBuilderCodegen { - - const classname<\Facebook\HackRouter\HasUriPattern> CONTROLLER = \GuidesListController::class; - const type TParameters = shape( - 'Product' => \HHVM\UserDocumentation\GuidesProduct, - ); - - public static function getPath(self::TParameters $parameters): string { - return self::createInnerBuilder() - ->setEnum( - \HHVM\UserDocumentation\GuidesProduct::class, - 'Product', - $parameters['Product'], - )->getPath(); - } -} diff --git a/src/site/controllers/codegen/HomePageControllerParameters.php b/src/site/controllers/codegen/HomePageControllerParameters.php deleted file mode 100644 index 2cafa7595..000000000 --- a/src/site/controllers/codegen/HomePageControllerParameters.php +++ /dev/null @@ -1,34 +0,0 @@ -> - */ - -final class HomePageControllerParameters - extends \Facebook\HackRouter\RequestParametersCodegen { - - const type TParameters = shape( - ); - - public function get(): self::TParameters { - return shape( - ); - } -} - -trait HomePageControllerParametersTrait { - - require extends \WebController; - - <<__Memoize>> - final protected function getParameters( - ): HomePageControllerParameters::TParameters { - $raw = $this->getParameters_PRIVATE_IMPL(); - return (new HomePageControllerParameters($raw)) - ->get(); - } -} diff --git a/src/site/controllers/codegen/HomePageControllerURIBuilder.php b/src/site/controllers/codegen/HomePageControllerURIBuilder.php deleted file mode 100644 index 411306ee6..000000000 --- a/src/site/controllers/codegen/HomePageControllerURIBuilder.php +++ /dev/null @@ -1,22 +0,0 @@ -> - */ - -abstract final class HomePageControllerURIBuilder - extends \Facebook\HackRouter\UriBuilderCodegen { - - const classname<\Facebook\HackRouter\HasUriPattern> CONTROLLER = \HomePageController::class; - const type TParameters = shape( - ); - - public static function getPath(): string { - return self::createInnerBuilder() - ->getPath(); - } -} diff --git a/src/site/controllers/codegen/JumpControllerParameters.php b/src/site/controllers/codegen/JumpControllerParameters.php deleted file mode 100644 index 10443993b..000000000 --- a/src/site/controllers/codegen/JumpControllerParameters.php +++ /dev/null @@ -1,37 +0,0 @@ -> - */ - -final class JumpControllerParameters - extends \Facebook\HackRouter\RequestParametersCodegen { - - const type TParameters = shape( - 'Keyword' => string, - ); - - public function get(): self::TParameters { - $p = $this->getParameters(); - return shape( - 'Keyword' => $p->getString('Keyword'), - ); - } -} - -trait JumpControllerParametersTrait { - - require extends \WebController; - - <<__Memoize>> - final protected function getParameters( - ): JumpControllerParameters::TParameters { - $raw = $this->getParameters_PRIVATE_IMPL(); - return (new JumpControllerParameters($raw)) - ->get(); - } -} diff --git a/src/site/controllers/codegen/JumpControllerURIBuilder.php b/src/site/controllers/codegen/JumpControllerURIBuilder.php deleted file mode 100644 index a6a643a74..000000000 --- a/src/site/controllers/codegen/JumpControllerURIBuilder.php +++ /dev/null @@ -1,23 +0,0 @@ -> - */ - -abstract final class JumpControllerURIBuilder - extends \Facebook\HackRouter\UriBuilderCodegen { - - const classname<\Facebook\HackRouter\HasUriPattern> CONTROLLER = \JumpController::class; - const type TParameters = shape( - 'Keyword' => string, - ); - - public static function getPath(self::TParameters $parameters): string { - return self::createInnerBuilder() - ->setString('Keyword', $parameters['Keyword'])->getPath(); - } -} diff --git a/src/site/controllers/codegen/LegacyRedirectControllerParameters.php b/src/site/controllers/codegen/LegacyRedirectControllerParameters.php deleted file mode 100644 index c75cefd92..000000000 --- a/src/site/controllers/codegen/LegacyRedirectControllerParameters.php +++ /dev/null @@ -1,37 +0,0 @@ -> - */ - -final class LegacyRedirectControllerParameters - extends \Facebook\HackRouter\RequestParametersCodegen { - - const type TParameters = shape( - 'LegacyId' => string, - ); - - public function get(): self::TParameters { - $p = $this->getParameters(); - return shape( - 'LegacyId' => $p->getString('LegacyId'), - ); - } -} - -trait LegacyRedirectControllerParametersTrait { - - require extends \WebController; - - <<__Memoize>> - final protected function getParameters( - ): LegacyRedirectControllerParameters::TParameters { - $raw = $this->getParameters_PRIVATE_IMPL(); - return (new LegacyRedirectControllerParameters($raw)) - ->get(); - } -} diff --git a/src/site/controllers/codegen/LegacyRedirectControllerURIBuilder.php b/src/site/controllers/codegen/LegacyRedirectControllerURIBuilder.php deleted file mode 100644 index b0cdf33d1..000000000 --- a/src/site/controllers/codegen/LegacyRedirectControllerURIBuilder.php +++ /dev/null @@ -1,23 +0,0 @@ -> - */ - -abstract final class LegacyRedirectControllerURIBuilder - extends \Facebook\HackRouter\UriBuilderCodegen { - - const classname<\Facebook\HackRouter\HasUriPattern> CONTROLLER = \LegacyRedirectController::class; - const type TParameters = shape( - 'LegacyId' => string, - ); - - public static function getPath(self::TParameters $parameters): string { - return self::createInnerBuilder() - ->setString('LegacyId', $parameters['LegacyId'])->getPath(); - } -} diff --git a/src/site/controllers/codegen/RedirectToGuideFirstPageControllerParameters.php b/src/site/controllers/codegen/RedirectToGuideFirstPageControllerParameters.php deleted file mode 100644 index 48ecad613..000000000 --- a/src/site/controllers/codegen/RedirectToGuideFirstPageControllerParameters.php +++ /dev/null @@ -1,39 +0,0 @@ -> - */ - -final class RedirectToGuideFirstPageControllerParameters - extends \Facebook\HackRouter\RequestParametersCodegen { - - const type TParameters = shape( - 'Product' => \HHVM\UserDocumentation\GuidesProduct, - 'Guide' => string, - ); - - public function get(): self::TParameters { - $p = $this->getParameters(); - return shape( - 'Product' => $p->getEnum(\HHVM\UserDocumentation\GuidesProduct::class, 'Product'), - 'Guide' => $p->getString('Guide'), - ); - } -} - -trait RedirectToGuideFirstPageControllerParametersTrait { - - require extends \WebController; - - <<__Memoize>> - final protected function getParameters( - ): RedirectToGuideFirstPageControllerParameters::TParameters { - $raw = $this->getParameters_PRIVATE_IMPL(); - return (new RedirectToGuideFirstPageControllerParameters($raw)) - ->get(); - } -} diff --git a/src/site/controllers/codegen/RedirectToGuideFirstPageControllerURIBuilder.php b/src/site/controllers/codegen/RedirectToGuideFirstPageControllerURIBuilder.php deleted file mode 100644 index 5bfc15517..000000000 --- a/src/site/controllers/codegen/RedirectToGuideFirstPageControllerURIBuilder.php +++ /dev/null @@ -1,29 +0,0 @@ -> - */ - -abstract final class RedirectToGuideFirstPageControllerURIBuilder - extends \Facebook\HackRouter\UriBuilderCodegen { - - const classname<\Facebook\HackRouter\HasUriPattern> CONTROLLER = \RedirectToGuideFirstPageController::class; - const type TParameters = shape( - 'Product' => \HHVM\UserDocumentation\GuidesProduct, - 'Guide' => string, - ); - - public static function getPath(self::TParameters $parameters): string { - return self::createInnerBuilder() - ->setEnum( - \HHVM\UserDocumentation\GuidesProduct::class, - 'Product', - $parameters['Product'], - ) - ->setString('Guide', $parameters['Guide'])->getPath(); - } -} diff --git a/src/site/controllers/codegen/RobotsTxtControllerParameters.php b/src/site/controllers/codegen/RobotsTxtControllerParameters.php deleted file mode 100644 index 04f55a4e2..000000000 --- a/src/site/controllers/codegen/RobotsTxtControllerParameters.php +++ /dev/null @@ -1,34 +0,0 @@ -> - */ - -final class RobotsTxtControllerParameters - extends \Facebook\HackRouter\RequestParametersCodegen { - - const type TParameters = shape( - ); - - public function get(): self::TParameters { - return shape( - ); - } -} - -trait RobotsTxtControllerParametersTrait { - - require extends \WebController; - - <<__Memoize>> - final protected function getParameters( - ): RobotsTxtControllerParameters::TParameters { - $raw = $this->getParameters_PRIVATE_IMPL(); - return (new RobotsTxtControllerParameters($raw)) - ->get(); - } -} diff --git a/src/site/controllers/codegen/RobotsTxtControllerURIBuilder.php b/src/site/controllers/codegen/RobotsTxtControllerURIBuilder.php deleted file mode 100644 index 0de6a70ae..000000000 --- a/src/site/controllers/codegen/RobotsTxtControllerURIBuilder.php +++ /dev/null @@ -1,22 +0,0 @@ -> - */ - -abstract final class RobotsTxtControllerURIBuilder - extends \Facebook\HackRouter\UriBuilderCodegen { - - const classname<\Facebook\HackRouter\HasUriPattern> CONTROLLER = \RobotsTxtController::class; - const type TParameters = shape( - ); - - public static function getPath(): string { - return self::createInnerBuilder() - ->getPath(); - } -} diff --git a/src/site/controllers/codegen/SearchControllerParameters.php b/src/site/controllers/codegen/SearchControllerParameters.php deleted file mode 100644 index e76da1484..000000000 --- a/src/site/controllers/codegen/SearchControllerParameters.php +++ /dev/null @@ -1,37 +0,0 @@ -> - */ - -final class SearchControllerParameters - extends \Facebook\HackRouter\RequestParametersCodegen { - - const type TParameters = shape( - 'term' => string, - ); - - public function get(): self::TParameters { - $p = $this->getParameters(); - return shape( - 'term' => $p->getString('term'), - ); - } -} - -trait SearchControllerParametersTrait { - - require extends \WebController; - - <<__Memoize>> - final protected function getParameters( - ): SearchControllerParameters::TParameters { - $raw = $this->getParameters_PRIVATE_IMPL(); - return (new SearchControllerParameters($raw)) - ->get(); - } -} diff --git a/src/site/controllers/codegen/SearchControllerURIBuilder.php b/src/site/controllers/codegen/SearchControllerURIBuilder.php deleted file mode 100644 index ad0fa08f7..000000000 --- a/src/site/controllers/codegen/SearchControllerURIBuilder.php +++ /dev/null @@ -1,22 +0,0 @@ -> - */ - -abstract final class SearchControllerURIBuilder - extends \Facebook\HackRouter\UriBuilderCodegen { - - const classname<\Facebook\HackRouter\HasUriPattern> CONTROLLER = \SearchController::class; - const type TParameters = shape( - ); - - public static function getPath(): string { - return self::createInnerBuilder() - ->getPath(); - } -} diff --git a/src/site/controllers/codegen/StaticResourcesControllerParameters.php b/src/site/controllers/codegen/StaticResourcesControllerParameters.php deleted file mode 100644 index 17bb52a37..000000000 --- a/src/site/controllers/codegen/StaticResourcesControllerParameters.php +++ /dev/null @@ -1,41 +0,0 @@ -> - */ - -final class StaticResourcesControllerParameters - extends \Facebook\HackRouter\RequestParametersCodegen { - - const type TParameters = shape( - 'Checksum' => string, - 'File' => string, - 'MTime' => ?int, - ); - - public function get(): self::TParameters { - $p = $this->getParameters(); - return shape( - 'Checksum' => $p->getString('Checksum'), - 'File' => $p->getString('File'), - 'MTime' => $p->getOptionalInt('MTime'), - ); - } -} - -trait StaticResourcesControllerParametersTrait { - - require extends \WebController; - - <<__Memoize>> - final protected function getParameters( - ): StaticResourcesControllerParameters::TParameters { - $raw = $this->getParameters_PRIVATE_IMPL(); - return (new StaticResourcesControllerParameters($raw)) - ->get(); - } -} diff --git a/src/site/controllers/codegen/StaticResourcesControllerURIBuilder.php b/src/site/controllers/codegen/StaticResourcesControllerURIBuilder.php deleted file mode 100644 index c59941882..000000000 --- a/src/site/controllers/codegen/StaticResourcesControllerURIBuilder.php +++ /dev/null @@ -1,25 +0,0 @@ -> - */ - -abstract final class StaticResourcesControllerURIBuilder - extends \Facebook\HackRouter\UriBuilderCodegen { - - const classname<\Facebook\HackRouter\HasUriPattern> CONTROLLER = \StaticResourcesController::class; - const type TParameters = shape( - 'Checksum' => string, - 'File' => string, - ); - - public static function getPath(self::TParameters $parameters): string { - return self::createInnerBuilder() - ->setString('Checksum', $parameters['Checksum']) - ->setString('File', $parameters['File'])->getPath(); - } -} diff --git a/src/site/http_exceptions.php b/src/site/http_exceptions.php deleted file mode 100644 index af2374867..000000000 --- a/src/site/http_exceptions.php +++ /dev/null @@ -1,61 +0,0 @@ -; -} -abstract class RoutingException extends HTTPException {} - -final class HTTPNotFoundException extends RoutingException { - <<__Override>> - public async function getResponseAsync( - ServerRequestInterface $request, - ResponseInterface $response, - ): Awaitable { - return await (new HTTP404Controller(ImmMap {}, $request))->getResponseAsync( - $response, - ); - } -} - -final class HTTPMethodNotAllowedException extends RoutingException { - <<__Override>> - public async function getResponseAsync( - ServerRequestInterface $_, - ResponseInterface $response, - ): Awaitable { - return $response->withStatus(405); - } -} - -final class RedirectException extends HTTPException { - public function __construct(private string $destination) { - parent::__construct(); - } - - <<__Override>> - public async function getResponseAsync( - ServerRequestInterface $_, - ResponseInterface $response, - ): Awaitable { - return $response - ->withStatus(301) - ->withHeader('Location', vec[$this->destination]); - } -} diff --git a/src/site/xhp/APCCachedRenderable.php b/src/site/xhp/APCCachedRenderable.php deleted file mode 100644 index 9dbe0ff6b..000000000 --- a/src/site/xhp/APCCachedRenderable.php +++ /dev/null @@ -1,54 +0,0 @@ - { - return $this->str; - } - - public static function get(string $key): ?x\node { - $_success = null; - $str = \apc_fetch(self::makeKey($key), inout $_success); - if (\is_string($str)) { - $ret = {new APCCachedRenderable($str)}; - return $ret; - } - return null; - } - - /** - * This renders (stringifies) $content, making it impossible to render it - * again. If you need that, render the returned x\node instead, which provides - * identical output. - */ - public static function store(string $key, x\node $content): x\node { - $str = \HH\Asio\join($content->toStringAsync()); - $key = self::makeKey($key); - \apc_store($key, $str); - return {new self($str)}; - } - - private static function makeKey(string $key): string { - // Might seem overkill for a non-user-controlled cache key, but I don't want - // to worry about forgetting about it if user input ever ends up in here. - return \hash('sha256', $key.'!!!'.__CLASS__.'!!!'.LocalConfig::getBuildID()); - } -} diff --git a/src/site/xhp/HTMLFileRenderable.php b/src/site/xhp/HTMLFileRenderable.php deleted file mode 100644 index fc15ef6e5..000000000 --- a/src/site/xhp/HTMLFileRenderable.php +++ /dev/null @@ -1,35 +0,0 @@ - { - return \file_get_contents($this->htmlFile); - } -} diff --git a/src/site/xhp/XHPGetRequest-trait.php b/src/site/xhp/XHPGetRequest-trait.php deleted file mode 100644 index 1a00fb5e8..000000000 --- a/src/site/xhp/XHPGetRequest-trait.php +++ /dev/null @@ -1,29 +0,0 @@ -getContext('ServerRequestInterface'); - invariant( - $x is ServerRequestInterface, - '%s is not a ServerRequestInterface', - \gettype($x).' ('.\get_class($x).')', - ); - return $x; - } -} diff --git a/src/site/xhp/a_post.php b/src/site/xhp/a_post.php deleted file mode 100644 index ec71f405d..000000000 --- a/src/site/xhp/a_post.php +++ /dev/null @@ -1,48 +0,0 @@ -> - protected async function renderAsync(): Awaitable { - $id = $this->getID(); - - $anchor = {$this->getChildren()}; - $form = ( -
    :href} - target={$this->:target} - class="postLink"> - {$anchor} -
    - ); - - $anchor->setAttribute( - 'onclick', - 'document.getElementById("'.$id.'").submit(); return false;', - ); - $anchor->setAttribute('href', '#'); - - return $form; - } -} diff --git a/src/site/xhp/api-list.php b/src/site/xhp/api-list.php deleted file mode 100644 index 38d878977..000000000 --- a/src/site/xhp/api-list.php +++ /dev/null @@ -1,91 +0,0 @@ - types @required; - - private function getDefinitions( - ): Map> { - switch ($this->:product) { - case APIProduct::HACK: - case APIProduct::HSL: - case APIProduct::HSL_EXPERIMENTAL: - return $this->getHackDefinitions($this->:product); - } - } - - private function getHackDefinitions( - APIProduct $product, - ): Map> { - $out = Map {}; - foreach ($this->:types as $type) { - $index = APIIndex::get($product)->getIndexForType($type); - $out[$type] = Map {}; - foreach ($index as $node) { - $out[$type][$node['name']] = tuple( - $node['urlPath'], - $type === APIDefinitionType::FUNCTION_DEF && ($node as APIFunctionIndexEntry)['deprecation'] !== null - ); - } - } - return $out; - } - - private function getInnerContent(): x\node { - $defs = $this->getDefinitions(); - - $root =
    ; - foreach ($defs as $type => $api_references) { - if (C\is_empty($api_references)) { - continue; - } - $title = \ucwords($type.' Reference'); - $type_list =
      ; - foreach ($api_references as $name => list($url, $deprecated)) { - $name = $name - |> Str\strip_prefix($$, "HH\\Lib\\Experimental\\") - |> Str\strip_prefix($$, "HH\\Lib\\"); - $type_list->appendChild( -
    • - {$name} -
    • , - ); - } - - $root->appendChild( -
      -

      {$title}

      - {$type_list} -
      , - ); - } - - return $root; - } - - <<__Override>> - final protected async function renderAsync(): Awaitable { - return -
      - {$this->getInnerContent()} -
      ; - } -} diff --git a/src/site/xhp/github-issue-link.php b/src/site/xhp/github-issue-link.php deleted file mode 100644 index 5e23f47c8..000000000 --- a/src/site/xhp/github-issue-link.php +++ /dev/null @@ -1,83 +0,0 @@ - controller; - - protected static function getChildrenDeclaration(): XHPChild\Constraint { - return XHPChild\sequence( - XHPChild\optional(XHPChild\of_type()), - XHPChild\pcdata(), - ); - } - - - use XHPGetRequest; - - <<__Override>> - protected async function renderAsync(): Awaitable { - $body = $this->:issueBody."\n\n".$this->getMetadataForBody(); - - $new_issue_prefill_url = \sprintf( - '%s?title=%s&body=%s', - 'https://github.com/hhvm/user-documentation/issues/new', - \urlencode($this->:issueTitle ?? ''), - \urlencode($body), - ); - - return ( - - {$this->getChildren()} - - ); - } - - private function getMetadataForBody(): string { - $build_id = LocalConfig::getBuildID(); - $request_time = (new \DateTime()) - ->setTimezone(new \DateTimeZone('UTC')) - ->format(\DateTime::RFC2822); - $request_path = $this->getRequest()->getUri()->getPath(); - - $rows = Vector { - 'Build ID: '.$build_id, - 'Page requested: '.$request_path, - 'Page requested at: '.$request_time, - }; - - $controller = $this->:controller; - if ($controller !== null) { - $rows[] = 'Controller: '.$controller; - } - - $rows = \implode("\n", $rows->map($x ==> ' - '.$x)); - - return <<> - protected async function renderAsync(): Awaitable { - $tracking_id = \json_encode($this->:trackingID); - $js = <<{$js}; - } -} diff --git a/src/site/xhp/search-bar.php b/src/site/xhp/search-bar.php deleted file mode 100644 index e245c0837..000000000 --- a/src/site/xhp/search-bar.php +++ /dev/null @@ -1,44 +0,0 @@ -> - protected async function renderAsync(): Awaitable { - $class = ($this->:class !== null) - ? "searchBar ".$this->:class - : "searchBar"; - return -
      -
      - -
      - - -
      -
      -
      ; - } -} diff --git a/src/site/xhp/static-base.php b/src/site/xhp/static-base.php deleted file mode 100644 index df9317d1d..000000000 --- a/src/site/xhp/static-base.php +++ /dev/null @@ -1,55 +0,0 @@ -; - - final protected function getMimeType(): string { - return $this->getEntry()['mimeType']; - } - - final protected function getVersionedURL(): string { - $info = $this->getEntry(); - $local_path = $info['localPath']; - $relative_path = $this->:path; - - $mtime = \filemtime($local_path); - if ($info['mtime'] !== $mtime) { - $url = \sprintf('/s/local-changes%s?mtime=%d', $relative_path, $mtime); - } else { - $url = \sprintf('/s/%s%s', $info['checksum'], $relative_path); - } - return $url; - } - - <<__Memoize>> - private function getEntry(): StaticResourceMapEntry { - $url_path = $this->:path; - // TODO: move to URLBuilder class when #80 merged - $info = StaticResourceMap::getEntryForFile($url_path); - - invariant( - $this->getAllowedMimeTypes()->contains($info['mimeType']), - "can't render %s for file %s of mime type %s", - static::class, - $url_path, - $info['mimeType'], - ); - return $info; - } -} diff --git a/src/site/xhp/static-script.php b/src/site/xhp/static-script.php deleted file mode 100644 index 94c92ff1c..000000000 --- a/src/site/xhp/static-script.php +++ /dev/null @@ -1,27 +0,0 @@ -> - protected function getAllowedMimeTypes(): Set { - return Set {'application/javascript'}; - } - - <<__Override>> - protected async function renderAsync(): Awaitable { - return - getMimeType()} src={$this->getVersionedURL()} />; - } -} diff --git a/src/site/xhp/static-stylesheet.php b/src/site/xhp/static-stylesheet.php deleted file mode 100644 index e9984f9e7..000000000 --- a/src/site/xhp/static-stylesheet.php +++ /dev/null @@ -1,38 +0,0 @@ -> - protected function getAllowedMimeTypes(): Set { - return Set {'text/css'}; - } - - <<__Override>> - protected async function renderAsync(): Awaitable { - $ret = - getMimeType()} - href={$this->getVersionedURL()} - />; - if ($this->:media is nonnull) { - $ret->setAttribute('media', $this->:media); - } - return $ret; - } -} diff --git a/src/site/xhp/ui-breadcrumbs.php b/src/site/xhp/ui-breadcrumbs.php deleted file mode 100644 index 3e4317308..000000000 --- a/src/site/xhp/ui-breadcrumbs.php +++ /dev/null @@ -1,55 +0,0 @@ - stack @required; - - <<__Override>> - protected async function renderAsync(): Awaitable { - $stack = $this->:stack; - list($current, $_) = C\lastx($stack); - $ancestors = Vec\take($stack, C\count($stack) - 1); - - $container = ( - - Documentation - - ); - foreach ($ancestors as list($name, $url)) { - $link = $url === null ? $name : {$name}; - $container->appendChild( - - - {$link} - , - ); - } - $container->appendChild( - - - {$current} - , - ); - return ( - - ); - } -} diff --git a/src/site/xhp/ui-button.php b/src/site/xhp/ui-button.php deleted file mode 100644 index f33c013d6..000000000 --- a/src/site/xhp/ui-button.php +++ /dev/null @@ -1,86 +0,0 @@ -()), - ); - } - - - <<__Override>> - protected async function renderAsync(): Awaitable { - $holder_class = ($this->:className !== null) - ? "buttonHolder ".$this->:className - : "buttonHolder"; - $button_class = "button button". - \ucfirst($this->:use). - " button". - \ucfirst($this->:size); - - $glyph = null; - $glyph_icon = $this->:glyph; - if ($glyph_icon !== null) { - $holder_class .= " buttonWithGlyph"; - $glyph = ; - } - - if ($this->:href !== null) { - $button = - :href} - role="button" - target={$this->:target}> - {$glyph} - {$this->getChildren()} - ; - } else { - $button = -
      - {$glyph} - {$this->getChildren()} -
      ; - } - - if ($this->:inline) { - $holder_class .= " buttonInlineHolder"; - } - - if ($this->:align === 'right') { - $holder_class .= " buttonAlignRight"; - } - - return -
      - {$button} -
      ; - } -} diff --git a/src/site/xhp/ui-feedback.php b/src/site/xhp/ui-feedback.php deleted file mode 100644 index 280042c4a..000000000 --- a/src/site/xhp/ui-feedback.php +++ /dev/null @@ -1,65 +0,0 @@ -> - protected async function renderAsync(): Awaitable { - $feedback_message = -
      Was This Page Useful? - - -
      ; - - $good_feedback_message = -
      Thank You!
      ; - - $bad_feedback_message = -
      Thank You! If you'd like to share more feedback, please getGithubIssueTitle()} issueBody={$this->getGithubIssueBody()}>file an issue.
      ; - - $container = ( -
      - {$feedback_message} - {$good_feedback_message} - {$bad_feedback_message} -
      - ); - - $container->appendChild(varray[]); - - return $container; - } - - protected function getGithubIssueTitle(): ?string { - return null; - } - - protected function getGithubIssueBody(): string { - return <<> - protected async function renderAsync(): Awaitable { - $class = "glyphIcon fa fa-".$this->:icon; - return ; - } -} diff --git a/src/site/xhp/ui-navbar.php b/src/site/xhp/ui-navbar.php deleted file mode 100644 index 164c90f12..000000000 --- a/src/site/xhp/ui-navbar.php +++ /dev/null @@ -1,266 +0,0 @@ - data @required, - vec activePath @required, - string extraNavListClass; - - <<__Override>> - protected async function renderAsync(): Awaitable { - $roots = Dict\map($this->:data, $node ==> $this->renderLevel1Item($node)); - - $nav_list_class = 'navList'; - $extra = $this->:extraNavListClass; - if ($extra !== null) { - $nav_list_class .= ' '.$extra; - } - - $toggle_button = - ; - - $list = ( -
        - {$roots} -
      - ); - - $container = ( - - ); - - $container->appendChild(varray[ - $this->getToggleScript($toggle_button, $container), - $this->getScrollToActiveScript($list), - ]); - - return $container; - } - - private function getToggleScript(div $button, div $container): script { - $button_id = \json_encode($button->getID()); - $container_id = \json_encode($container->getID()); - return ( - - ); - } - - private function getScrollToActiveScript(ul $list): script { - $path = $this->:activePath; - if (!$path) { - return - ); - } - - private static function getDisplayName(NavDataNode $node): string { - return $node['name'] - |> Str\strip_prefix($$, "HH\\Lib\\Experimental\\") - |> Str\strip_prefix($$, "HH\\Lib\\"); - } - - private function isActive(NavDataNode ...$nodes): bool { - $idx = 0; - $active = $this->:activePath; - foreach ($nodes as $node) { - if (!\array_key_exists($idx, $active)) { - return false; - } - if ($active[$idx] !== $node['name']) { - return false; - } - ++$idx; - } - return true; - } - - /* Caching: the uncached performance is completely fine for prod, but much too - * slow when opening every possible page in the test suite. - */ - private function renderLevel1Item(NavDataNode $node): x\node { - return $this->cachedRender( - $node['name'].'//'.$node['urlPath'], - $this->isActive($node), - () ==> $this->renderLevel1ItemImpl($node), - ); - } - - private function renderLevel1ItemImpl(NavDataNode $node): x\node { - $children = $this->renderChildren( - 'subList', - $node, - $child ==> $this->renderLevel2Item($node, $child), - ); - - $class = 'navGroup'; - if ($this->isActive($node)) { - $class .= ' navGroupActive'; - } - - return -
    • -

      - - {self::getDisplayName($node)} - -

      - {$children} -
    • ; - } - - /* Caching: the uncached performance is completely fine for prod, but much too - * slow when opening every possible page in the test suite. - */ - private function renderLevel2Item( - NavDataNode $parent, - NavDataNode $node, - ): x\node { - return $this->cachedRender( - $parent['name'].'//'.$node['name'].'//'.$node['urlPath'], - $this->isActive($parent, $node), - () ==> $this->renderLevel2ItemImpl($parent, $node), - ); - } - - - private function renderLevel2ItemImpl( - NavDataNode $parent, - NavDataNode $node, - ): x\node { - $id = $parent['name'].'/'.$node['name']; - - $children = $this->renderChildren( - 'secondLevelList', - $node, - $child ==> $this->renderLevel3Item($parent, $node, $child), - ); - - $class = 'subListItem'; - if ($this->isActive($parent, $node)) { - $class .= ' itemActive'; - } - - return ( -
    • -
      - - {self::getDisplayName($node)} - -
      - {$children} -
    • - ); - } - - private function renderLevel3Item( - NavDataNode $grandparent, - NavDataNode $parent, - NavDataNode $node, - ): li { - $id = $grandparent['name'].'/'.$parent['name'].'/'.$node['name']; - $class = 'secondLevelListItem'; - if ($this->isActive($grandparent, $parent)) { - $class .= ' itemActive'; - if ($this->isActive($grandparent, $parent, $node)) { - $class .= ' secondLevelItemActive'; - } - } - - return ( -
    • -
      - - {self::getDisplayName($node)} - -
      -
    • - ); - } - - private function renderChildren( - string $list_class, - NavDataNode $parent, - (function(NavDataNode): x\node) $render_func, - ): ?x\node { - if (!$parent['children']) { - return null; - } - - $root =
        ; - foreach ($parent['children'] as $child) { - $root->appendChild( - /* HH_IGNORE_ERROR[4110] key children is typehinted as mixed to prevent infinite regress */ - $render_func($child), - ); - } - return $root; - } - - private function cachedRender( - string $cache_key, - bool $is_active, - (function(): x\node) $callback, - ): x\node { - if ($is_active) { - return $callback(); - } - - $cache_key .= '!!!'.self::class.'!!!'; - $stored = APCCachedRenderable::get($cache_key); - if ($stored) { - return $stored; - } - - return APCCachedRenderable::store($cache_key, $callback()); - } -} diff --git a/src/site/xhp/ui-notice.php b/src/site/xhp/ui-notice.php deleted file mode 100644 index 047a9048d..000000000 --- a/src/site/xhp/ui-notice.php +++ /dev/null @@ -1,50 +0,0 @@ -> - protected async function renderAsync(): Awaitable { - $holder_class = ($this->:className !== null) - ? "noticeHolder ".$this->:className - : "noticeHolder"; - $notice_class = "notice notice". - \ucfirst($this->:use). - " notice". - \ucfirst($this->:size); - - $glyph = null; - $glyph_icon = $this->:glyph; - if ($glyph_icon !== null) { - $holder_class .= " noticeWithGlyph"; - $glyph = ; - } - - return -
        -
        - {$glyph} - {$this->getChildren()} -
        -
        ; - } -} diff --git a/src/site/xhp/x_comment.php b/src/site/xhp/x_comment.php deleted file mode 100644 index 352b9756f..000000000 --- a/src/site/xhp/x_comment.php +++ /dev/null @@ -1,33 +0,0 @@ -> - protected async function stringifyAsync(): Awaitable { - $html = ''; - return $html; - } -} diff --git a/src/typedefs.php b/src/typedefs.php deleted file mode 100644 index f87b760ec..000000000 --- a/src/typedefs.php +++ /dev/null @@ -1,178 +0,0 @@ - Traversable, -); - -type YAMLMeta = shape( - ?'name' => string, - ?'sources' => vec, - ?'class' => string, - ?'lib' => shape( - 'name' => string, - 'github' => string, - 'composer' => string, - ), - ?'fbonly messages' => vec, - ?'note' => vec, - ?'tip' => vec, - ?'caution' => vec, - ?'danger' => vec, - ?'min-versions' => dict, - ?'experimental' => bool, - ?'namespace' => string, -); - -enum CategoriesHack: string as string { - CLASSES_INTERFACES_TRAITS = 'Classes, Interfaces, Traits'; - CONTROL_FLOW = 'Control Flow'; - GETTING_STARTED = 'Getting Started'; - TYPES_GENERICS = 'Types and Generics'; - ADVANCED_FEATURES = 'Advanced Features'; - EXPERIMENTAL = 'Experimental Additions'; -} - -enum CategoriesHHVM: string as string { - LEARN = 'Learn'; -} - -enum DocumentationSourceType: string { - FILE = 'file'; - ELF_SECTION = 'elf_section'; -} - -enum GuidesProduct: string as string { - HHVM = 'hhvm'; - HACK = 'hack'; -} - -enum RequirableProduct: string as string { - HHVM = 'HHVM'; - HSL = 'HSL'; -} - -enum UIGlyphIcon: string { - BUG = 'bug'; - LEFT = 'angle-double-left fa-2x'; - RIGHT = 'angle-double-right fa-2x'; - SEARCH = 'search'; - LIST = "th-list"; -} - -enum APIDefinitionType: string as string { - CLASS_DEF = 'class'; - TRAIT_DEF = 'trait'; - INTERFACE_DEF = 'interface'; - FUNCTION_DEF = 'function'; -} - -enum APIProduct: string as string { - HACK = 'hack'; - HSL = 'hsl'; - HSL_EXPERIMENTAL = 'hsl-experimental'; -} - -type DocumentationSource = shape( - 'type' => DocumentationSourceType, - 'name' => string, - 'mtime' => int, -); - -type BaseYAML = shape( - 'sources' => vec, - 'type' => APIDefinitionType, - 'data' => shape('name' => string, ...), -); - -type APIIndexEntry = shape( - 'name' => string, - 'htmlPath' => string, - 'urlPath' => string, - ?'methods' => dict, - ... -); - -type APIFunctionIndexEntry = shape( - 'name' => string, - 'htmlPath' => string, - 'urlPath' => string, - 'deprecation' => ?string, -); - -type APIMethodIndexEntry = shape( - 'name' => string, - 'className' => string, - 'classType' => APIDefinitionType, - 'htmlPath' => string, - 'urlPath' => string, -); - -type APIClassIndexEntry = shape( - 'type' => APIDefinitionType, - 'name' => string, - 'htmlPath' => string, - 'urlPath' => string, - 'methods' => dict, -); - -type ProductAPIIndexShape = shape( - 'class' => dict, - 'interface' => dict, - 'trait' => dict, - 'function' => dict, -); - -type APIIndexShape = shape( - APIProduct::HACK => ProductAPIIndexShape, - APIProduct::HSL => ProductAPIIndexShape, - APIProduct::HSL_EXPERIMENTAL => ProductAPIIndexShape, -); - -type StaticResourceMapEntry = shape( - 'localPath' => string, - 'checksum' => string, - 'mtime' => int, - 'mimeType' => string, -); - -/** An enforceable supertype of `NavDataNode`. - * - * Use `NavDataNode` instead if possible. - */ -type NavDataNodeIsh = shape( - 'name' => string, - 'urlPath' => string, - /** actually `dict`, or `dict`, - * but: - * - recursive types aren't allowed - * - dicts aren't enforceable as they have erased generics - */ - 'children' => mixed, -); - -type NavDataNode = shape( - 'name' => string, - 'urlPath' => string, - /* - * This is actually dict but recursive shapes aren't - * allowed. Given we only read this from JS, not a big deal, just be careful - * writing it. - */ - 'children' => dict, -); - -type PaginationDataNode = shape( - 'page' => (string, NavDataNodeIsh), - 'guide' => (string, NavDataNodeIsh), -); diff --git a/src/utils/ExampleTypechecker.php b/src/utils/ExampleTypechecker.php deleted file mode 100644 index f15fb30a5..000000000 --- a/src/utils/ExampleTypechecker.php +++ /dev/null @@ -1,124 +0,0 @@ - { - $source_dir = \dirname($in_file); - await using $tmp_dir = new TemporaryDirectory(); - await using $hh_tmp_dir = new TemporaryDirectory(); - $work_dir = $tmp_dir->getPath(); - - \copy( - $in_file, - $work_dir.'/'.Str\strip_suffix(\basename($in_file), '.type-errors'), - ); - - $hhconfig = \file_exists($in_file.'.hhconfig') - ? \file_get_contents($in_file.'.hhconfig')."\n" - : ''; - if ( - !Str\contains($hhconfig, 'allowed_decl_fixme_codes') && - !Str\contains($hhconfig, 'allowed_fixme_codes_strict') - ) { - $hhconfig .= get_hhconfig_whitelists(); - } - \file_put_contents($work_dir.'/.hhconfig', $hhconfig); - - foreach (\glob($source_dir.'/*.inc.php') as $include_file) { - \copy($include_file, $work_dir.'/'.\basename($include_file)); - } - - $hh_server_path = get_hh_server_path(); - invariant($hh_server_path is nonnull, "Couldn't find hh_server"); - - list($_exit_code, $stdout, $stderr) = await execute_async( - shape( - 'environment' => dict[ - 'HH_TMPDIR' => $hh_tmp_dir->getPath(), - // HHVM_DISABLE_PERSONALITY: `hh_server` tries to disable ASLR via the - // `personality()` syscall, which fails in Docker. - 'HHVM_DISABLE_PERSONALITY' => '1', - ], - ), - $hh_server_path, - '--check', - '--max-procs=1', - '--config', - 'extra_paths='.LocalConfig::ROOT.'/vendor/', - '--config', - // Composer generates .hack files in bin/ that are not hack; by default, - // hack ignores them, but as we're pulling them in via `extra_paths`, we - // need to explicitly ignore them - 'ignored_paths=[".*vendor/bin/.*"]', - $work_dir, - ); - - return tuple($stdout, $stderr); -} - -<<__Memoize>> -function get_hhconfig_whitelists(): string { - $hhconfig = \file_get_contents(LocalConfig::ROOT.'/.hhconfig'); - $ret = ''; - foreach ( - vec[ - re"/^allowed_decl_fixme_codes=.*\$/m", - re"/^allowed_fixme_codes_strict=.*\$/m", - ] as $regex - ) { - $m = Regex\first_match($hhconfig, $regex); - if ($m is nonnull) { - $ret .= $m[0]."\n"; - } - } - return $ret; -} - -<<__Memoize>> -function get_hh_server_path(): ?string { - $hh_server = \dirname(\PHP_BINARY).'/hh_server'; - if (\file_exists($hh_server)) { - return $hh_server; - } - - foreach (Str\split(\getenv('PATH'), ':') as $dir) { - $hh_server = $dir.'/hh_server'; - if (\file_exists($hh_server)) { - return $hh_server; - } - } - return null; -} - -final class TemporaryDirectory implements \IAsyncDisposable { - private string $path; - public function __construct() { - $this->path = \sys_get_temp_dir(). - '/hack-tests-'. - \bin2hex(PseudoRandom\string(16)); - \mkdir($this->path); - } - - public function getPath(): string { - return $this->path; - } - - public async function __disposeAsync(): Awaitable { - await execute_async(null, 'rm', '-rf', '--', $this->path); - } -} diff --git a/src/utils/JSON.php b/src/utils/JSON.php deleted file mode 100644 index ad7fa4d3e..000000000 --- a/src/utils/JSON.php +++ /dev/null @@ -1,49 +0,0 @@ - { - return \json_decode( - $json, - /* assoc = */ true, - /* depth = */ 512, - \JSON_FB_HACK_ARRAYS, - ); -} - -function decode_as_shape(typename $type, string $json): T { - return TypeAssert\matches_type_structure( - \HHVM\UserDocumentation\type_alias_structure($type), - decode_as_dict($json), - ); -} - -function encode_dict(dict $data): string { - return \json_encode( - $data, - \JSON_PRETTY_PRINT | \JSON_UNESCAPED_SLASHES, - /* depth = */ 512, - ); -} - -function encode_shape(typename $type, T $data): string { - return \json_encode( - TypeAssert\matches_type_structure( - \HHVM\UserDocumentation\type_alias_structure($type), - $data, - ), - \JSON_PRETTY_PRINT | \JSON_UNESCAPED_SLASHES, - /* depth = */ 512, - ); -} diff --git a/src/utils/_private/ScopeExit.php b/src/utils/_private/ScopeExit.php deleted file mode 100644 index 27fb0b22a..000000000 --- a/src/utils/_private/ScopeExit.php +++ /dev/null @@ -1,20 +0,0 @@ -callable)(); - } -} diff --git a/src/utils/_private/SuperGlobals.php b/src/utils/_private/SuperGlobals.php deleted file mode 100644 index f8b36c92c..000000000 --- a/src/utils/_private/SuperGlobals.php +++ /dev/null @@ -1,25 +0,0 @@ - { - return TypeCoerce\match>( - \HH\global_get('_ENV'), - ); -} - -/** - * This type is very big. - * Add the keys that you need. - * The more you add, the slower it becomes however. - */ -type TServerVariables = shape( - 'HTTP_HOST' => string, - ... -); - -function server_variables(): TServerVariables { - return \HH\global_get('_SERVER') as TServerVariables; -} diff --git a/src/utils/_private/apc_fetch_or_set_impl.php b/src/utils/_private/apc_fetch_or_set_impl.php deleted file mode 100644 index 80edfb6bb..000000000 --- a/src/utils/_private/apc_fetch_or_set_impl.php +++ /dev/null @@ -1,30 +0,0 @@ -( - string $key, - (function(): Tdata) $fetcher, -): Tdata { - $key .= '!'.LocalConfig::getBuildID(); - $success = false; - $data = \apc_fetch($key, inout $success); - if ($success) { - return $data; - } - - $data = $fetcher(); - \apc_store($key, $data); - return $data; -} diff --git a/src/utils/_private/errno_to_severity.php b/src/utils/_private/errno_to_severity.php deleted file mode 100644 index 8eb4da21b..000000000 --- a/src/utils/_private/errno_to_severity.php +++ /dev/null @@ -1,39 +0,0 @@ -> -function print_short_errors(): _Private\ScopeExit { - $prev = \set_error_handler(( - int $errno, - string $message, - string $path, - int $line, - ) ==> { - $short_path = Str\search_last($path, '/') - |> Str\slice($path, $$ as nonnull + 1); - \fprintf( - \STDERR, - "%s \"%s\" in file \"%s\" at line %d\n", - errno_to_serverity($errno), - $message, - $short_path, - $line, - ); - }); - - return new _Private\ScopeExit(() ==> \set_error_handler($prev)); -} diff --git a/src/utils/apc_fetch_or_set.php b/src/utils/apc_fetch_or_set.php deleted file mode 100644 index dbc9acb03..000000000 --- a/src/utils/apc_fetch_or_set.php +++ /dev/null @@ -1,34 +0,0 @@ -( - classname $class, - (function(): Tdata) $fetcher, -): Tdata { - return _Private\apc_fetch_or_set_raw('class!'.$class, $fetcher); -} - -function apc_fetch_or_set_method_data( - classname $class, - string $method, - (function(): Tdata) $fetcher, -): Tdata { - return _Private\apc_fetch_or_set_raw('fun!'.$class.'::'.$method, $fetcher); -} - -function apc_fetch_or_set_function_data( - string $fun, - (function(): Tdata) $fetcher, -): Tdata { - return _Private\apc_fetch_or_set_raw('fun!'.$fun, $fetcher); -} diff --git a/src/utils/examples/Testfile.txt b/src/utils/examples/Testfile.txt deleted file mode 100644 index 10008b645..000000000 --- a/src/utils/examples/Testfile.txt +++ /dev/null @@ -1,5 +0,0 @@ -A Hack program is made up of a well-formed series of source *tokens* -(such as user-defined names, keywords, operators, punctuators, and literals). -To avoid ambiguity or to make source code more readable, in a source file, -white space characters can be placed before the first token, after the last token, -and between any two adjacent tokens. diff --git a/src/utils/examples/async_mysql_connect.inc.hack b/src/utils/examples/async_mysql_connect.inc.hack deleted file mode 100644 index 5c540287f..000000000 --- a/src/utils/examples/async_mysql_connect.inc.hack +++ /dev/null @@ -1,29 +0,0 @@ -namespace Hack\UserDocumentation\API\Examples\AsyncMysql; - -class ConnectionInfo { - /* - Default values are "localhost", "testuser", database "testdb" and - "testpassword" password. Change the values if you want to use another - configuration. - */ - - public static string $host = "localhost"; - public static int $port = 3306; - public static string $user = "testuser"; - public static string $passwd = "testpassword"; - public static string $db = "testdb"; -} - -/* - -This is the test table too - -CREATE TABLE test_table ( -userID SMALLINT UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT, -name VARCHAR(40) NOT NULL, -age SMALLINT NULL, -email VARCHAR(60) NULL, -PRIMARY KEY (userID) -); - -*/ diff --git a/src/utils/examples/async_mysql_require_env.inc.hack b/src/utils/examples/async_mysql_require_env.inc.hack deleted file mode 100644 index 911f525dd..000000000 --- a/src/utils/examples/async_mysql_require_env.inc.hack +++ /dev/null @@ -1,14 +0,0 @@ -namespace Hack\UserDocumentation\API\Examples\AsyncMysql; - -use type Hack\UserDocumentation\API\Examples\AsyncMysql\ConnectionInfo as CI; - -async function skipif_async(): Awaitable { - \init_docs_autoloader(); - - $pool = new \AsyncMysqlConnectionPool(darray[]); - try { - await $pool->connect(CI::$host, CI::$port, CI::$db, CI::$user, CI::$passwd); - } catch (\AsyncMysqlConnectException $_) { - die('skip'); - } -} diff --git a/src/utils/examples/mcrouter_skipif.inc.hack b/src/utils/examples/mcrouter_skipif.inc.hack deleted file mode 100644 index c108f88cd..000000000 --- a/src/utils/examples/mcrouter_skipif.inc.hack +++ /dev/null @@ -1,29 +0,0 @@ -namespace Hack\UserDocumentation\API\Examples\MCRouter; - -function skipif(): void { - if (!\extension_loaded('mcrouter') || !\extension_loaded('memcached')) { - echo 'skip'; - return; - } - - // e.g., export HHVM_TEST_MCROUTER=127.0.0.1:11211 - if (!\getenv('HHVM_TEST_MCROUTER')) { - echo 'skip'; - return; - } - - $memc = new \Memcached(); - $memc->addServer('localhost', 11211); - $version = $memc->getVersion(); - if (!$version) { - echo "SKIP No Memcached running"; - return; - } - - try { - $servers = Vector { \getenv('HHVM_TEST_MCROUTER') }; - \MCRouter::createSimple($servers); - } catch (\Exception $ex) { - echo 'skip'; - } -} diff --git a/src/utils/examples/md.md_render.inc.hack b/src/utils/examples/md.md_render.inc.hack deleted file mode 100644 index 8ffaaa058..000000000 --- a/src/utils/examples/md.md_render.inc.hack +++ /dev/null @@ -1,5 +0,0 @@ -namespace HHVM\UserDocumentation\Guides\Hack\XHP\Interfaces\Md; - -function md_render(string $md_source): string { - return \htmlspecialchars($md_source); -} diff --git a/src/utils/examples/unpromotion.inc.hack b/src/utils/examples/unpromotion.inc.hack deleted file mode 100644 index ec40d1817..000000000 --- a/src/utils/examples/unpromotion.inc.hack +++ /dev/null @@ -1,9 +0,0 @@ -// not relevant for the guide but needed for typechecking - -namespace HHVM\UserDocumentation\Guides\Hack\Classes\Constructors\Unpromotion; - -final class ParsedName {} - -function parse_name(string $_name): ParsedName { - return new ParsedName(); -} diff --git a/src/utils/execute_async.php b/src/utils/execute_async.php deleted file mode 100644 index c8d9ed5ca..000000000 --- a/src/utils/execute_async.php +++ /dev/null @@ -1,62 +0,0 @@ - string, - ?'environment' => dict, -); - -// A wrapper around the built-in exec with a nicer signature. -async function execute_async( - ?SubprocessOptions $options, - string ...$args -): Awaitable<(int, string, string)> { - $command = $args - |> Vec\map($$, $arg ==> \escapeshellarg($arg)) - |> Str\join($$, ' '); - - $spec = darray[ - 0 => varray['pipe', 'r'], - 1 => varray['pipe', 'w'], - 2 => varray['pipe', 'w'], - ]; - $pipes = varray[]; - - $proc = \proc_open( - $command, - $spec, - inout $pipes, - $options['working_directory'] ?? null, - $options['environment'] ?? null, - ); - - list($stdin, $stdout, $stderr) = $pipes; - \fclose($stdin); - \stream_set_blocking($stdout, false); - - $exit_code = -2; - $output = ''; - while (true) { - $chunk = \stream_get_contents($stdout); - $output .= $chunk; - $status = \proc_get_status($proc); - if ($status['pid'] && !$status['running']) { - $exit_code = $status['exitcode']; - break; - } - /* HHAST_IGNORE_ERROR[DontAwaitInALoop] */ - await \stream_await($stdout, \STREAM_AWAIT_READ | \STREAM_AWAIT_ERROR); - } - $output .= \stream_get_contents($stdout); - $error_output = \stream_get_contents($stderr); - \fclose($stdout); - \fclose($stderr); - - // Always returns -1 if we called `proc_get_status` first - \proc_close($proc); - - return tuple($exit_code, $output, $error_output); -} diff --git a/src/utils/extract_tar.hack b/src/utils/extract_tar.hack deleted file mode 100644 index 496dfbfeb..000000000 --- a/src/utils/extract_tar.hack +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright (c) 2004-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -namespace HHVM\UserDocumentation\Util; - -use namespace HH\Lib\Str; - -enum TarEntryType: int { - FILE = 0; - SYMLINK = 1; - DIRECTORY = 2; -} - -type TarEntryMetadata = shape( - 'type' => TarEntryType, - 'mode' => int, - 'timestamp' => int, - 'path' => string, -); - -/** Parse a tar file, executing a callback for every thing inside it. - * - * This function is derived from HHVM 3's Phar handling, which is no longer - * present. - */ -function parse_tar( - string $tar, - (function(TarEntryMetadata, ?string): void) $callback, -): void { - $len = Str\length($tar); - $pos = new \HH\Lib\Ref(0); - $consume = (int $bytes) ==> { - $wanted = Str\slice($tar, $pos->value, $bytes); - $pos->value += $bytes; - return $wanted; - }; - /* If you have GNU Tar installed, you should be able to find - * the file format documentation (including header byte offsets) at: - * - /usr/include/tar.h - * - the tar info page (Top/Tar Internals/Standard) - */ - - $next_file_name = null; - $mode = null; - while ($pos->value < $len) { - $header = $consume(512); - // skip empty blocks - if (!\trim($header)) { - continue; - } - - $filename = \trim(\substr($header, 0, 100)); - if ($next_file_name) { - $filename = $next_file_name; - $next_file_name = null; - } - - $mode = \octdec(\substr($header, 100, 7)); - $size = \octdec(\substr($header, 124, 12)); - $timestamp = \octdec(\trim(\substr($header, 136, 12))); - $type = $header[156]; - - $entry_type = null; - $entry_content = null; - - switch ($type) { - case 'L': - invariant( - $filename === '././@LongLink', - "Expected magic filename '././@LongLink' for long file ". - "name, got %s instead", - $filename, - ); - $next_file_name = \trim($consume($size)); - break; - - case '0': - case "\0": - $entry_type = TarEntryType::FILE; - $entry_content = $consume($size); - break; - - case '2': - // Assuming this is from GNU Tar - $target = \trim(\substr($header, 157, 100), "\0"); - - $entry_type = TarEntryType::SYMLINK; - $entry_content = $target; - break; - case '5': - $entry_type = TarEntryType::DIRECTORY; - break; - case 'g': - // Global header of the form "BYTECOUNT key=value"; github sends us - // tarballs with comment=COMMIT_HASH; just ignore it. - $consume($size); - break; - case 'x': - // Extended header, see https://tinyurl.com/pax-extended-header. - list($_, $extended_header_content) = Str\split($consume($size), ' ', 2); - list($key, $value) = Str\split($extended_header_content, '=', 2); - $value = Str\trim_right($value, "\n"); - switch ($key) { - case 'path': - $next_file_name = $value; - break; - default: - throw - new \Exception("Tar extended header '$key' is not implemented"); - } - break; - default: - throw new \Exception("Tar entry type '$type' is not implemented"); - } - - if ($entry_type !== null) { - $callback( - shape( - 'type' => $entry_type, - 'mode' => - $mode ?? ($entry_type === TarEntryType::DIRECTORY ? 0755 : 0644), - 'timestamp' => $timestamp, - 'path' => $filename, - ), - $entry_content, - ); - } - if ($size % 512 !== 0) { - $leftover = 512 - ($size % 512); - $zeroes = $consume($leftover); - if (\strlen(\trim($zeroes)) !== 0) { - throw new \Exception("Malformed tar. Padding isn't zeros. $zeroes"); - } - } - } -} diff --git a/src/utils/get_fb_ip_ranges.php b/src/utils/get_fb_ip_ranges.php deleted file mode 100644 index bfe85f02c..000000000 --- a/src/utils/get_fb_ip_ranges.php +++ /dev/null @@ -1,78 +0,0 @@ - vec, - 'ipv6' => vec, -); - -type TIPRangesJSON = shape( - 'ipv4' => vec, - 'ipv6' => vec, -); - -function cidr_to_bitstring_and_bitmask(string $cidr): (string, string) { - list($addr, $bits) = Str\split($cidr, '/'); - $bits = (int)$bits; - $addr = \inet_pton($addr); - - $mask = Str\repeat("\xff", \intdiv($bits, 8)); - $bits = $bits % 8; - if ($bits !== 0) { - $mask .= \chr(((1 << $bits) - 1) << (8 - $bits)); - } - $mask .= Str\repeat("\x00", Str\length($addr) - Str\length($mask)); - return tuple($addr, $mask); -} - -function is_ip_in_range(string $ip, (string, string) $range): bool { - $addr_bitstring = \inet_pton($ip); - list($range_bitstring, $range_bitmask) = $range; - /* HH_IGNORE_ERROR[4110] bitwise & on strings - Typechecker remains quiet since $addr_bitstring is a TAny - but $range_bimask is a string.*/ - return ($addr_bitstring & $range_bitmask) === $range_bitstring; -} - -function get_fb_ip_ranges(): TIPRanges { - return apc_fetch_or_set_function_data( - __FUNCTION__, - () ==> { - $raw_data = \file_get_contents(BuildPaths::FB_IP_RANGES_JSON) - |> JSON\decode_as_shape(TIPRangesJSON::class, $$); - - $ipv4 = Vec\map( - $raw_data['ipv4'], - $cidr ==> cidr_to_bitstring_and_bitmask($cidr), - ); - $ipv6 = Vec\map( - $raw_data['ipv6'], - $cidr ==> cidr_to_bitstring_and_bitmask($cidr), - ); - - return shape('ipv4' => $ipv4, 'ipv6' => $ipv6); - }, - ); -} - -function is_fb_ip_address(string $ip): bool { - $ranges = get_fb_ip_ranges(); - return C\any( - Vec\concat($ranges['ipv4'], $ranges['ipv6']), - $range ==> is_ip_in_range($ip, $range), - ); -} diff --git a/src/utils/type_alias_structure.php b/src/utils/type_alias_structure.php deleted file mode 100644 index 6eebbd475..000000000 --- a/src/utils/type_alias_structure.php +++ /dev/null @@ -1,16 +0,0 @@ -(typename $typename): TypeStructure { - return /* HH_IGNORE_ERROR[4104] */ type_structure($typename); -} diff --git a/terraform.tfvars b/terraform.tfvars new file mode 100644 index 000000000..e66b3e936 --- /dev/null +++ b/terraform.tfvars @@ -0,0 +1 @@ +container_image = "hhvm/user-documentation:HHVM-4.164-2024-02-08-d8c2ed8" diff --git a/tests/APINavDataTest.php b/tests/APINavDataTest.php deleted file mode 100644 index 303191d0e..000000000 --- a/tests/APINavDataTest.php +++ /dev/null @@ -1,45 +0,0 @@ -getNavData()['Classes']['children']; - $have_ns_separator = false; - foreach ($classes as $node) { - /* HH_FIXME[4110] need reified/enforceable */ - $node = (($x): NavDataNode ==> $x)($node); - if (\strpos($node['name'], "HH\\") === 0) { - $have_ns_separator = true; - break; - } - } - expect($have_ns_separator)->toBeTrue(); - } - - public function testNamespacedDefinitionURL(): void { - $classes = APINavData::get(APIProduct::HACK) - ->getNavData()['Classes']['children']; - - $have_ns_separator = false; - foreach ($classes as $node) { - /* HH_FIXME[4110] need reified/enforceable */ - $node = (($x): NavDataNode ==> $x)($node); - if (\strpos($node['name'], "HH\\") === 0) { - $have_ns_separator = true; - - $url_pattern = \strtr($node['name'], "\\", '.'); - expect($node['urlPath'])->toContainSubstring($url_pattern); - break; - } - } - expect($have_ns_separator)->toBeTrue(); - } -} diff --git a/tests/APIPagesTest.php b/tests/APIPagesTest.php deleted file mode 100644 index 63d20d594..000000000 --- a/tests/APIPagesTest.php +++ /dev/null @@ -1,243 +0,0 @@ - { - $to_visit = \array_values(APINavData::get(APIProduct::HACK)->getNavData()); - $out = vec[]; - - while (!C\is_empty($to_visit)) { - $node = \array_pop(inout $to_visit); - foreach ($node['children'] as $child) { - $to_visit[] = $child; - } - $node['children'] = varray[]; // make failure output easier to read - $out[] = tuple($node['urlPath'], $node); - } - return $out; - } - - public function shortListOfAPIPages(): vec<(string, NavDataNode)> { - $wanted = Set { - '/hack/reference/class/', // index - '/hack/reference/class/AsyncMysqlClient/', // class - '/hack/reference/class/AsyncMysqlConnection/queryf/', // method - '/hack/reference/function/hphp_array_idx/', // function - '/hack/reference/class/HH.Asio.WrappedResult/', // namespaced - }; - $all = self::allAPIPages(); - $out = vec[]; - foreach ($all as $tuple) { - list($_, $node) = $tuple; - if ($wanted->contains($node['urlPath'])) { - $out[] = tuple($node['urlPath'], $node); - } - } - expect(\count($out))->toBeSame(\count($wanted)); - - // Not included in the API Nav bar, but test it too :) - $out[] = tuple( - '/hack/reference/', - shape( - 'urlPath' => '/hack/reference/', - 'name' => 'Hack APIs', - 'children' => dict[], - ), - ); - return $out; - } - - /** - * @large - */ - <> - public async function testAPIPage( - string $name, - NavDataNode $node, - ): Awaitable { - await $this->testAPIPageQuick($name, $node); - } - - <> - public async function testAPIPageQuick( - string $_, - NavDataNode $node, - ): Awaitable { - list($response, $body) = await PageLoader::getPageAsync($node['urlPath']); - expect($response->getStatusCode())->toBeSame(200); - - // Top-level pages don't contain their own name in the output - eg 'Classes' - // is 'Class Reference' - $blacklist = (new Set(APIDefinitionType::getValues()))->map( - $x ==> APINavData::get(APIProduct::HACK)->getRootNameForType($x), - ); - if (!$blacklist->contains($node['name'])) { - expect($body)->toContainSubstring($node['name']); - } - } - - public async function testMethodDeprecated(): Awaitable { - list($_, $body) = await PageLoader::getPageAsync( - '/hack/reference/class/HH.Vector/fromArray/', - ); - - expect($body)->toContainSubstring('Deprecated'); - } - - public async function testNullableTypeMerged(): Awaitable { - list($_, $body) = await PageLoader::getPageAsync( - '/hack/reference/class/HH.Vector/firstValue/', - ); - - expect($body)->toContainSubstring('?Tv'); - } - - public function getDoNotDocument(): vec<(string, APIDefinitionType)> { - $classes = vec[ - // vec/dict/keyset are not classes; with HH prefix, they shouldn't exist - 'vec', - 'HH\\vec', - 'dict', - 'HH\\dict', - 'keyset', - 'HH\\keyset', - // PHP classes - 'DOMElement', - 'IntlDateFormatter', - 'SimpleXMLElement', - 'stdClass', - // Explicitly excluded classes - '__PHP_Incomplete_Class', - 'LazyIterable', - 'LazyMapKeyedIterator', - 'WaitHandle', - ] - |> Vec\map($$, $x ==> tuple($x, APIDefinitionType::CLASS_DEF)); - - $functions = vec[ - // Very unsupported - 'type_structure', - 'HH\\type_structure', - // PHP functions - 'abs', - 'array_slice', - 'datefmt_create', - 'dom_document_save_html', - 'drawline', - 'intlcal_get', - 'memcache_get', - 'mysql_query', - 'pg_exec', - // Explicitly excluded functions - '_', - '__hhvm_intrinsics.id_string', - - ] - |> Vec\map($$, $x ==> tuple($x, APIDefinitionType::FUNCTION_DEF)); - - return Vec\concat($classes, $functions); - } - - <> - public async function testDoesNotDocument( - string $name, - APIDefinitionType $type, - ): Awaitable { - switch ($type) { - case APIDefinitionType::CLASS_DEF: - case APIDefinitionType::TRAIT_DEF: - case APIDefinitionType::INTERFACE_DEF: - $url = URLBuilder::getPathForClass( - APIProduct::HACK, - shape('name' => $name, 'type' => $type), - ); - break; - case APIDefinitionType::FUNCTION_DEF: - $url = URLBuilder::getPathForFunction( - APIProduct::HACK, - shape('name' => $name), - ); - break; - } - list($response, $_) = await PageLoader::getPageAsync($url); - expect($response->getStatusCode())->toBeSame( - 404, - \sprintf('"%s" should not be documented', $name), - ); - } - - public function getPagesWithExamples(): vec> { - $root = LocalConfig::ROOT.'/api-examples'; - $urls = keyset[]; - foreach (\glob($root.'/class.*/*') as $dir) { - $urls[] = Str\replace($dir, $root.'/class.', 'class/'); - } - foreach (\glob($root.'/function.*') as $dir) { - $urls[] = Str\replace($dir, $root.'/function.', 'function/'); - } - return Vec\map( - $urls, - $url ==> vec[Str\format( - '/%s/reference/%s/', - Str\contains($url, '/HH.Lib.') ? 'hsl' : 'hack', - Str\strip_suffix($url, '.md'), - )], - ); - } - - <> - public async function testExamples(string $url): Awaitable { - list($response, $body) = await PageLoader::getPageAsync($url); - expect($response->getStatusCode()) - ->toBeSame(200, 'Examples provided for non-existent page %s.', $url); - expect(Str\contains($body, '')) - ->toBeTrue('Missing examples at %s.', $url); - } - - public async function testGuideLinks(): Awaitable { - // page with 1 guide - $url = '/hack/reference/class/HH.AsyncGenerator/'; - list($_, $body) = await PageLoader::getPageAsync($url); - expect(Str\contains($body, '')) - ->toBeTrue('Missing guide link at %s.', $url); - - // page with multiple guides - $url = '/hack/reference/class/AsyncMysqlQueryResult/'; - list($_, $body) = await PageLoader::getPageAsync($url); - expect(Str\contains($body, '')) - ->toBeTrue('Missing guide links at %s.', $url); - } - - public async function testMessagesForFBWWW(): Awaitable { - // Not HSL - list($_, $body) = await PageLoader::getPageAsync('/hack/reference/class/HH.AsyncGenerator/'); - expect($body)->toNotContainSubstring('www repository'); - - // Function - list($_, $body) = await PageLoader::getPageAsync('/hsl/reference/function/HH.Lib.C.contains/'); - expect($body)->toContainSubstring('This is available as C\\contains in the www repository'); - - // Class - list($_, $body) = await PageLoader::getPageAsync('/hsl/reference/class/HH.Lib.Async.Poll/'); - expect($body)->toContainSubstring('This is available as Async\\Poll in the www repository'); - - // Method - // This autolinks because - unlike the previous tests - the target is not the current page. - list($_, $body) = await PageLoader::getPageAsync('/hsl/reference/class/HH.Lib.Async.Poll/add/'); - expect($body)->toMatchRegExp('#The containing class is available as ]+>Async\\\\Poll in the www repository#'); - } -} diff --git a/tests/AutoLinkifyAPITest.php b/tests/AutoLinkifyAPITest.php deleted file mode 100644 index 776225159..000000000 --- a/tests/AutoLinkifyAPITest.php +++ /dev/null @@ -1,82 +0,0 @@ - { - return dict[ - 'Hack class' => tuple( - '/hack/asynchronous-operations/extensions', - 'MCRouter', - '/hack/reference/class/MCRouter/', - ), - 'Namespaced Hack function' => tuple( - '/hack/asynchronous-operations/extensions', - 'HH\Asio\curl_exec', - '/hack/reference/function/HH.Asio.curl_exec/', - ), - 'Hack fully-qualified method' => tuple( - '/hack/reference/class/AsyncMysqlConnectResult/elapsedMicros/', - 'AsyncMysqlConnection::connectResult', - '/hack/reference/class/AsyncMysqlConnection/connectResult/', - ), - 'Hack method with incomplete name from class doc' => tuple( - '/hack/reference/class/AsyncMysqlClient/', - 'connect()', - '/hack/reference/class/AsyncMysqlClient/connect/', - ), - 'Hack method with incomplete name from method doc' => tuple( - '/hack/reference/class/AsyncMysqlConnection/query/', - 'escapeString()', - '/hack/reference/class/AsyncMysqlConnection/escapeString/', - ), - 'Hack function with parameter information' => tuple( - '/hack/asynchronous-operations/utility-functions', - 'HH\Asio\wrap(Awaitable)', - '/hack/reference/function/HH.Asio.wrap/', - ), - 'Hack class with type parameter' => tuple( - '/hack/reference/class/HH.ImmSet/skip/', - 'ImmSet', - '/hack/reference/class/HH.ImmSet/', - ), - 'Hack class method with missing HH namespace' => tuple( - '/hack/reference/function/HH.Asio.vm/', - 'Vector::map()', - '/hack/reference/class/HH.Vector/map/', - ), - 'Default Namespace' => tuple( - '/hack/asynchronous-operations/awaitables', - 'join', - '/hack/reference/function/HH.Asio.join/', - ), - ]; - } - - <> - public async function testAutoLinkify( - string $source, - string $keyword, - string $dest, - ): Awaitable { - list($_page, $body) = await PageLoader::getPageAsync($source); - - $dom = new \DOMDocument(); - $dom->loadHTML($body); - $xpath = new \DOMXPath($dom); - - $nodes = $xpath->query( - '//a[@href = "'.$dest.'"]'.'/code[text() = "'.$keyword.'"]', - ); - expect($nodes->length)->toBeGreaterThanOrEqualTo( - 1, - 'Expected %s to link to %s', - $keyword, - $dest, - ); - } -} diff --git a/tests/DocBlockTest.php b/tests/DocBlockTest.php deleted file mode 100644 index 53410706e..000000000 --- a/tests/DocBlockTest.php +++ /dev/null @@ -1,117 +0,0 @@ -getDocComment()); - } - - /** Foo */ - public function testOneLiner(): void { - expect(self::getDocBlock(__FUNCTION__)->getSummary())->toBeSame('Foo'); - } - - /** Foo. */ - public function testOneLinerWithPunctuation(): void { - expect(self::getDocBlock(__FUNCTION__)->getSummary())->toBeSame('Foo'); - } - - /** - * Foo - * - * Do bar. - */ - public function testSummaryAndDescriptionWithoutPunctuation(): void { - $db = self::getDocBlock(__FUNCTION__); - expect($db->getSummary())->toBeSame('Foo'); - expect($db->getDescription())->toBeSame('Do bar.'); - } - - /** - * Foo. - * - * Do bar. - */ - public function testSummaryAndDescriptionWithPunctuation(): void { - $db = self::getDocBlock(__FUNCTION__); - expect($db->getSummary())->toBeSame('Foo'); - expect($db->getDescription())->toBeSame('Do bar.'); - } - - /** Foo. Do bar. */ - public function testSummaryAndDescriptionOneLiner(): void { - $db = self::getDocBlock(__FUNCTION__); - expect($db->getSummary())->toBeSame('Foo'); - expect($db->getDescription())->toBeSame('Do bar.'); - } - - /** Foo. - * - * Bar. - * - * @param int $everything foo bar - * @param $no_type herp derp - * @param $multi_line herp - * derp - * @param $nothing - * @param dict $generics - * @param dict $generics_and_text foo bar - */ - public function testHasParams(): void { - $db = self::getDocBlock(__FUNCTION__); - expect($db->getSummary())->toBeSame('Foo'); - expect($db->getDescription())->toBeSame('Bar.'); - - $params = Vec\map( - $db->getParameterInfo(), - $p ==> tuple($p['name'], $p['types'], $p['text']), - ); - - expect($params)->toBeSame( - vec[ - tuple('$everything', vec['int'], 'foo bar'), - tuple('$no_type', vec[], 'herp derp'), - tuple('$multi_line', vec[], "herp\nderp"), - tuple('$nothing', vec[], null), - tuple('$generics', vec['dict'], null), - tuple('$generics_and_text', vec['dict'], 'foo bar'), - ], - ); - } - - /** - * @param int|dict|string $foo - */ - public function testMultipleParamTypes(): void { - $params = Vec\map( - self::getDocBlock(__FUNCTION__)->getParameterInfo(), - $p ==> tuple($p['name'], $p['types'], $p['text']), - ); - expect($params)->toBeSame(vec[ - tuple('$foo', vec['int', 'dict', 'string'], null), - ]); - } - - /** foo `shape(...)` bar */ - public function testEllipsisSummary(): void { - expect(self::getDocBlock(__FUNCTION__)->getSummary()) - ->toBeSame('foo `shape(...)` bar'); - } -} diff --git a/tests/GuidePagesTest.php b/tests/GuidePagesTest.php deleted file mode 100644 index cfd611061..000000000 --- a/tests/GuidePagesTest.php +++ /dev/null @@ -1,92 +0,0 @@ - { - $to_visit = \array_values(GuidesNavData::getNavData()); - $out = vec[]; - - while (!C\is_empty($to_visit)) { - $node = \array_pop(inout $to_visit); - foreach ($node['children'] as $child) { - $to_visit[] = $child; - } - $out[] = tuple($node['name'], $node['urlPath']); - } - - return $out; - } - - /** - * @large - */ - <> - public async function testGuidePage( - string $name, - string $path, - ): Awaitable { - await $this->testGuidePageQuick($name, $path); - } - - public function shortListOfGuidePages(): vec<(string, string)> { - return vec[ - // Root of a guide - tuple('Getting Started', '/hack/overview/'), - // First page of a guide - tuple('Types: Introduction', '/hack/overview/typing'), - // Last page of a guide - tuple('Asynchronous Operations: Exceptions', '/hack/async/exceptions'), - // Spaces - tuple( - 'Classes: Constructors', - '/hack/other-features/constructor-parameter-promotion', - ), - ]; - } - - <> - public async function testGuidePageQuick( - string $name, - string $path, - ): Awaitable { - list($response, $body) = await PageLoader::getPageAsync($path); - - // /hack/foo/ => /hack/foo/introduction - if ($response->getStatusCode() === 301) { - list($response, $body) = await PageLoader::getPageAsync( - $response->getHeaderLine('Location'), - ); - } - - expect($response->getStatusCode())->toBeSame(200); - expect($body)->toContainSubstring($name); - } - - <> - public async function testExamplesRender(): Awaitable { - list($response, $body) = await PageLoader::getPageAsync( - '/hack/source-code-fundamentals/namespaces', - ); - expect($response->getStatusCode())->toBeSame(200); - - expect($body)->toContainSubstring('highlight'); - expect($body)->toContainSubstring( - 'namespace NS1', - ); - } - - <> - public async function testGeneratedGuidesRender(): Awaitable { - list($response, $body) = await PageLoader::getPageAsync( - '/hhvm/configuration/INI-settings', - ); - expect($response->getStatusCode())->toBeSame(200); - expect($body)->toContainSubstring('allow_url_fopen'); - } -} diff --git a/tests/HTTPSEnforcementTest.php b/tests/HTTPSEnforcementTest.php deleted file mode 100644 index 617d1c7a9..000000000 --- a/tests/HTTPSEnforcementTest.php +++ /dev/null @@ -1,53 +0,0 @@ -> - public async function testNoEnforcementByDefault(): Awaitable { - list($response, $_) = await PageLoader::getPageAsync( - 'http://example.com/hack/reference/', - ); - expect($response->getStatusCode())->toBeSame(200); - } - - public function httpsDomains(): vec<(string)> { - return vec[tuple('docs.hhvm.com'), tuple('staging.docs.hhvm.com')]; - } - - <> - public async function testEnforcedOnDomain(string $domain): Awaitable { - list($response, $_) = await PageLoader::getPageAsync( - 'http://'.$domain.'/hack/reference/', - ); - expect($response->getStatusCode())->toBeSame(301); - - $location = $response->getHeaderLine('Location'); - expect($location)->toBeSame('https://'.$domain.'/hack/reference/'); - - list($response, $_) = await PageLoader::getPageAsync($location); - expect($response->getStatusCode())->toBeSame(200); - - $hsts = $response->getHeaderLine('Strict-Transport-Security'); - expect($hsts)->toContainSubstring('max-age='); - expect($hsts)->toNotBeSame('max-age=0'); - } - - <> - public async function testNotEnforcedOnRobotsTxt(): Awaitable { - list($response, $_) = await PageLoader::getPageAsync( - 'http://docs.hhvm.com/robots.txt', - ); - expect($response->getStatusCode())->toBeSame(200); - } - - <> - public async function test404Status(): Awaitable { - list($response, $_) = await PageLoader::getPageAsync( - 'http://docs.hhvm.com/__idonotexist_fortesting', - ); - expect($response->getStatusCode())->toBeSame(404); - } -} diff --git a/tests/IPUtilsTest.php b/tests/IPUtilsTest.php deleted file mode 100644 index 535b547f1..000000000 --- a/tests/IPUtilsTest.php +++ /dev/null @@ -1,109 +0,0 @@ -> - public function testIsInSubnet( - string $subnet_cidr, - vec $ips_in_subnet, - vec $ips_not_in_subnet, - ): void { - $range = cidr_to_bitstring_and_bitmask($subnet_cidr); - - foreach ($ips_in_subnet as $ip) { - expect(is_ip_in_range($ip, $range))->toBeTrue( - '%s is not in %s, but should be; subnet: %s, subnet mask: %s', - $ip, - $subnet_cidr, - \inet_ntop($range[0]), - \inet_ntop($range[1]), - ); - } - foreach ($ips_not_in_subnet as $ip) { - expect(is_ip_in_range($ip, $range))->toBeFalse( - '%s is in %s, but should not be; subnet: %s, subnet mask: %s', - $ip, - $subnet_cidr, - \inet_ntop($range[0]), - \inet_ntop($range[1]), - ); - } - } - - public function getSubnetExamples( - ): vec<(string, vec, vec)> { - return vec[ - tuple( - '10.0.0.0/8', - vec['10.0.0.1', '10.0.0.255', '10.255.255.255'], - vec['127.0.0.1', '0.0.0.0', '10::', '9.0.0.1', '11.0.0.0'], - ), - tuple( - '10.0.0.0/23', - vec['10.0.0.1', '10.0.1.1', '10.0.1.255'], - vec['10.0.10.1', '10.0.2.1'], - ), - tuple( - '10.0.0.0/22', - vec['10.0.0.1', '10.0.1.1', '10.0.1.255', '10.0.3.255'], - vec['10.0.10.1', '10.0.4.0'], - ), - tuple('199.201.64.0/24', vec['199.201.64.123'], vec['127.0.0.1']), - tuple( - 'abcd::0/16', - vec['abcd::1', 'abcd:1::0', 'abcd::'], - vec['0.0.0.0', 'abce::1', 'abc::0'], - ), - tuple('2620:10d:c092::/48', vec['2620:10d:c092::123'], vec['::0']), - ]; - } - - public function getExampleFacebookIPAddresses(): vec<(string)> { - return vec[tuple('199.201.64.1'), tuple('2620:10d:c092::1')]; - } - - public function getExampleNonFacebookIPAddresses(): vec<(string)> { - return vec[ - tuple('192.168.0.1'), - tuple('127.0.0.1'), - tuple('::1'), - tuple('dead:beef::1'), - ]; - } - - <> - public function testIsFacebookIPAddress(string $ip): void { - if (Str\ends_with(\php_uname('n'), '.facebook.com')) { - static::markTestSkipped("Can't run on FB infra"); - } - expect(is_fb_ip_address($ip))->toBeTrue(); - } - - <> - public function testIsNonFacebookIPAddress(string $ip): void { - if (Str\ends_with(\php_uname('n'), '.facebook.com')) { - static::markTestSkipped("Can't run on FB infra"); - } - expect(is_fb_ip_address($ip))->toBeFalse(); - } -} diff --git a/tests/InternalLinksTest.php b/tests/InternalLinksTest.php deleted file mode 100644 index 590d54089..000000000 --- a/tests/InternalLinksTest.php +++ /dev/null @@ -1,212 +0,0 @@ -> - public async function testInternalLink( - string $target, - vec $sources, - ): Awaitable { - list($response, $_body) = await PageLoader::getPageAsync($target); - if ($response->getStatusCode() === 301) { - $target = $response->getHeaderLine('Location'); - list($response, $_body) = await PageLoader::getPageAsync($target); - } - - $sources = new Set($sources); - - expect($response->getStatusCode())->toBeSame( - 200, - \sprintf( - ">>> %d: %s\n>>> Linked from:\n%s", - $response->getStatusCode(), - $target, - \implode("\n", $sources->map($x ==> '>>> - '.$x)), - ), - ); - } - - public async function testDoesNotBreakExternalMarkdownLinks( - ): Awaitable { - list($_response, $body) = await PageLoader::getPageAsync( - '/hack/getting-started/tools', - ); - expect($body) - ->toContainSubstring('href="https://github.com/hhvm/hack-mode"'); - } - - public async function testCanGetLinksList(): Awaitable { - $_ = $this->internalLinksList(); - } - - - <<__Memoize>> - public function internalLinksList(): vec<(string, vec)> { - PageLoader::assertLocal(); - $loaders = Map {}; - - $api_pages = APIPagesTest::allAPIPages(); - foreach ($api_pages as $call) { - list($_, $node) = $call; - $url = $node['urlPath']; - $loaders[$url] = $this->getInternalLinksOnPageAsync($url); - } - - $guide_pages = GuidePagesTest::allGuidePages(); - foreach ($guide_pages as $call) { - list($_, $url) = $call; - $loaders[$url] = $this->getInternalLinksOnPageAsync($url); - } - - $urls = \HH\Asio\join(\HH\Asio\m($loaders)); - - $targets_to_sources = Map {}; - foreach ($urls as $source => $targets) { - foreach ($targets as $target) { - if (!$targets_to_sources->containsKey($target)) { - $targets_to_sources[$target] = vec[]; - } - $targets_to_sources[$target][] = $source; - } - } - - $ret = vec[]; - foreach ($targets_to_sources as $target => $sources) { - $ret[] = tuple($target, $sources); - } - - return $ret; - } - - <<__Memoize>> - private async function getInternalLinksOnPageAsync( - string $page, - ): Awaitable> { - PageLoader::assertLocal(); - - list($response, $body) = await PageLoader::getPageAsync($page); - - if ($response->getStatusCode() === 301) { - return await $this->getInternalLinksOnPageAsync( - $response->getHeaderLine('Location'), - ); - } - - expect($response->getStatusCode())->toBeSame(200, $page); - - $dom = new \DOMDocument(); - \libxml_use_internal_errors(true); // No support for HTML5 tags - $dom->loadHTML($body); - \libxml_clear_errors(); - $xpath = new \DOMXPath($dom); - $hrefs = $xpath->query('//a/@href'); - - $links = Vector {}; - foreach ($hrefs as $node) { - $url = $node->value; - - $host = \parse_url($url, \PHP_URL_HOST); - if ($host !== null) { - continue; - } - - $path = $this->normalizePath($page, \parse_url($url, \PHP_URL_PATH)); - if ($path === null) { - continue; - } - - $links[] = $path; - } - return $links; - } - - public function pathNormalizationTestCases( - ): vec<(string, string, string)> { - return vec[ - tuple('/foo/bar', '/baz', '/baz'), - tuple('/foo/bar', './baz', '/foo/baz'), - tuple('/foo/bar/', './baz', '/foo/bar/baz'), - tuple('/foo/bar', '../baz', '/baz'), - tuple('/foo/bar/', '../baz', '/foo/baz'), - tuple('/foo/bar/baz/', '../../herp', '/foo/herp'), - tuple('/foo/bar/baz', '../../herp', '/herp'), - tuple('/foo/bar', 'herp/derp', '/foo/herp/derp'), - tuple('/foo/bar/', 'herp/derp', '/foo/bar/herp/derp'), - ]; - } - - /** - * - * Testing the test... - */ - <> - public async function testPathNormalization( - string $context, - string $in, - ?string $expected, - ): Awaitable { - $out = $this->normalizePath($context, $in); - expect($out)->toBeSame($expected); - } - - private function normalizePath(string $source, ?string $path): ?string { - if ($path === null) { - return $path; - } - - if ($path[0] === '/') { - return $path; - } - - $in_dir = \substr($source, -1) === '/'; - - if (\substr($path, 0, 2) === './') { - if ($in_dir) { - // /foo/bar/ + ./baz => /foo/bar/baz - $context = $source; - } else { - // /foo/bar + ./baz => /foo/baz - $context = \dirname($source); - if ($context !== '/') { - $context .= '/'; - } - } - return $context.\substr($path, 2); - } - - if (\substr($path, 0, 3) === '../') { - if ($in_dir) { - // /foo/bar/ + ../baz => /foo/baz - $context = \dirname($source); - } else { - // /foo/bar + ../baz => /baz - $context = \dirname(\dirname($source)); - } - if ($context !== '/') { - $context .= '/'; - } - $path = $context.\substr($path, 3); - - while (\strpos($path, '/../') !== false) { - $path = \preg_replace('_/[^/]+/\.\./_', '/', $path); - } - return $path; - } - - if ($path[0] !== '.') { - if ($in_dir) { - return $source.$path; - } else { - return \dirname($source).'/'.$path; - } - } - - return null; - } -} diff --git a/tests/LegacyRedirectsTest.php b/tests/LegacyRedirectsTest.php deleted file mode 100644 index 825d079ef..000000000 --- a/tests/LegacyRedirectsTest.php +++ /dev/null @@ -1,57 +0,0 @@ - { - $ret = dict[]; - foreach ( - Guides::getGuidePageRedirects(GuidesProduct::HACK) as $guide => $pages - ) { - foreach ($pages as $page => $target) { - $old = Str\format('/%s/%s/%s', GuidesProduct::HACK, $guide, $page); - $ret[$old] = tuple( - $old, - self::getTargetURL(GuidesProduct::HACK, $target), - ); - } - } - foreach ( - Guides::getGuideRedirects(GuidesProduct::HACK) as $guide => $target - ) { - $target = self::getTargetURL(GuidesProduct::HACK, $target); - $old = Str\format('/%s/%s/', GuidesProduct::HACK, $guide); - $ret[$old] = tuple($old, $target); - $old = Str\format('/%s/%s/idonotexist', GuidesProduct::HACK, $guide); - $ret[$old] = tuple($old, $target); - } - return $ret; - } - - private static function getTargetURL( - GuidesProduct $product, - (string, ?string) $target, - ): string { - list($guide, $page) = $target; - $page ??= C\firstx(GuidesIndex::getPages($product, $guide)); - return Str\format('/%s/%s/%s', $product, $guide, $page); - } - - <> - public async function testGuideRedirects( - string $in, - string $target, - ): Awaitable { - list($response, $_body) = await PageLoader::getPageAsync($in); - expect($response->getStatusCode())->toBeSame(301); - $actual_target = $response->getHeaderLine('Location'); - expect($actual_target)->toBeSame($target); - list($response, $_) = await PageLoader::getPageAsync($actual_target); - expect($response->getStatusCode())->toBeSame(200); - } -} diff --git a/tests/OpenSearchTest.php b/tests/OpenSearchTest.php deleted file mode 100644 index 3bbfcc353..000000000 --- a/tests/OpenSearchTest.php +++ /dev/null @@ -1,60 +0,0 @@ -> - public async function testNoOpenSearchOnStaging(): Awaitable { - list($response, $body) = await PageLoader::getPageAsync( - 'https://staging.docs.hhvm.com/', - ); - expect($response->getStatusCode())->toBeSame(200); - expect($body) - ->toNotContainSubstring('application/opensearchdescription+xml'); - } - - <> - public async function testOpenSearchOnProd(): Awaitable { - list($response, $body) = await PageLoader::getPageAsync( - 'https://docs.hhvm.com/', - ); - expect($response->getStatusCode())->toBeSame(200); - expect($body)->toContainSubstring('application/opensearchdescription+xml'); - } - - public function jumpProvider(): dict { - return dict[ - 'Hack class without namespace' => tuple( - 'ResultOrExceptionWrapper', - '/hack/reference/interface/HH.Asio.ResultOrExceptionWrapper/', - ), - 'Hack class with namespace' => tuple( - 'HH\Asio\ResultOrExceptionWrapper', - '/hack/reference/interface/HH.Asio.ResultOrExceptionWrapper/', - ), - 'Hack class with bad capitalization' => tuple( - 'resultorexceptionwrapper', - '/hack/reference/interface/HH.Asio.ResultOrExceptionWrapper/', - ), - 'Search term' => tuple('=>foobar', '/search?term=%3D%3Efoobar'), - 'Special attribute' => - tuple('__memoize', '/hack/attributes/special#__memoize'), - ]; - } - - <> - public async function testJump(string $keyword, string $to): Awaitable { - $jump_url = '/j/'.$keyword; - - list($response, $_body) = await PageLoader::getPageAsync($jump_url); - expect($response->getStatusCode())->toBeSame(301); - - $target = $response->getHeaderLine('Location'); - expect($target)->toNotBeEmpty('no location header'); - - expect($target)->toBeSame($to); - } - -} diff --git a/tests/RobotsTxtTest.php b/tests/RobotsTxtTest.php deleted file mode 100644 index 81f558ccc..000000000 --- a/tests/RobotsTxtTest.php +++ /dev/null @@ -1,29 +0,0 @@ -> - public async function testMainDomainAllowsCrawling(): Awaitable { - list($_, $body) = await PageLoader::getPageAsync( - 'http://docs.hhvm.com/robots.txt', - ); - expect($body)->toBeSame( - \file_get_contents(RobotsTxtController::DEFAULT_FILE), - ); - } - - <> - public async function testStagingDoesNotAllowCrawling(): Awaitable { - list($_, $body) = await PageLoader::getPageAsync( - 'http://staging.docs.hhvm.com/robots.txt', - ); - expect($body)->toBeSame( - \file_get_contents(RobotsTxtController::DO_NOT_CRAWL_FILE), - ); - } -} diff --git a/tests/SearchTest.php b/tests/SearchTest.php deleted file mode 100644 index d29effb9f..000000000 --- a/tests/SearchTest.php +++ /dev/null @@ -1,65 +0,0 @@ -> - public async function testSearchTerm( - string $term, - vec $expected, - ): Awaitable { - list($response, $body) = await PageLoader::getPageAsync( - '/search?term='.\urlencode($term), - ); - expect($response->getStatusCode())->toBeSame(200); - foreach ($expected as $substr) { - expect($body)->toContainSubstring($substr); - } - } - - public function expectedResults(): vec<(string, vec)> { - return vec[ - tuple('vw', vec['/hack/reference/function/HH.Asio.vw/']), - tuple('HH\Asio\vw', vec['/hack/reference/function/HH.Asio.vw/']), - tuple('async', vec['/hack/asynchronous-operations/introduction']), - tuple( - 'string contains', - vec['HH\\Lib\\Str\\contains', 'HH\\Lib\\Str\\contains_ci'], - ), - tuple('vector contains', vec['HH\\Lib\\C\\contains']), - tuple('vector contains', vec['HH\\Lib\\C\\contains']), - tuple( - 'set contains', - vec['HH\\Lib\\C\\contains', 'HH\\Lib\\C\\contains_key'], - ), - tuple( - 'keyset contains', - vec['HH\\Lib\\C\\contains', 'HH\\Lib\\C\\contains_key'], - ), - tuple('reified', vec['/hack/reified-generics/reified-generics']), - tuple('arithmetic', vec['/hack/expressions-and-operators/arithmetic']), - tuple('type assertion', vec['/hack/expressions-and-operators/type-assertions']), - tuple('assignment', vec['/hack/expressions-and-operators/assignment']), - tuple('pipe', vec['/hack/expressions-and-operators/pipe']), - tuple('bitwise', vec['/hack/expressions-and-operators/bitwise-operators']), - tuple('coalesce', vec['hack/expressions-and-operators/coalesce']), - tuple('comparison', vec['/hack/expressions-and-operators/comparisons']), - tuple('concatenation', vec['/hack/expressions-and-operators/string-concatenation']), - tuple('equality', vec['/hack/expressions-and-operators/equality']), - tuple('suppress error', vec['/hack/expressions-and-operators/error-control']), - tuple('increment decrement', vec['/hack/expressions-and-operators/incrementing-and-decrementing']), - tuple('logical', vec['/hack/expressions-and-operators/logical-operators']), - tuple('objects properties methods', vec['/hack/expressions-and-operators/member-selection']), - tuple('precedence', vec['/hack/expressions-and-operators/operator-precedence']), - tuple('select scope resolution', vec['/hack/expressions-and-operators/scope-resolution']), - tuple('subscript', vec['/hack/expressions-and-operators/subscript']), - tuple('ternary', vec['/hack/expressions-and-operators/ternary']), - ]; - } -} diff --git a/tests/SpecialPagesTest.php b/tests/SpecialPagesTest.php deleted file mode 100644 index ad51724e8..000000000 --- a/tests/SpecialPagesTest.php +++ /dev/null @@ -1,110 +0,0 @@ - { - return vec[ - tuple('/_I_DO_NOT_EXIST_FOR_TESTING_'), - tuple('/manual/en/_I_DO_NOT_EXIST_FOR_TESTING_.php'), - tuple('/hack/reference/_BAD_DEFINITION_TYPE_FOR_TESTING_/'), - tuple('/hack/reference/class/_BAD_CLASS_NAME_FOR_TESTING_/'), - ]; - } - - <> - public async function testNotFoundPages(string $path): Awaitable { - list($response, $body) = await PageLoader::getPageAsync($path); - expect($response->getStatusCode())->toBeSame(404); - expect($body)->toContainSubstring("does not exist"); - } - - public function redirectProvider(): dict { - return dict[ - 'Hack class documentation' => tuple( - '/manual/en/class.hack.maptktv.php', - '/hack/reference/class/HH.Map/', - ), - 'Hack class moved to HH namespace' => - tuple('/hack/reference/class/Map/', '/hack/reference/class/HH.Map/'), - 'Method in Hack class moved to HH namespace' => tuple( - '/hack/reference/class/Map/filter/', - '/hack/reference/class/HH.Map/filter/', - ), - 'Hack interface reference with added namespace' => tuple( - '/manual/en/class.hack.iterabletv.php', - '/hack/reference/interface/HH.Iterable/', - ), - 'Hack function reference' => - tuple('/manual/en/hackfuncref.php', '/hack/reference/'), - 'Hack function reference with preserved namespace' => tuple( - '/manual/en/hack.asio.function.v.php', - '/hack/reference/function/HH.Asio.v/', - ), - 'Guide dir => first page of guide' => tuple( - '/hack/getting-started/', - '/hack/getting-started/getting-started', - ), - 'Beta redirect root' => - tuple('http://beta.docs.hhvm.com/', 'http://docs.hhvm.com/'), - 'Beta redirect page' => tuple( - 'http://beta.docs.hhvm.com/hack/reference/', - 'http://docs.hhvm.com/hack/reference/', - ), - 'Old Hack collection class overview' => tuple( - '/manual/en/hack.collections.vector.php', - '/hack/reference/class/Vector/', - ), - 'Missing trailing /' => - tuple('/hack/reference/class/HH.Map', '/hack/reference/class/HH.Map/'), - 'Case insensitive redirect' => - tuple('/manual/en/HaCk.LAMbda.php', '/hack/lambdas/introduction'), - 'HSL function with Hack product' => tuple( - '/hack/reference/function/HH.Lib.Str.length/', - '/hsl/reference/function/HH.Lib.Str.length/', - ), - ]; - } - - <> - public async function testRedirects( - string $from, - string $to, - ): Awaitable { - list($response, $_body) = await PageLoader::getPageAsync($from); - expect($response->getStatusCode())->toBeSame(301); - - $target = $response->getHeaderLine('Location'); - expect($target)->toNotBeEmpty('no location header'); - - expect($target)->toBeSame($to); - } - - <> - public async function testStaticResource404(): Awaitable { - list($response, $_body) = await PageLoader::getPageAsync( - '/s/deadbeef/notfound', - ); - expect($response->getStatusCode())->toBeSame(404); - } - - <> - public function notFoundSuggestions(): vec<(string, string)> { - return vec[ - tuple('/map', '/hack/reference/class/HH.Map/'), - tuple('/maptktv.filter', '/hack/reference/class/HH.Map/filter/'), - ]; - } - - <> - public async function testNotFoundSuggestion( - string $notfound, - string $suggestion, - ): Awaitable { - list($response, $body) = await PageLoader::getPageAsync($notfound); - expect($response->getStatusCode())->toBeSame(404); - expect($body)->toContainSubstring($suggestion); - } -} diff --git a/tests/lib/ExpectObj.php b/tests/lib/ExpectObj.php deleted file mode 100644 index a5ace6fdb..000000000 --- a/tests/lib/ExpectObj.php +++ /dev/null @@ -1,87 +0,0 @@ - extends \Facebook\FBExpect\ExpectObj { - public function __construct(private T $var) { - parent::__construct($var); - } - - public function toMatchExpectFile(string $file): void where T = string { - $this->toMatchFileWrapper( - () ==> { - expect(\file_get_contents($this->var))->toEqual( - \file_get_contents($file), - ); - }, - $file, - ); - } - - public function toMatchExpectregexFile(string $file): void where T = string { - $this->toMatchFileWrapper( - () ==> { - expect(\file_get_contents($this->var))->toMatchRegExp( - '/^'.\file_get_contents($file).'$/s', - ); - }, - $file, - ); - } - - public function toMatchExpectfFile(string $file): void where T = string { - // derived from hphp/test/run.php - $pattern = \file_get_contents($file) - |> Str\trim($$) - |> \preg_quote($$, '/') - |> Str\replace_every($$, dict[ - // Stick to basics. - '%e' => '\\'.\DIRECTORY_SEPARATOR, - '%s' => '[^\r\n]+', - '%S' => '[^\r\n]*', - '%a' => '.+', - '%A' => '.*', - '%w' => '\s*', - '%i' => '[+-]?\d+', - '%d' => '\d+', - '%x' => '[0-9a-fA-F]+', - // %f allows two points "-.0.0" but that is the best simple expression. - '%f' => '[+-]?\.?\d+\.?\d*(?:[Ee][+-]?\d+)?', - '%c' => '.', - // must be last. - '%%' => '%%?', - ]) - |> '/'.$$.'/'; - $this->toMatchFileWrapper( - () ==> { - expect(\file_get_contents($this->var))->toMatchRegExp($pattern); - }, - $file, - ); - } - - private function toMatchFileWrapper( - (function(): void) $impl, - string $expected_path, - ): void where T = string { - $actual_path = $this->var; - try { - $impl(); - } catch (ExpectationFailedException $_) { - $extension = C\lastx(Str\split($expected_path, '.')); - throw new ExpectationFailedException(Str\format( - "Actual data did not match expected data\n". - "----- ACTUAL ----\n Path: %s\n--\n%s\n". - "----- %s ----\n Path: %s\n--\n%s\n----- END -----", - $actual_path, - \file_get_contents($actual_path), - Str\uppercase($extension), - $expected_path, - \file_get_contents($expected_path), - )); - } - } -} diff --git a/tests/lib/LocalPageLoader.php b/tests/lib/LocalPageLoader.php deleted file mode 100644 index 66c443ee8..000000000 --- a/tests/lib/LocalPageLoader.php +++ /dev/null @@ -1,45 +0,0 @@ -> - protected async function getPageImplAsync( - string $url, - ): Awaitable<(ResponseInterface, string)> { - $query_params = darray[]; - $query_part = \parse_url($url, \PHP_URL_QUERY); - if ($query_part !== null) { - \parse_str($query_part, inout $query_params); - } - - $request = (new \Usox\HackTTP\ServerRequestFactory())->createServerRequest( - HTTPMethod::GET, - (new \Usox\HackTTP\UriFactory())->createUri($url), - dict[], - ) - ->withBody(File\open_read_only('/dev/null')) - ->withQueryParams(dict($query_params)); - $buffer_path = \sys_get_temp_dir().'/'.\bin2hex(\random_bytes(16)); - $write_handle = File\open_write_only( - $buffer_path, - File\WriteMode::MUST_CREATE, - ); - $response = (new \Usox\HackTTP\Response($write_handle)); - $response = await \HHVMDocumentationSite::getResponseForRequestAsync( - $request, - $response, - ); - $write_handle->close(); - $read_handle = File\open_read_only($buffer_path); - using $read_handle->closeWhenDisposed(); - $content = await $read_handle->readAllAsync(); - return tuple($response, $content); - } -} diff --git a/tests/lib/PageLoader.php b/tests/lib/PageLoader.php deleted file mode 100644 index 2d755e89f..000000000 --- a/tests/lib/PageLoader.php +++ /dev/null @@ -1,44 +0,0 @@ -> - public static function get(): PageLoader { - $host = self::getHost(); - if ($host === null) { - return new LocalPageLoader(); - } else { - return new RemotePageLoader(); - } - } - - public static function getPageAsync( - string $url, - ): Awaitable<(ResponseInterface, string)> { - return self::get()->getPageImplAsync($url); - } - - abstract protected function getPageImplAsync( - string $url, - ): Awaitable<(ResponseInterface, string)>; - - <<__Memoize>> - protected static function getHost(): ?string { - $host = \getenv('REMOTE_TEST_HOST'); - if ($host === false) { - return null; - } - return (string)$host; - } - - public static function assertLocal(): void { - // Work around sebastianbergmann/phpunit#2007 - invariant( - self::getHost() === null, - 'Local only test running against remote server', - ); - } -} diff --git a/tests/lib/RemotePageLoader.php b/tests/lib/RemotePageLoader.php deleted file mode 100644 index 55ec301eb..000000000 --- a/tests/lib/RemotePageLoader.php +++ /dev/null @@ -1,74 +0,0 @@ -> - protected async function getPageImplAsync( - string $url, - ): Awaitable<(ResponseInterface, string)> { - $host_header = \parse_url($url, \PHP_URL_HOST); - $scheme = \parse_url($url, \PHP_URL_SCHEME); - $path = \parse_url($url, \PHP_URL_PATH); - $query = \parse_url($url, \PHP_URL_QUERY); - - $test_host = TypeAssert\not_null(self::getHost()); - if ($scheme === null) { - switch ($test_host) { - case 'docs.hhvm.com': - case 'staging.docs.hhvm.com': - $scheme = 'https'; - break; - default: - $scheme = 'http'; - } - } - $url = $scheme.'://'.($host_header ?? $test_host).$path; - if ($query !== null) { - $url .= '?'.$query; - } - - $ch = \curl_init($url); - \curl_setopt($ch, \CURLOPT_HEADER, 1); - \curl_setopt($ch, \CURLOPT_RETURNTRANSFER, 1); - - \curl_setopt($ch, \CURLOPT_CONNECT_TO, vec['::'.$test_host.':']); - - $response = await \HH\Asio\curl_exec($ch); - $status = (int)\curl_getinfo($ch, \CURLINFO_HTTP_CODE); - - invariant($status !== 0, '%s', \curl_error($ch)); - - $header_size = \curl_getinfo($ch, \CURLINFO_HEADER_SIZE); - $header_blob = \substr($response, 0, $header_size); - $header_lines = \explode("\r\n", \trim($header_blob)); - \array_shift(inout $header_lines); // status code and http ver - - if ($header_size === \strlen($response)) { - $body = ''; - } else { - $body = \substr($response, $header_size); - } - - $response = new \Usox\HackTTP\Response( - File\open_write_only( - '/dev/null', - File\WriteMode::APPEND, - ), - $status, - ); - - foreach ($header_lines as $header_line) { - list($name, $value) = Str\split($header_line, ": "); - $response = $response->withAddedHeader($name, vec[$value]); - } - - return tuple($response, $body); - } -} diff --git a/tests/lib/expect.php b/tests/lib/expect.php deleted file mode 100644 index 5d24c1cda..000000000 --- a/tests/lib/expect.php +++ /dev/null @@ -1,7 +0,0 @@ -(T $in): ExpectObj { - return new ExpectObj($in); -} diff --git a/updating.md b/updating.md deleted file mode 100644 index 43dfae103..000000000 --- a/updating.md +++ /dev/null @@ -1,70 +0,0 @@ -# Updating to a new version of HHVM and the HSL - -First, switch to the version of HHVM that the documentation site is currently -targeting - you can check `composer.json` to check which this is. - -This is needed as the scripts to update the versions are written in Hack. - -To use the latest version of HHVM and the HSL: - -``` -$ bin/update-versions -``` - -The script will print out next steps; if you are changing the targeted HHVM -version, this will include upgrading your local HHVM. - -To use specific tags: - -``` -$ bin/update-versions --hhvm-tag=HHVM-a.b.c --hsl-tag=vx.y.z -``` - -See `bin/update-versions --help` for more options. - -# Updating to a new version of HHVM and the HSL from a Codespace - -First, ensure that your Codespace has a large enough machine type to perform -these upgrade operations. At minimum, a 16-core, 32GB machine is usually necessary. - -After, run `update-versions` to update the targetted HHVM version. -By default, the script uses the latest, publicly-available HHVM verison. - -``` -$ bin/update-versions -``` - -Next, add a commit, push your branch, and create a new Codespace. - -**Note:** Creating a new Codespace is necessary because, at this point, the version of HHVM running on the -Codespace and the targetted version of HHVM (for the upgrade) will be different. - -To check the active version on the machine, use this command: - -``` -$ hhvm --version -``` - -Next, from the project, update dependencies with: - -``` -$ php /usr/local/bin/composer update -``` - -Then, build the site again... - -``` -$ hhvm bin/build.php -``` - -... and restart the server... - -``` -$ hh_client restart -``` - -... and finish by invoking the test suite and fixing any issues caused by the upgrade. - -``` -$ hhvm vendor/bin/hacktest tests/ -``` diff --git a/variables.tf b/variables.tf new file mode 100644 index 000000000..85afb00a6 --- /dev/null +++ b/variables.tf @@ -0,0 +1,4 @@ +variable "container_image" { + type = string + description = "The Docker image to deploy. For example: hhvm/user-documentation:HHVM-4.154-2022-04-27-164b4ea" +}